]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
md/bitmap: tidy up i_writecount handling in md/bitmap
authorNeil Brown <neilb@suse.de>
Sat, 11 Aug 2007 23:09:29 +0000 (01:09 +0200)
committerAdrian Bunk <bunk@stusta.de>
Sat, 11 Aug 2007 23:09:29 +0000 (01:09 +0200)
md/bitmap modifies i_writecount of a bitmap file to make sure that no-one else
writes to it.  The reverting of the change is sometimes done twice, and there
is one error path where it is omitted.

This patch tidies that up.

Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Adrian Bunk <bunk@kernel.org>
drivers/md/bitmap.c
drivers/md/md.c

index bd345d34d53f64e4ba46233d8a360e1d1c7c6e46..2150693145fcba57468dd97736dfeae54279fef5 100644 (file)
@@ -641,7 +641,6 @@ static void drain_write_queues(struct bitmap *bitmap)
 static void bitmap_file_put(struct bitmap *bitmap)
 {
        struct file *file;
-       struct inode *inode;
        unsigned long flags;
 
        spin_lock_irqsave(&bitmap->lock, flags);
@@ -655,13 +654,8 @@ static void bitmap_file_put(struct bitmap *bitmap)
 
        bitmap_file_unmap(bitmap);
 
-       if (file) {
-               inode = file->f_mapping->host;
-               spin_lock(&inode->i_lock);
-               atomic_set(&inode->i_writecount, 1); /* allow writes again */
-               spin_unlock(&inode->i_lock);
+       if (file)
                fput(file);
-       }
 }
 
 
index 0d26b39e8a13f6b19e3c2645852b73db87982a86..22ca22c343c64fd68c108030403f9cefa752d741 100644 (file)
@@ -2644,6 +2644,32 @@ out:
        return err;
 }
 
+/* similar to deny_write_access, but accounts for our holding a reference
+ * to the file ourselves */
+static int deny_bitmap_write_access(struct file * file)
+{
+       struct inode *inode = file->f_mapping->host;
+
+       spin_lock(&inode->i_lock);
+       if (atomic_read(&inode->i_writecount) > 1) {
+               spin_unlock(&inode->i_lock);
+               return -ETXTBSY;
+       }
+       atomic_set(&inode->i_writecount, -1);
+       spin_unlock(&inode->i_lock);
+
+       return 0;
+}
+
+static void restore_bitmap_write_access(struct file *file)
+{
+       struct inode *inode = file->f_mapping->host;
+
+       spin_lock(&inode->i_lock);
+       atomic_set(&inode->i_writecount, 1);
+       spin_unlock(&inode->i_lock);
+}
+
 static int do_md_stop(mddev_t * mddev, int ro)
 {
        int err = 0;
@@ -2705,7 +2731,7 @@ static int do_md_stop(mddev_t * mddev, int ro)
 
                bitmap_destroy(mddev);
                if (mddev->bitmap_file) {
-                       atomic_set(&mddev->bitmap_file->f_dentry->d_inode->i_writecount, 1);
+                       restore_bitmap_write_access(mddev->bitmap_file);
                        fput(mddev->bitmap_file);
                        mddev->bitmap_file = NULL;
                }
@@ -3299,23 +3325,6 @@ abort_export:
        return err;
 }
 
-/* similar to deny_write_access, but accounts for our holding a reference
- * to the file ourselves */
-static int deny_bitmap_write_access(struct file * file)
-{
-       struct inode *inode = file->f_mapping->host;
-
-       spin_lock(&inode->i_lock);
-       if (atomic_read(&inode->i_writecount) > 1) {
-               spin_unlock(&inode->i_lock);
-               return -ETXTBSY;
-       }
-       atomic_set(&inode->i_writecount, -1);
-       spin_unlock(&inode->i_lock);
-
-       return 0;
-}
-
 static int set_bitmap_file(mddev_t *mddev, int fd)
 {
        int err;
@@ -3363,8 +3372,10 @@ static int set_bitmap_file(mddev_t *mddev, int fd)
                mddev->pers->quiesce(mddev, 0);
        }
        if (fd < 0) {
-               if (mddev->bitmap_file)
+               if (mddev->bitmap_file) {
+                       restore_bitmap_write_access(mddev->bitmap_file);
                        fput(mddev->bitmap_file);
+               }
                mddev->bitmap_file = NULL;
        }