Re: open_dev_excl in reshape_container() fails
flat view
From: NeilBrown <hidden>
Date: 2011-01-17 04:07:34
On Fri, 14 Jan 2011 10:36:04 +0000 "Kwolek, Adam" [off-list ref] wrote:
Hi, I think I've found problem root cause. As I'm working on "Online Capacity Expansion", my tests uses mounted arrays - this is in conflict with open_dev_ext() and fails this function. Evrything is ok This means that reshape operation cannot be performed online (or this is valid on my system only?). I do not know why on begin (in main() of mdadm.c) this function can succeed and later not (later system blocks array ?). More, when I've made some open_dev_exe()+close() earlier, it works later also (please look used code below/treat patch as demo/). Summarizing problem is related to mounted arrays only.
Thanks. I see what is wrong - it is OK to open containers exclusively, but not arrays - as you say, that could be mounted. I have applied your original patch to change open_dev_excl to open_dev now that I understand what the issue is.. Thanks, NeilBrown
quoted hunk ↗ jump to hunk
BR Adamquoted
From cf545d2ffb906096da89aff7b1a5c5830221cc4a Mon Sep 17 00:00:00 2001From: Adam Kwolek <redacted> Date: Fri, 14 Jan 2011 11:11:19 +0100 Subject: [PATCH] ADK: open workaround 2 Signed-off-by: Adam Kwolek <redacted> --- Grow.c | 17 +++++++++++++++++ mdadm.c | 11 +++++++++++ 2 files changed, 28 insertions(+), 0 deletions(-)diff --git a/Grow.c b/Grow.c index 763287b..3b37f97 100644 --- a/Grow.c +++ b/Grow.c@@ -1285,6 +1285,10 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, struct mdinfo info; struct mdinfo *sra; +//adk + int fd_test = open_dev_excl(126); + if (fd_test >= 0) + close(fd_test); if (ioctl(fd, GET_ARRAY_INFO, &array) < 0) { fprintf(stderr, Name ": %s is not an active md array - aborting\n",@@ -1319,6 +1323,10 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, " beyond %d\n", st->max_devs); return 1; } +//adk + fd_test = open_dev_excl(126); + if (fd_test >= 0) + close(fd_test); /* in the external case we need to check that the requested reshape is * supported, and perform an initial check that the container holds the@@ -1394,6 +1402,10 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, " be reshaped\n", devname); return 1; } +//adk + fd_test = open_dev_excl(126); + if (fd_test >= 0) + close(fd_test); /* ========= set size =============== */ if (size >= 0 && (size == 0 || size != array.size)) {@@ -1462,6 +1474,10 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, goto release; } } +//adk + fd_test = open_dev_excl(126); + if (fd_test >= 0) + close(fd_test); info.array = array; sysfs_init(&info, fd, NoMdDev);@@ -1545,6 +1561,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, * number of devices (On-Line Capacity Expansion) must be * performed at the level of the container */ + rv = reshape_container(container, fd, devname, st, &info, force, backup_file, quiet); frozen = 0;diff --git a/mdadm.c b/mdadm.c index 2ffe94f..bc9d34e 100644 --- a/mdadm.c +++ b/mdadm.c@@ -127,6 +127,7 @@ int main(int argc, char *argv[]) ident.name[0] = 0; ident.container = NULL; ident.member = NULL; +//adk - can open while ((option_index = -1) , (opt=getopt_long(argc, argv,@@ -134,6 +135,11 @@ int main(int argc, char *argv[]) &option_index)) != -1) { int newmode = mode; /* firstly, some mode-independent options */ +//adk + int fd_test = open_dev_excl(126); + if (fd_test >= 0) + close(fd_test); + switch(opt) { case HelpOptions: print_help = 2;@@ -1115,6 +1121,11 @@ int main(int argc, char *argv[]) exit(2); } if (mode == MANAGE || mode == GROW) { +//adk + int fd_test = open_dev_excl(126); + if (fd_test >= 0) + close(fd_test); + mdfd = open_mddev(devlist->devname, 1); if (mdfd < 0) exit(1);