aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/md.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index bddecc01c333..72c44d337ee2 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -5851,22 +5851,24 @@ static int set_bitmap_file(struct mddev *mddev, int fd)
5851 5851
5852 if (fd >= 0) { 5852 if (fd >= 0) {
5853 struct inode *inode; 5853 struct inode *inode;
5854 if (mddev->bitmap) 5854 struct file *f;
5855
5856 if (mddev->bitmap || mddev->bitmap_info.file)
5855 return -EEXIST; /* cannot add when bitmap is present */ 5857 return -EEXIST; /* cannot add when bitmap is present */
5856 mddev->bitmap_info.file = fget(fd); 5858 f = fget(fd);
5857 5859
5858 if (mddev->bitmap_info.file == NULL) { 5860 if (f == NULL) {
5859 printk(KERN_ERR "%s: error: failed to get bitmap file\n", 5861 printk(KERN_ERR "%s: error: failed to get bitmap file\n",
5860 mdname(mddev)); 5862 mdname(mddev));
5861 return -EBADF; 5863 return -EBADF;
5862 } 5864 }
5863 5865
5864 inode = mddev->bitmap_info.file->f_mapping->host; 5866 inode = f->f_mapping->host;
5865 if (!S_ISREG(inode->i_mode)) { 5867 if (!S_ISREG(inode->i_mode)) {
5866 printk(KERN_ERR "%s: error: bitmap file must be a regular file\n", 5868 printk(KERN_ERR "%s: error: bitmap file must be a regular file\n",
5867 mdname(mddev)); 5869 mdname(mddev));
5868 err = -EBADF; 5870 err = -EBADF;
5869 } else if (!(mddev->bitmap_info.file->f_mode & FMODE_WRITE)) { 5871 } else if (!(f->f_mode & FMODE_WRITE)) {
5870 printk(KERN_ERR "%s: error: bitmap file must open for write\n", 5872 printk(KERN_ERR "%s: error: bitmap file must open for write\n",
5871 mdname(mddev)); 5873 mdname(mddev));
5872 err = -EBADF; 5874 err = -EBADF;
@@ -5876,10 +5878,10 @@ static int set_bitmap_file(struct mddev *mddev, int fd)
5876 err = -EBUSY; 5878 err = -EBUSY;
5877 } 5879 }
5878 if (err) { 5880 if (err) {
5879 fput(mddev->bitmap_info.file); 5881 fput(f);
5880 mddev->bitmap_info.file = NULL;
5881 return err; 5882 return err;
5882 } 5883 }
5884 mddev->bitmap_info.file = f;
5883 mddev->bitmap_info.offset = 0; /* file overrides offset */ 5885 mddev->bitmap_info.offset = 0; /* file overrides offset */
5884 } else if (mddev->bitmap == NULL) 5886 } else if (mddev->bitmap == NULL)
5885 return -ENOENT; /* cannot remove what isn't there */ 5887 return -ENOENT; /* cannot remove what isn't there */