diff options
author | Benjamin Coddington <bcodding@redhat.com> | 2017-07-21 20:36:25 +0300 |
---|---|---|
committer | Jeff Layton <jlayton@redhat.com> | 2017-07-21 20:57:31 +0300 |
commit | 3953704fde7ec47f452ce6446fb7a0d5dc2f74df (patch) | |
tree | 8d7594335a5942ef8b280e14cafa5a999aa3fab8 /fs/locks.c | |
parent | 9d5b86ac13c573795525ecac6ed2db39ab23e2a8 (diff) | |
download | linux-3953704fde7ec47f452ce6446fb7a0d5dc2f74df.tar.xz |
locks: restore a warn for leaked locks on close
When locks.c moved to using file_lock_context, the check for any locks that
were not released was moved from the __fput() to destroy_inode() path in
commit 8634b51f6ca2 ("locks: convert lease handling to file_lock_context").
This warning has been quite useful for catching bugs, particularly in NFS
where lock handling still sees some churn.
Let's bring back the warning for leaked locks on __fput, as this warning is
much more likely to be seen and reported by users.
Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Diffstat (limited to 'fs/locks.c')
-rw-r--r-- | fs/locks.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/fs/locks.c b/fs/locks.c index 6d0949880ebd..1bd71c4d663a 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -271,6 +271,22 @@ locks_check_ctx_lists(struct inode *inode) } } +static void +locks_check_ctx_file_list(struct file *filp, struct list_head *list, + char *list_type) +{ + struct file_lock *fl; + struct inode *inode = locks_inode(filp); + + list_for_each_entry(fl, list, fl_list) + if (fl->fl_file == filp) + pr_warn("Leaked %s lock on dev=0x%x:0x%x ino=0x%lx " + " fl_owner=%p fl_flags=0x%x fl_type=0x%x fl_pid=%u\n", + list_type, MAJOR(inode->i_sb->s_dev), + MINOR(inode->i_sb->s_dev), inode->i_ino, + fl->fl_owner, fl->fl_flags, fl->fl_type, fl->fl_pid); +} + void locks_free_lock_context(struct inode *inode) { @@ -2549,6 +2565,12 @@ void locks_remove_file(struct file *filp) /* remove any leases */ locks_remove_lease(filp, ctx); + + spin_lock(&ctx->flc_lock); + locks_check_ctx_file_list(filp, &ctx->flc_posix, "POSIX"); + locks_check_ctx_file_list(filp, &ctx->flc_flock, "FLOCK"); + locks_check_ctx_file_list(filp, &ctx->flc_lease, "LEASE"); + spin_unlock(&ctx->flc_lock); } /** |