diff options
author | Benjamin Coddington <bcodding@redhat.com> | 2017-07-21 13:36:25 -0400 |
---|---|---|
committer | Jeff Layton <jlayton@redhat.com> | 2017-07-21 13:57:31 -0400 |
commit | 3953704fde7ec47f452ce6446fb7a0d5dc2f74df (patch) | |
tree | 8d7594335a5942ef8b280e14cafa5a999aa3fab8 | |
parent | 9d5b86ac13c573795525ecac6ed2db39ab23e2a8 (diff) |
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>
-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) | |||
271 | } | 271 | } |
272 | } | 272 | } |
273 | 273 | ||
274 | static void | ||
275 | locks_check_ctx_file_list(struct file *filp, struct list_head *list, | ||
276 | char *list_type) | ||
277 | { | ||
278 | struct file_lock *fl; | ||
279 | struct inode *inode = locks_inode(filp); | ||
280 | |||
281 | list_for_each_entry(fl, list, fl_list) | ||
282 | if (fl->fl_file == filp) | ||
283 | pr_warn("Leaked %s lock on dev=0x%x:0x%x ino=0x%lx " | ||
284 | " fl_owner=%p fl_flags=0x%x fl_type=0x%x fl_pid=%u\n", | ||
285 | list_type, MAJOR(inode->i_sb->s_dev), | ||
286 | MINOR(inode->i_sb->s_dev), inode->i_ino, | ||
287 | fl->fl_owner, fl->fl_flags, fl->fl_type, fl->fl_pid); | ||
288 | } | ||
289 | |||
274 | void | 290 | void |
275 | locks_free_lock_context(struct inode *inode) | 291 | locks_free_lock_context(struct inode *inode) |
276 | { | 292 | { |
@@ -2549,6 +2565,12 @@ void locks_remove_file(struct file *filp) | |||
2549 | 2565 | ||
2550 | /* remove any leases */ | 2566 | /* remove any leases */ |
2551 | locks_remove_lease(filp, ctx); | 2567 | locks_remove_lease(filp, ctx); |
2568 | |||
2569 | spin_lock(&ctx->flc_lock); | ||
2570 | locks_check_ctx_file_list(filp, &ctx->flc_posix, "POSIX"); | ||
2571 | locks_check_ctx_file_list(filp, &ctx->flc_flock, "FLOCK"); | ||
2572 | locks_check_ctx_file_list(filp, &ctx->flc_lease, "LEASE"); | ||
2573 | spin_unlock(&ctx->flc_lock); | ||
2552 | } | 2574 | } |
2553 | 2575 | ||
2554 | /** | 2576 | /** |