]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Grow: open backup file for reshape as function
authorAdam Kwolek <adam.kwolek@intel.com>
Fri, 3 Dec 2010 04:00:16 +0000 (15:00 +1100)
committerNeilBrown <neilb@suse.de>
Fri, 3 Dec 2010 04:00:16 +0000 (15:00 +1100)
Move opening backup file to the function for future reuse during
container reshape.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c
mdadm.h

diff --git a/Grow.c b/Grow.c
index 6e88d6d1914e975a4d42324e7ec42d7784033743..c408a92a6fbb839c62dfebf5620526b550c99cc1 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -914,6 +914,61 @@ release:
        return d;
 }
 
+int reshape_open_backup_file(char *backup_file,
+                            int fd,
+                            char *devname,
+                            long blocks,
+                            int *fdlist,
+                            unsigned long long *offsets)
+{
+       /* Return 1 on success, 0 on any form of failure */
+       /* need to check backup file is large enough */
+       char buf[512];
+       struct stat stb;
+       unsigned int dev;
+       int i;
+
+       *fdlist = open(backup_file, O_RDWR|O_CREAT|O_EXCL,
+                      S_IRUSR | S_IWUSR);
+       *offsets = 8 * 512;
+       if (*fdlist < 0) {
+               fprintf(stderr, Name ": %s: cannot create backup file %s: %s\n",
+                       devname, backup_file, strerror(errno));
+               return 0;
+       }
+       /* Guard against backup file being on array device.
+        * If array is partitioned or if LVM etc is in the
+        * way this will not notice, but it is better than
+        * nothing.
+        */
+       fstat(*fdlist, &stb);
+       dev = stb.st_dev;
+       fstat(fd, &stb);
+       if (stb.st_rdev == dev) {
+               fprintf(stderr, Name ": backup file must NOT be"
+                       " on the array being reshaped.\n");
+               close(*fdlist);
+               return 0;
+       }
+
+       memset(buf, 0, 512);
+       for (i=0; i < blocks + 1 ; i++) {
+               if (write(*fdlist, buf, 512) != 512) {
+                       fprintf(stderr, Name ": %s: cannot create"
+                               " backup file %s: %s\n",
+                               devname, backup_file, strerror(errno));
+                       return 0;
+               }
+       }
+       if (fsync(*fdlist) != 0) {
+               fprintf(stderr, Name ": %s: cannot create backup file %s: %s\n",
+                       devname, backup_file, strerror(errno));
+               return 0;
+       }
+
+       return 1;
+}
+
 unsigned long compute_backup_blocks(int nchunk, int ochunk,
                                    unsigned int ndata, unsigned int odata)
 {
@@ -974,7 +1029,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
        char alt_layout[40];
        int *fdlist;
        unsigned long long *offsets;
-       int d, i;
+       int d;
        int nrdisks;
        int err;
        int frozen;
@@ -1649,47 +1704,9 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                                break;
                        }
                } else {
-                       /* need to check backup file is large enough */
-                       char buf[512];
-                       struct stat stb;
-                       unsigned int dev;
-                       fdlist[d] = open(backup_file, O_RDWR|O_CREAT|O_EXCL,
-                                    S_IRUSR | S_IWUSR);
-                       offsets[d] = 8 * 512;
-                       if (fdlist[d] < 0) {
-                               fprintf(stderr, Name ": %s: cannot create backup file %s: %s\n",
-                                       devname, backup_file, strerror(errno));
-                               rv = 1;
-                               break;
-                       }
-                       /* Guard against backup file being on array device.
-                        * If array is partitioned or if LVM etc is in the
-                        * way this will not notice, but it is better than
-                        * nothing.
-                        */
-                       fstat(fdlist[d], &stb);
-                       dev = stb.st_dev;
-                       fstat(fd, &stb);
-                       if (stb.st_rdev == dev) {
-                               fprintf(stderr, Name ": backup file must NOT be"
-                                       " on the array being reshaped.\n");
-                               rv = 1;
-                               close(fdlist[d]);
-                               break;
-                       }
-
-                       memset(buf, 0, 512);
-                       for (i=0; i < (signed)blocks + 1 ; i++) {
-                               if (write(fdlist[d], buf, 512) != 512) {
-                                       fprintf(stderr, Name ": %s: cannot create backup file %s: %s\n",
-                                               devname, backup_file, strerror(errno));
-                                       rv = 1;
-                                       break;
-                               }
-                       }
-                       if (fsync(fdlist[d]) != 0) {
-                               fprintf(stderr, Name ": %s: cannot create backup file %s: %s\n",
-                                       devname, backup_file, strerror(errno));
+                       if (!reshape_open_backup_file(backup_file, fd, devname,
+                                                     (signed)blocks,
+                                                     fdlist+d, offsets+d)) {
                                rv = 1;
                                break;
                        }
diff --git a/mdadm.h b/mdadm.h
index a0126eb5cc3993c87144daf99a96b483fa4a1831..175d228bf85bec53a9dc2537ad485485259ef752 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -486,7 +486,12 @@ extern int reshape_prepare_fdlist(char *devname,
 extern void reshape_free_fdlist(int *fdlist,
                                unsigned long long *offsets,
                                int size);
-
+extern int reshape_open_backup_file(char *backup,
+                                   int fd,
+                                   char *devname,
+                                   long blocks,
+                                   int *fdlist,
+                                   unsigned long long *offsets);
 extern unsigned long compute_backup_blocks(int nchunk, int ochunk,
                                           unsigned int ndata, unsigned int odata);