Merge tag 'staging-3.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[firefly-linux-kernel-4.4.55.git] / fs / ceph / dir.c
index 2a0bcaeb189acd18b124aff8d54619667fd97bf2..6da4df84ba300824a8a6afdea9f2a20121600765 100644 (file)
@@ -693,6 +693,10 @@ static int ceph_mknod(struct inode *dir, struct dentry *dentry,
        if (!err && !req->r_reply_info.head->is_dentry)
                err = ceph_handle_notrace_create(dir, dentry);
        ceph_mdsc_put_request(req);
+
+       if (!err)
+               err = ceph_init_acl(dentry, dentry->d_inode, dir);
+
        if (err)
                d_drop(dentry);
        return err;
@@ -1037,14 +1041,19 @@ static int ceph_d_revalidate(struct dentry *dentry, unsigned int flags)
                valid = 1;
        } else if (dentry_lease_is_valid(dentry) ||
                   dir_lease_is_valid(dir, dentry)) {
-               valid = 1;
+               if (dentry->d_inode)
+                       valid = ceph_is_any_caps(dentry->d_inode);
+               else
+                       valid = 1;
        }
 
        dout("d_revalidate %p %s\n", dentry, valid ? "valid" : "invalid");
-       if (valid)
+       if (valid) {
                ceph_dentry_lru_touch(dentry);
-       else
+       } else {
+               ceph_dir_clear_complete(dir);
                d_drop(dentry);
+       }
        iput(dir);
        return valid;
 }
@@ -1293,6 +1302,8 @@ const struct inode_operations ceph_dir_iops = {
        .getxattr = ceph_getxattr,
        .listxattr = ceph_listxattr,
        .removexattr = ceph_removexattr,
+       .get_acl = ceph_get_acl,
+       .set_acl = ceph_set_acl,
        .mknod = ceph_mknod,
        .symlink = ceph_symlink,
        .mkdir = ceph_mkdir,