aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nilfs2/the_nilfs.h
diff options
context:
space:
mode:
authorRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>2009-06-07 12:39:32 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2009-06-11 21:36:18 -0400
commite59399d0102c1813cec48db5cebe1750313f88a0 (patch)
treecd4fde6b5c442ede5d00b9640d3a545f847aeb8c /fs/nilfs2/the_nilfs.h
parent6dd4740662405a68bb229ac2b9e0aeaaf2188bf2 (diff)
nilfs2: correct exclusion control in nilfs_remount function
nilfs_remount() changes mount state of a superblock instance. Even though nilfs accesses other superblock instances during mount or remount, the mount state was not properly protected in nilfs_remount(). Moreover, nilfs_remount() has a lock order reversal problem; nilfs_get_sb() holds: 1. bdev->bd_mount_sem 2. sb->s_umount (sget acquires) and nilfs_remount() holds: 1. sb->s_umount (locked by the caller in vfs) 2. bdev->bd_mount_sem To avoid these problems, this patch divides a semaphore protecting super block instances from nilfs->ns_sem, and applies it to the mount state protection in nilfs_remount(). With this change, bd_mount_sem use is removed from nilfs_remount() and the lock order reversal will be resolved. And the new rw-semaphore, nilfs->ns_super_sem will properly protect the mount state except the modification from nilfs_error function. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/nilfs2/the_nilfs.h')
-rw-r--r--fs/nilfs2/the_nilfs.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/nilfs2/the_nilfs.h b/fs/nilfs2/the_nilfs.h
index be4c040fd629..d0cf4fb7c9ce 100644
--- a/fs/nilfs2/the_nilfs.h
+++ b/fs/nilfs2/the_nilfs.h
@@ -48,6 +48,7 @@ enum {
48 * @ns_bdi: backing dev info 48 * @ns_bdi: backing dev info
49 * @ns_writer: back pointer to writable nilfs_sb_info 49 * @ns_writer: back pointer to writable nilfs_sb_info
50 * @ns_sem: semaphore for shared states 50 * @ns_sem: semaphore for shared states
51 * @ns_super_sem: semaphore for global operations across super block instances
51 * @ns_writer_mutex: mutex protecting ns_writer attach/detach 52 * @ns_writer_mutex: mutex protecting ns_writer attach/detach
52 * @ns_writer_refcount: number of referrers on ns_writer 53 * @ns_writer_refcount: number of referrers on ns_writer
53 * @ns_current: back pointer to current mount 54 * @ns_current: back pointer to current mount
@@ -96,10 +97,15 @@ struct the_nilfs {
96 struct backing_dev_info *ns_bdi; 97 struct backing_dev_info *ns_bdi;
97 struct nilfs_sb_info *ns_writer; 98 struct nilfs_sb_info *ns_writer;
98 struct rw_semaphore ns_sem; 99 struct rw_semaphore ns_sem;
100 struct rw_semaphore ns_super_sem;
99 struct mutex ns_writer_mutex; 101 struct mutex ns_writer_mutex;
100 atomic_t ns_writer_refcount; 102 atomic_t ns_writer_refcount;
101 103
104 /*
105 * components protected by ns_super_sem
106 */
102 struct nilfs_sb_info *ns_current; 107 struct nilfs_sb_info *ns_current;
108 struct list_head ns_supers;
103 109
104 /* 110 /*
105 * used for 111 * used for
@@ -113,7 +119,6 @@ struct the_nilfs {
113 time_t ns_sbwtime[2]; 119 time_t ns_sbwtime[2];
114 unsigned ns_sbsize; 120 unsigned ns_sbsize;
115 unsigned ns_mount_state; 121 unsigned ns_mount_state;
116 struct list_head ns_supers;
117 122
118 /* 123 /*
119 * Following fields are dedicated to a writable FS-instance. 124 * Following fields are dedicated to a writable FS-instance.