ceph: use atomic_t for ceph_inode_info::i_shared_gen
authorYan, Zheng <zyan@redhat.com>
Mon, 27 Nov 2017 02:47:46 +0000 (10:47 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 29 Jan 2018 17:36:07 +0000 (18:36 +0100)
It allows accessing i_shared_gen without holding i_ceph_lock. It is
preparation for later patch.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Acked-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/caps.c
fs/ceph/dir.c
fs/ceph/inode.c
fs/ceph/super.h

index 029cab7..57120e3 100644 (file)
@@ -498,7 +498,7 @@ static void __check_cap_issue(struct ceph_inode_info *ci, struct ceph_cap *cap,
         */
        if ((issued & CEPH_CAP_FILE_SHARED) != (had & CEPH_CAP_FILE_SHARED)) {
                if (issued & CEPH_CAP_FILE_SHARED)
-                       ci->i_shared_gen++;
+                       atomic_inc(&ci->i_shared_gen);
                if (S_ISDIR(ci->vfs_inode.i_mode)) {
                        dout(" marking %p NOT complete\n", &ci->vfs_inode);
                        __ceph_dir_clear_complete(ci);
index 64afa46..d671d58 100644 (file)
@@ -173,7 +173,7 @@ __dcache_find_get_entry(struct dentry *parent, u64 idx,
  * the MDS if/when the directory is modified).
  */
 static int __dcache_readdir(struct file *file,  struct dir_context *ctx,
-                           u32 shared_gen)
+                           int shared_gen)
 {
        struct ceph_file_info *fi = file->private_data;
        struct dentry *parent = file->f_path.dentry;
@@ -184,7 +184,7 @@ static int __dcache_readdir(struct file *file,  struct dir_context *ctx,
        u64 idx = 0;
        int err = 0;
 
-       dout("__dcache_readdir %p v%u at %llx\n", dir, shared_gen, ctx->pos);
+       dout("__dcache_readdir %p v%u at %llx\n", dir, (unsigned)shared_gen, ctx->pos);
 
        /* search start position */
        if (ctx->pos > 2) {
@@ -333,7 +333,7 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx)
            ceph_snap(inode) != CEPH_SNAPDIR &&
            __ceph_dir_is_complete_ordered(ci) &&
            __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1)) {
-               u32 shared_gen = ci->i_shared_gen;
+               int shared_gen = atomic_read(&ci->i_shared_gen);
                spin_unlock(&ci->i_ceph_lock);
                err = __dcache_readdir(file, ctx, shared_gen);
                if (err != -EAGAIN)
@@ -751,7 +751,7 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry,
                        spin_unlock(&ci->i_ceph_lock);
                        dout(" dir %p complete, -ENOENT\n", dir);
                        d_add(dentry, NULL);
-                       di->lease_shared_gen = ci->i_shared_gen;
+                       di->lease_shared_gen = atomic_read(&ci->i_shared_gen);
                        return NULL;
                }
                spin_unlock(&ci->i_ceph_lock);
@@ -1191,12 +1191,12 @@ static int dir_lease_is_valid(struct inode *dir, struct dentry *dentry)
        int valid = 0;
 
        spin_lock(&ci->i_ceph_lock);
-       if (ci->i_shared_gen == di->lease_shared_gen)
+       if (atomic_read(&ci->i_shared_gen) == di->lease_shared_gen)
                valid = __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1);
        spin_unlock(&ci->i_ceph_lock);
        dout("dir_lease_is_valid dir %p v%u dentry %p v%u = %d\n",
-            dir, (unsigned)ci->i_shared_gen, dentry,
-            (unsigned)di->lease_shared_gen, valid);
+            dir, (unsigned)atomic_read(&ci->i_shared_gen),
+            dentry, (unsigned)di->lease_shared_gen, valid);
        return valid;
 }
 
index 666ad10..6d02528 100644 (file)
@@ -494,7 +494,7 @@ struct inode *ceph_alloc_inode(struct super_block *sb)
        ci->i_wrbuffer_ref = 0;
        ci->i_wrbuffer_ref_head = 0;
        atomic_set(&ci->i_filelock_ref, 0);
-       ci->i_shared_gen = 0;
+       atomic_set(&ci->i_shared_gen, 0);
        ci->i_rdcache_gen = 0;
        ci->i_rdcache_revoking = 0;
 
@@ -1041,7 +1041,7 @@ static void update_dentry_lease(struct dentry *dentry,
        if (ceph_snap(dir) != CEPH_NOSNAP)
                goto out_unlock;
 
-       di->lease_shared_gen = ceph_inode(dir)->i_shared_gen;
+       di->lease_shared_gen = atomic_read(&ceph_inode(dir)->i_shared_gen);
 
        if (duration == 0)
                goto out_unlock;
index 2beeec0..75701c1 100644 (file)
@@ -256,7 +256,8 @@ struct ceph_inode_xattr {
  */
 struct ceph_dentry_info {
        struct ceph_mds_session *lease_session;
-       u32 lease_gen, lease_shared_gen;
+       int lease_shared_gen;
+       u32 lease_gen;
        u32 lease_seq;
        unsigned long lease_renew_after, lease_renew_from;
        struct list_head lru;
@@ -353,7 +354,7 @@ struct ceph_inode_info {
        int i_rd_ref, i_rdcache_ref, i_wr_ref, i_wb_ref;
        int i_wrbuffer_ref, i_wrbuffer_ref_head;
        atomic_t i_filelock_ref;
-       u32 i_shared_gen;       /* increment each time we get FILE_SHARED */
+       atomic_t i_shared_gen;       /* increment each time we get FILE_SHARED */
        u32 i_rdcache_gen;      /* incremented each time we get FILE_CACHE. */
        u32 i_rdcache_revoking; /* RDCACHE gen to async invalidate, if any */