writeback: enforce s_umount locking in writeback_inodes_sb
authorChristoph Hellwig <hch@lst.de>
Tue, 8 Jun 2010 16:14:51 +0000 (18:14 +0200)
committerJens Axboe <jaxboe@fusionio.com>
Fri, 11 Jun 2010 10:58:07 +0000 (12:58 +0200)
Make sure that not only sync_filesystem but all callers of writeback_inodes_sb
have the superblock protected against remount.  As-is this disables all
functionality for these callers, but the next patch relies on this locking to
fix writeback_inodes_sb for sync_filesystem.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
fs/fs-writeback.c
fs/ubifs/budget.c

index 759666966c6dca572c5d304d322fe40b132a261f..2627f0dfcd9c798243e31daa402e6d4bd37a7cf0 100644 (file)
@@ -1180,6 +1180,8 @@ void writeback_inodes_sb(struct super_block *sb)
                .sync_mode      = WB_SYNC_NONE,
        };
 
+       WARN_ON(!rwsem_is_locked(&sb->s_umount));
+
        args.nr_pages = nr_dirty + nr_unstable +
                        (inodes_stat.nr_inodes - inodes_stat.nr_unused);
 
@@ -1197,7 +1199,9 @@ EXPORT_SYMBOL(writeback_inodes_sb);
 int writeback_inodes_sb_if_idle(struct super_block *sb)
 {
        if (!writeback_in_progress(sb->s_bdi)) {
+               down_read(&sb->s_umount);
                writeback_inodes_sb(sb);
+               up_read(&sb->s_umount);
                return 1;
        } else
                return 0;
@@ -1220,6 +1224,8 @@ void sync_inodes_sb(struct super_block *sb)
                .range_cyclic   = 0,
        };
 
+       WARN_ON(!rwsem_is_locked(&sb->s_umount));
+
        bdi_queue_work_onstack(&args);
        wait_sb_inodes(sb);
 }
index 076ca50e99336fad10e256ddc3d103ae93fd527a..c8ff0d1ae5d3e04f7f14d8a8b63df33a87b16a35 100644 (file)
@@ -62,7 +62,9 @@
  */
 static void shrink_liability(struct ubifs_info *c, int nr_to_write)
 {
+       down_read(&c->vfs_sb->s_umount);
        writeback_inodes_sb(c->vfs_sb);
+       up_read(&c->vfs_sb->s_umount);
 }
 
 /**