ceph: use ceph_sb_to_client instead of ceph_client
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / ceph / inode.c
index 26f883c275e85e6746f23884015d08777cbff95d..ef917232cf370ba883abf98b2f130aeaa05110ec 100644 (file)
@@ -384,7 +384,7 @@ void ceph_destroy_inode(struct inode *inode)
         */
        if (ci->i_snap_realm) {
                struct ceph_mds_client *mdsc =
-                       &ceph_client(ci->vfs_inode.i_sb)->mdsc;
+                       &ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc;
                struct ceph_snap_realm *realm = ci->i_snap_realm;
 
                dout(" dropping residual ref to snap realm %p\n", realm);
@@ -623,7 +623,7 @@ static int fill_inode(struct inode *inode,
 
        inode->i_mapping->a_ops = &ceph_aops;
        inode->i_mapping->backing_dev_info =
-               &ceph_client(inode->i_sb)->backing_dev_info;
+               &ceph_sb_to_client(inode->i_sb)->backing_dev_info;
 
        switch (inode->i_mode & S_IFMT) {
        case S_IFIFO:
@@ -681,7 +681,7 @@ static int fill_inode(struct inode *inode,
                }
 
                /* it may be better to set st_size in getattr instead? */
-               if (ceph_test_opt(ceph_client(inode->i_sb), RBYTES))
+               if (ceph_test_opt(ceph_sb_to_client(inode->i_sb), RBYTES))
                        inode->i_size = ci->i_rbytes;
                break;
        default:
@@ -733,6 +733,10 @@ no_change:
                                __ceph_get_fmode(ci, cap_fmode);
                        spin_unlock(&inode->i_lock);
                }
+       } else if (cap_fmode >= 0) {
+               pr_warning("mds issued no caps on %llx.%llx\n",
+                          ceph_vinop(inode));
+               __ceph_get_fmode(ci, cap_fmode);
        }
 
        /* update delegation info? */
@@ -934,8 +938,15 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                                ceph_inode(req->r_locked_dir);
                        dout(" clearing %p complete (empty trace)\n",
                             req->r_locked_dir);
+                       spin_lock(&req->r_locked_dir->i_lock);
                        ci->i_ceph_flags &= ~CEPH_I_COMPLETE;
                        ci->i_release_count++;
+                       spin_unlock(&req->r_locked_dir->i_lock);
+
+                       if (req->r_dentry)
+                               ceph_invalidate_dentry_lease(req->r_dentry);
+                       if (req->r_old_dentry)
+                               ceph_invalidate_dentry_lease(req->r_old_dentry);
                }
                return 0;
        }
@@ -997,19 +1008,25 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                             dn, dn->d_name.len, dn->d_name.name);
                        dout("fill_trace doing d_move %p -> %p\n",
                             req->r_old_dentry, dn);
+
+                       /* d_move screws up d_subdirs order */
+                       ceph_i_clear(dir, CEPH_I_COMPLETE);
+
                        d_move(req->r_old_dentry, dn);
                        dout(" src %p '%.*s' dst %p '%.*s'\n",
                             req->r_old_dentry,
                             req->r_old_dentry->d_name.len,
                             req->r_old_dentry->d_name.name,
                             dn, dn->d_name.len, dn->d_name.name);
+
                        /* ensure target dentry is invalidated, despite
                           rehashing bug in vfs_rename_dir */
-                       dn->d_time = jiffies;
-                       ceph_dentry(dn)->lease_shared_gen = 0;
+                       ceph_invalidate_dentry_lease(dn);
+
                        /* take overwritten dentry's readdir offset */
                        ceph_dentry(req->r_old_dentry)->offset =
                                ceph_dentry(dn)->offset;
+
                        dn = req->r_old_dentry;  /* use old_dentry */
                        in = dn->d_inode;
                }
@@ -1421,7 +1438,7 @@ void ceph_queue_vmtruncate(struct inode *inode)
 {
        struct ceph_inode_info *ci = ceph_inode(inode);
 
-       if (queue_work(ceph_client(inode->i_sb)->trunc_wq,
+       if (queue_work(ceph_sb_to_client(inode->i_sb)->trunc_wq,
                       &ci->i_vmtruncate_work)) {
                dout("ceph_queue_vmtruncate %p\n", inode);
                igrab(inode);
@@ -1510,7 +1527,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr)
        struct inode *parent_inode = dentry->d_parent->d_inode;
        const unsigned int ia_valid = attr->ia_valid;
        struct ceph_mds_request *req;
-       struct ceph_mds_client *mdsc = &ceph_client(dentry->d_sb)->mdsc;
+       struct ceph_mds_client *mdsc = &ceph_sb_to_client(dentry->d_sb)->mdsc;
        int issued;
        int release = 0, dirtied = 0;
        int mask = 0;