ceph: unify dentry_operations instances
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 29 Oct 2016 01:52:50 +0000 (21:52 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 29 Oct 2016 01:52:50 +0000 (21:52 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/ceph/dir.c
fs/ceph/inode.c
fs/ceph/super.c
fs/ceph/super.h

index 78180d1517307ee7b88dd000d162d7e197b19267..80f5339d097bdaa5af28719534f5db172b179ded 100644 (file)
@@ -50,13 +50,6 @@ int ceph_init_dentry(struct dentry *dentry)
                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;
@@ -1319,16 +1312,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.
@@ -1347,6 +1330,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
@@ -1518,13 +1504,3 @@ const struct dentry_operations ceph_dentry_ops = {
        .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,
-};
index bca1b49c1c4b1bc8d2f83e4389a48c1f107de661..29fcbee2d41608a2a3a12bdb0b75a7a67a98df55 100644 (file)
@@ -1023,16 +1023,17 @@ static void update_dentry_lease(struct dentry *dentry,
        long unsigned half_ttl = from_time + (duration * HZ / 2) / 1000;
        struct inode *dir;
 
-       /* only track leases on regular dentries */
-       if (dentry->d_op != &ceph_dentry_ops)
-               return;
-
        spin_lock(&dentry->d_lock);
        dout("update_dentry_lease %p duration %lu ms ttl %lu\n",
             dentry, duration, ttl);
 
        /* make lease_rdcache_gen match directory */
        dir = d_inode(dentry->d_parent);
+
+       /* only track leases on regular dentries */
+       if (ceph_snap(dir) != CEPH_NOSNAP)
+               goto out_unlock;
+
        di->lease_shared_gen = ceph_inode(dir)->i_shared_gen;
 
        if (duration == 0)
index a29ffce981879d5fe46f3858ee90c2fd840f98c1..0617580b2508a9bb99b28a996fe323a70a36fef0 100644 (file)
@@ -877,6 +877,7 @@ static int ceph_set_super(struct super_block *s, void *data)
        fsc->sb = s;
 
        s->s_op = &ceph_super_ops;
+       s->s_d_op = &ceph_dentry_ops;
        s->s_export_op = &ceph_export_ops;
 
        s->s_time_gran = 1000;  /* 1000 ns == 1 us */
index 3e3fa916305968e837fa02ae473efe63b8f366d6..26a5a5d6bf362a270f2b190f68c04e2404aed789 100644 (file)
@@ -934,8 +934,7 @@ extern const struct file_operations ceph_dir_fops;
 extern const struct file_operations ceph_snapdir_fops;
 extern const struct inode_operations ceph_dir_iops;
 extern const struct inode_operations ceph_snapdir_iops;
-extern const struct dentry_operations ceph_dentry_ops, ceph_snap_dentry_ops,
-       ceph_snapdir_dentry_ops;
+extern const struct dentry_operations ceph_dentry_ops;
 
 extern loff_t ceph_make_fpos(unsigned high, unsigned off, bool hash_order);
 extern int ceph_handle_notrace_create(struct inode *dir, struct dentry *dentry);