diff options
author | Arnd Bergmann <arnd@arndb.de> | 2010-10-26 16:55:40 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2010-10-27 15:39:39 -0400 |
commit | 763641d81202834e9d64de2019d1edec12868f4f (patch) | |
tree | cabbf932e3f6676bfbce6be27744795700011bfb /fs/lockd/svcsubs.c | |
parent | f9ba5375a8aae4aeea6be15df77e24707a429812 (diff) |
lockd: push lock_flocks down
lockd should use lock_flocks() instead of lock_kernel()
to lock against posix locks accessing the i_flock list.
This is a prerequisite to turning lock_flocks into a
spinlock.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/lockd/svcsubs.c')
-rw-r--r-- | fs/lockd/svcsubs.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c index d0ef94cfb3da..1ca0679c80bf 100644 --- a/fs/lockd/svcsubs.c +++ b/fs/lockd/svcsubs.c | |||
@@ -170,6 +170,7 @@ nlm_traverse_locks(struct nlm_host *host, struct nlm_file *file, | |||
170 | 170 | ||
171 | again: | 171 | again: |
172 | file->f_locks = 0; | 172 | file->f_locks = 0; |
173 | lock_flocks(); /* protects i_flock list */ | ||
173 | for (fl = inode->i_flock; fl; fl = fl->fl_next) { | 174 | for (fl = inode->i_flock; fl; fl = fl->fl_next) { |
174 | if (fl->fl_lmops != &nlmsvc_lock_operations) | 175 | if (fl->fl_lmops != &nlmsvc_lock_operations) |
175 | continue; | 176 | continue; |
@@ -181,6 +182,7 @@ again: | |||
181 | if (match(lockhost, host)) { | 182 | if (match(lockhost, host)) { |
182 | struct file_lock lock = *fl; | 183 | struct file_lock lock = *fl; |
183 | 184 | ||
185 | unlock_flocks(); | ||
184 | lock.fl_type = F_UNLCK; | 186 | lock.fl_type = F_UNLCK; |
185 | lock.fl_start = 0; | 187 | lock.fl_start = 0; |
186 | lock.fl_end = OFFSET_MAX; | 188 | lock.fl_end = OFFSET_MAX; |
@@ -192,6 +194,7 @@ again: | |||
192 | goto again; | 194 | goto again; |
193 | } | 195 | } |
194 | } | 196 | } |
197 | unlock_flocks(); | ||
195 | 198 | ||
196 | return 0; | 199 | return 0; |
197 | } | 200 | } |
@@ -226,10 +229,14 @@ nlm_file_inuse(struct nlm_file *file) | |||
226 | if (file->f_count || !list_empty(&file->f_blocks) || file->f_shares) | 229 | if (file->f_count || !list_empty(&file->f_blocks) || file->f_shares) |
227 | return 1; | 230 | return 1; |
228 | 231 | ||
232 | lock_flocks(); | ||
229 | for (fl = inode->i_flock; fl; fl = fl->fl_next) { | 233 | for (fl = inode->i_flock; fl; fl = fl->fl_next) { |
230 | if (fl->fl_lmops == &nlmsvc_lock_operations) | 234 | if (fl->fl_lmops == &nlmsvc_lock_operations) { |
235 | unlock_flocks(); | ||
231 | return 1; | 236 | return 1; |
237 | } | ||
232 | } | 238 | } |
239 | unlock_flocks(); | ||
233 | file->f_locks = 0; | 240 | file->f_locks = 0; |
234 | return 0; | 241 | return 0; |
235 | } | 242 | } |