writeback: enforce s_umount locking in writeback_inodes_sb
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>
This commit is contained in:
parent
3c4d716538
commit
cf37e97247
|
@ -1180,6 +1180,8 @@ void writeback_inodes_sb(struct super_block *sb)
|
||||||
.sync_mode = WB_SYNC_NONE,
|
.sync_mode = WB_SYNC_NONE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
WARN_ON(!rwsem_is_locked(&sb->s_umount));
|
||||||
|
|
||||||
args.nr_pages = nr_dirty + nr_unstable +
|
args.nr_pages = nr_dirty + nr_unstable +
|
||||||
(inodes_stat.nr_inodes - inodes_stat.nr_unused);
|
(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)
|
int writeback_inodes_sb_if_idle(struct super_block *sb)
|
||||||
{
|
{
|
||||||
if (!writeback_in_progress(sb->s_bdi)) {
|
if (!writeback_in_progress(sb->s_bdi)) {
|
||||||
|
down_read(&sb->s_umount);
|
||||||
writeback_inodes_sb(sb);
|
writeback_inodes_sb(sb);
|
||||||
|
up_read(&sb->s_umount);
|
||||||
return 1;
|
return 1;
|
||||||
} else
|
} else
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1220,6 +1224,8 @@ void sync_inodes_sb(struct super_block *sb)
|
||||||
.range_cyclic = 0,
|
.range_cyclic = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
WARN_ON(!rwsem_is_locked(&sb->s_umount));
|
||||||
|
|
||||||
bdi_queue_work_onstack(&args);
|
bdi_queue_work_onstack(&args);
|
||||||
wait_sb_inodes(sb);
|
wait_sb_inodes(sb);
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,9 @@
|
||||||
*/
|
*/
|
||||||
static void shrink_liability(struct ubifs_info *c, int nr_to_write)
|
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);
|
writeback_inodes_sb(c->vfs_sb);
|
||||||
|
up_read(&c->vfs_sb->s_umount);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue