Message ID | 20170603062009.GI6365@ZenIV.linux.org.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Jun 2, 2017 at 11:20 PM, Al Viro <viro@zeniv.linux.org.uk> wrote: > The thing is, unlike shrink_dcache_parent() we *can* bugger off as > soon as we'd found no victims, nothing mounted and dentry itself > is unhashed. We can't do anything in select_collect() (we would've > broken shrink_dcache_parent() that way), but we can do unhashing > in check_and_drop() in "really nothing to do" case and we can return > from d_invalidate() after that. So how about this: That does the trick.
On Fri, Jun 2, 2017 at 11:47 PM, Khazhismel Kumykov <khazhy@google.com> wrote: > On Fri, Jun 2, 2017 at 11:20 PM, Al Viro <viro@zeniv.linux.org.uk> wrote: >> The thing is, unlike shrink_dcache_parent() we *can* bugger off as >> soon as we'd found no victims, nothing mounted and dentry itself >> is unhashed. We can't do anything in select_collect() (we would've >> broken shrink_dcache_parent() that way), but we can do unhashing >> in check_and_drop() in "really nothing to do" case and we can return >> from d_invalidate() after that. So how about this: > That does the trick. I'm not entirely familiar the process here, is the above change committed somewhere, should I propose a patch?
On Mon, Jun 12, 2017 at 04:00:45PM -0700, Khazhismel Kumykov wrote: > On Fri, Jun 2, 2017 at 11:47 PM, Khazhismel Kumykov <khazhy@google.com> wrote: > > On Fri, Jun 2, 2017 at 11:20 PM, Al Viro <viro@zeniv.linux.org.uk> wrote: > >> The thing is, unlike shrink_dcache_parent() we *can* bugger off as > >> soon as we'd found no victims, nothing mounted and dentry itself > >> is unhashed. We can't do anything in select_collect() (we would've > >> broken shrink_dcache_parent() that way), but we can do unhashing > >> in check_and_drop() in "really nothing to do" case and we can return > >> from d_invalidate() after that. So how about this: > > That does the trick. > > I'm not entirely familiar the process here, is the above change > committed somewhere, should I propose a patch? Sorry, got distracted by other stuff; I'll push that today.
diff --git a/fs/dcache.c b/fs/dcache.c index cddf39777835..a9f995f6859e 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -1494,7 +1494,7 @@ static void check_and_drop(void *_data) { struct detach_data *data = _data; - if (!data->mountpoint && !data->select.found) + if (!data->mountpoint && list_empty(&data->select.dispose)) __d_drop(data->select.start); } @@ -1536,17 +1536,15 @@ void d_invalidate(struct dentry *dentry) d_walk(dentry, &data, detach_and_collect, check_and_drop); - if (data.select.found) + if (!list_empty(&data.select.dispose)) shrink_dentry_list(&data.select.dispose); + else if (!data.mountpoint) + return; if (data.mountpoint) { detach_mounts(data.mountpoint); dput(data.mountpoint); } - - if (!data.mountpoint && !data.select.found) - break; - cond_resched(); } }