Skip to content

Commit 32c53e2

Browse files
darkrain42smb49
authored andcommitted
smb: Log an error when close_all_cached_dirs fails
BugLink: https://bugs.launchpad.net/bugs/2120812 commit a2182743a8b4969481f64aec4908ff162e8a206c upstream. Under low-memory conditions, close_all_cached_dirs() can't move the dentries to a separate list to dput() them once the locks are dropped. This will result in a "Dentry still in use" error, so add an error message that makes it clear this is what happened: [ 495.281119] CIFS: VFS: \\otters.example.com\share Out of memory while dropping dentries [ 495.281595] ------------[ cut here ]------------ [ 495.281887] BUG: Dentry ffff888115531138{i=78,n=/} still in use (2) [unmount of cifs cifs] [ 495.282391] WARNING: CPU: 1 PID: 2329 at fs/dcache.c:1536 umount_check+0xc8/0xf0 Also, bail out of looping through all tcons as soon as a single allocation fails, since we're already in trouble, and kmalloc() attempts for subseqeuent tcons are likely to fail just like the first one did. Signed-off-by: Paul Aurich <paul@darkrain42.org> Acked-by: Bharath SM <bharathsm@microsoft.com> Suggested-by: Ruben Devos <rdevos@oxya.com> Cc: stable@vger.kernel.org Signed-off-by: Steve French <stfrench@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Noah Wager <noah.wager@canonical.com> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
1 parent 60eb40a commit 32c53e2

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

fs/smb/client/cached_dir.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -486,8 +486,17 @@ void close_all_cached_dirs(struct cifs_sb_info *cifs_sb)
486486
spin_lock(&cfids->cfid_list_lock);
487487
list_for_each_entry(cfid, &cfids->entries, entry) {
488488
tmp_list = kmalloc(sizeof(*tmp_list), GFP_ATOMIC);
489-
if (tmp_list == NULL)
490-
break;
489+
if (tmp_list == NULL) {
490+
/*
491+
* If the malloc() fails, we won't drop all
492+
* dentries, and unmounting is likely to trigger
493+
* a 'Dentry still in use' error.
494+
*/
495+
cifs_tcon_dbg(VFS, "Out of memory while dropping dentries\n");
496+
spin_unlock(&cfids->cfid_list_lock);
497+
spin_unlock(&cifs_sb->tlink_tree_lock);
498+
goto done;
499+
}
491500
spin_lock(&cfid->fid_lock);
492501
tmp_list->dentry = cfid->dentry;
493502
cfid->dentry = NULL;
@@ -499,6 +508,7 @@ void close_all_cached_dirs(struct cifs_sb_info *cifs_sb)
499508
}
500509
spin_unlock(&cifs_sb->tlink_tree_lock);
501510

511+
done:
502512
list_for_each_entry_safe(tmp_list, q, &entry, entry) {
503513
list_del(&tmp_list->entry);
504514
dput(tmp_list->dentry);

0 commit comments

Comments
 (0)