]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - fs/ceph/dir.c
Merge branch 'for-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
[mirror_ubuntu-artful-kernel.git] / fs / ceph / dir.c
index a594c7879cc245a764afb945e37de2b908482951..8ab1fdf0bd49b74f380a578aea92ce738393403d 100644 (file)
@@ -32,40 +32,19 @@ const struct dentry_operations ceph_dentry_ops;
 /*
  * Initialize ceph dentry state.
  */
-int ceph_init_dentry(struct dentry *dentry)
+static int ceph_d_init(struct dentry *dentry)
 {
        struct ceph_dentry_info *di;
 
-       if (dentry->d_fsdata)
-               return 0;
-
        di = kmem_cache_zalloc(ceph_dentry_cachep, GFP_KERNEL);
        if (!di)
                return -ENOMEM;          /* oh well */
 
-       spin_lock(&dentry->d_lock);
-       if (dentry->d_fsdata) {
-               /* lost a race */
-               kmem_cache_free(ceph_dentry_cachep, di);
-               goto out_unlock;
-       }
-
-       if (ceph_snap(d_inode(dentry->d_parent)) == CEPH_NOSNAP)
-               d_set_d_op(dentry, &ceph_dentry_ops);
-       else if (ceph_snap(d_inode(dentry->d_parent)) == CEPH_SNAPDIR)
-               d_set_d_op(dentry, &ceph_snapdir_dentry_ops);
-       else
-               d_set_d_op(dentry, &ceph_snap_dentry_ops);
-
        di->dentry = dentry;
        di->lease_session = NULL;
        di->time = jiffies;
-       /* avoid reordering d_fsdata setup so that the check above is safe */
-       smp_mb();
        dentry->d_fsdata = di;
        ceph_dentry_lru_add(dentry);
-out_unlock:
-       spin_unlock(&dentry->d_lock);
        return 0;
 }
 
@@ -737,10 +716,6 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry,
        if (dentry->d_name.len > NAME_MAX)
                return ERR_PTR(-ENAMETOOLONG);
 
-       err = ceph_init_dentry(dentry);
-       if (err < 0)
-               return ERR_PTR(err);
-
        /* can we conclude ENOENT locally? */
        if (d_really_is_negative(dentry)) {
                struct ceph_inode_info *ci = ceph_inode(dir);
@@ -1255,7 +1230,8 @@ static int ceph_d_revalidate(struct dentry *dentry, unsigned int flags)
                struct ceph_mds_client *mdsc =
                        ceph_sb_to_client(dir->i_sb)->mdsc;
                struct ceph_mds_request *req;
-               int op, mask, err;
+               int op, err;
+               u32 mask;
 
                if (flags & LOOKUP_RCU)
                        return -ECHILD;
@@ -1270,7 +1246,7 @@ static int ceph_d_revalidate(struct dentry *dentry, unsigned int flags)
                        mask = CEPH_STAT_CAP_INODE | CEPH_CAP_AUTH_SHARED;
                        if (ceph_security_xattr_wanted(dir))
                                mask |= CEPH_CAP_XATTR_SHARED;
-                       req->r_args.getattr.mask = mask;
+                       req->r_args.getattr.mask = cpu_to_le32(mask);
 
                        err = ceph_mdsc_do_request(mdsc, NULL, req);
                        switch (err) {
@@ -1323,16 +1299,6 @@ static void ceph_d_release(struct dentry *dentry)
        kmem_cache_free(ceph_dentry_cachep, di);
 }
 
-static int ceph_snapdir_d_revalidate(struct dentry *dentry,
-                                         unsigned int flags)
-{
-       /*
-        * Eventually, we'll want to revalidate snapped metadata
-        * too... probably...
-        */
-       return 1;
-}
-
 /*
  * When the VFS prunes a dentry from the cache, we need to clear the
  * complete flag on the parent directory.
@@ -1351,6 +1317,9 @@ static void ceph_d_prune(struct dentry *dentry)
        if (d_unhashed(dentry))
                return;
 
+       if (ceph_snap(d_inode(dentry->d_parent)) == CEPH_SNAPDIR)
+               return;
+
        /*
         * we hold d_lock, so d_parent is stable, and d_fsdata is never
         * cleared until d_release
@@ -1521,14 +1490,5 @@ const struct dentry_operations ceph_dentry_ops = {
        .d_revalidate = ceph_d_revalidate,
        .d_release = ceph_d_release,
        .d_prune = ceph_d_prune,
-};
-
-const struct dentry_operations ceph_snapdir_dentry_ops = {
-       .d_revalidate = ceph_snapdir_d_revalidate,
-       .d_release = ceph_d_release,
-};
-
-const struct dentry_operations ceph_snap_dentry_ops = {
-       .d_release = ceph_d_release,
-       .d_prune = ceph_d_prune,
+       .d_init = ceph_d_init,
 };