diff options
-rw-r--r-- | drivers/md/md.c | 16 |
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 */ |