diff options
author | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2009-06-07 12:39:32 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2009-06-11 21:36:18 -0400 |
commit | e59399d0102c1813cec48db5cebe1750313f88a0 (patch) | |
tree | cd4fde6b5c442ede5d00b9640d3a545f847aeb8c /fs/nilfs2/the_nilfs.h | |
parent | 6dd4740662405a68bb229ac2b9e0aeaaf2188bf2 (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.h | 7 |
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. |