diff options
author | Yan, Zheng <zyan@redhat.com> | 2015-03-27 02:34:20 (GMT) |
---|---|---|
committer | Jeff Layton <jeff.layton@primarydata.com> | 2015-03-27 11:18:20 (GMT) |
commit | a901125c65544aa05c52e1a7388c3900e8af105f (patch) | |
tree | 7fffcbe51519876521a175597428ca7e6e64c0b1 | |
parent | 3c435c1e472ba344ee25f795f4807d4457e61f6c (diff) | |
download | linux-a901125c65544aa05c52e1a7388c3900e8af105f.tar.xz |
locks: fix file_lock deletion inside loop
locks_delete_lock_ctx() is called inside the loop, so we
should use list_for_each_entry_safe.
Fixes: 8634b51f6ca2 (locks: convert lease handling to file_lock_context)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
-rw-r--r-- | fs/locks.c | 5 |
1 files changed, 2 insertions, 3 deletions
@@ -1388,9 +1388,8 @@ any_leases_conflict(struct inode *inode, struct file_lock *breaker) int __break_lease(struct inode *inode, unsigned int mode, unsigned int type) { int error = 0; - struct file_lock *new_fl; struct file_lock_context *ctx = inode->i_flctx; - struct file_lock *fl; + struct file_lock *new_fl, *fl, *tmp; unsigned long break_time; int want_write = (mode & O_ACCMODE) != O_RDONLY; LIST_HEAD(dispose); @@ -1420,7 +1419,7 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type) break_time++; /* so that 0 means no break time */ } - list_for_each_entry(fl, &ctx->flc_lease, fl_list) { + list_for_each_entry_safe(fl, tmp, &ctx->flc_lease, fl_list) { if (!leases_conflict(fl, new_fl)) continue; if (want_write) { |