diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2014-05-01 10:30:00 -0400 |
---|---|---|
committer | Jiri Slaby <jslaby@suse.cz> | 2014-10-30 22:17:35 +0100 |
commit | 11662c7b4621457dd0fccd3bba23a4d9cee2f722 (patch) | |
tree | a35bf98289718fb5873e11b168093afe11d325ee /include | |
parent | 1be1a028ca20541434bf93ae5961480e34974f05 (diff) |
dentry_kill(): don't try to remove from shrink list
commit 41edf278fc2f042f4e22a12ed87d19c5201210e1 upstream.
If the victim in on the shrink list, don't remove it from there.
If shrink_dentry_list() manages to remove it from the list before
we are done - fine, we'll just free it as usual. If not - mark
it with new flag (DCACHE_MAY_FREE) and leave it there.
Eventually, shrink_dentry_list() will get to it, remove the sucker
from shrink list and call dentry_kill(dentry, 0). Which is where
we'll deal with freeing.
Since now dentry_kill(dentry, 0) may happen after or during
dentry_kill(dentry, 1), we need to recognize that (by seeing
DCACHE_DENTRY_KILLED already set), unlock everything
and either free the sucker (in case DCACHE_MAY_FREE has been
set) or leave it for ongoing dentry_kill(dentry, 1) to deal with.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/dcache.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 59066e0b4ff1..cbde0540d4dd 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -211,6 +211,8 @@ struct dentry_operations { #define DCACHE_LRU_LIST 0x80000 #define DCACHE_DENTRY_KILLED 0x100000 +#define DCACHE_MAY_FREE 0x00800000 + extern seqlock_t rename_lock; static inline int dname_external(const struct dentry *dentry) |