summaryrefslogtreecommitdiffstats
path: root/fs/locks.c
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2015-03-27 10:34:20 +0800
committerJeff Layton <jeff.layton@primarydata.com>2015-03-27 07:18:20 -0400
commita901125c65544aa05c52e1a7388c3900e8af105f (patch)
tree7fffcbe51519876521a175597428ca7e6e64c0b1 /fs/locks.c
parent3c435c1e472ba344ee25f795f4807d4457e61f6c (diff)
downloadlinux-a901125c65544aa05c52e1a7388c3900e8af105f.tar.gz
linux-a901125c65544aa05c52e1a7388c3900e8af105f.tar.bz2
linux-a901125c65544aa05c52e1a7388c3900e8af105f.zip
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>
Diffstat (limited to 'fs/locks.c')
-rw-r--r--fs/locks.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/fs/locks.c b/fs/locks.c
index 528fedfda15e..40bc384728c0 100644
--- a/fs/locks.c
+++ b/fs/locks.c
@@ -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) {