md: tidy up set_bitmap_file
authorNeilBrown <neilb@suse.de>
Mon, 15 Dec 2014 01:57:00 +0000 (12:57 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 5 Feb 2015 22:32:56 +0000 (09:32 +1100)
1/ delay setting mddev->bitmap_info.file until 'f' looks
   usable, so we don't have to unset it.
2/ Don't allow bitmap file to be set if bitmap_info.file
   is already set.

Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/md.c

index bddecc01c33390bc9c86670221cb001b513989be..72c44d337ee20dda3c3a41351ecbf23a8804e7dd 100644 (file)
@@ -5851,22 +5851,24 @@ static int set_bitmap_file(struct mddev *mddev, int fd)
 
        if (fd >= 0) {
                struct inode *inode;
-               if (mddev->bitmap)
+               struct file *f;
+
+               if (mddev->bitmap || mddev->bitmap_info.file)
                        return -EEXIST; /* cannot add when bitmap is present */
-               mddev->bitmap_info.file = fget(fd);
+               f = fget(fd);
 
-               if (mddev->bitmap_info.file == NULL) {
+               if (f == NULL) {
                        printk(KERN_ERR "%s: error: failed to get bitmap file\n",
                               mdname(mddev));
                        return -EBADF;
                }
 
-               inode = mddev->bitmap_info.file->f_mapping->host;
+               inode = f->f_mapping->host;
                if (!S_ISREG(inode->i_mode)) {
                        printk(KERN_ERR "%s: error: bitmap file must be a regular file\n",
                               mdname(mddev));
                        err = -EBADF;
-               } else if (!(mddev->bitmap_info.file->f_mode & FMODE_WRITE)) {
+               } else if (!(f->f_mode & FMODE_WRITE)) {
                        printk(KERN_ERR "%s: error: bitmap file must open for write\n",
                               mdname(mddev));
                        err = -EBADF;
@@ -5876,10 +5878,10 @@ static int set_bitmap_file(struct mddev *mddev, int fd)
                        err = -EBUSY;
                }
                if (err) {
-                       fput(mddev->bitmap_info.file);
-                       mddev->bitmap_info.file = NULL;
+                       fput(f);
                        return err;
                }
+               mddev->bitmap_info.file = f;
                mddev->bitmap_info.offset = 0; /* file overrides offset */
        } else if (mddev->bitmap == NULL)
                return -ENOENT; /* cannot remove what isn't there */