The commit is pushed to "branch-rh7-3.10.0-514.26.1.vz7.33.x-ovz" and will 
appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-514.26.1.vz7.33.10
------>
commit fdc960cf07f7244efd8a065d3546be5f657496ca
Author: Maxim Patlasov <[email protected]>
Date:   Tue Jul 18 18:19:30 2017 +0400

    fuse: revert Dcache is always invalid
    
    The patch reverts 4ae1fa01a5d865c3a96e0753be26b1d874f25827 initially
    sent by Pavel Emelyanov three years ago with description:
    
    > The existing behavior -- a dentry is valid for some time period. Then
    > revalidation in the userpsace is required. This is wrong for PCS, since
    > dentry effectively becomes invalid once a file is closed, i.e. -- always.
    
    This justification above does not look reasonable anymore because, as AK
    pointed out:
    
    > What's about correctness of the statement, it is even formally wrong.
    > No matter how frequently you invalidate, the file can disappear right
    > after lookup, so that full disable of dcache is meaningless.
    
    The policy must be set by fused. Currently it always gives entry_valid=0
    ensuring that behavior stays the same with or without 4ae1..5827. But the
    policy is going to change in near future to support usecases of directories
    with > 100000 entries. Hence reverting 4ae1..5827 is required: otherwise 
fused
    won't be able to utilize readdirplus.
    
    Signed-off-by: Alexey Kuznetsov <[email protected]>
    Signed-off-by: Maxim Patlasov <[email protected]>
---
 fs/fuse/dir.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index 1d41bfe..68e09f9 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -187,7 +187,8 @@ static int fuse_dentry_revalidate(struct dentry *entry, 
unsigned int flags)
        inode = ACCESS_ONCE(entry->d_inode);
        if (inode && is_bad_inode(inode))
                goto invalid;
-       else if (1) {
+       else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) ||
+                (flags & LOOKUP_REVAL)) {
                int err;
                struct fuse_entry_out outarg;
                struct fuse_req *req;
@@ -245,6 +246,13 @@ static int fuse_dentry_revalidate(struct dentry *entry, 
unsigned int flags)
                                       entry_attr_timeout(&outarg),
                                       attr_version);
                fuse_change_entry_timeout(entry, &outarg);
+       } else if (inode) {
+               fc = get_fuse_conn(inode);
+               if (fc->readdirplus_auto) {
+                       parent = dget_parent(entry);
+                       fuse_advise_use_readdirplus(parent->d_inode);
+                       dput(parent);
+               }
        }
        ret = 1;
 out:
_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to