]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: do rename d_move in ceph_fill_trace
authorSage Weil <sage@newdream.net>
Mon, 7 Apr 2008 16:54:42 +0000 (09:54 -0700)
committerSage Weil <sage@newdream.net>
Mon, 7 Apr 2008 16:54:42 +0000 (09:54 -0700)
src/kernel/dir.c
src/kernel/inode.c
src/kernel/mds_client.c
src/kernel/mds_client.h
src/kernel/super.c

index e9ed828b0c8494ae5fd9298c31808edf700260d9..69e4380de147bdb00429f0bf771b4ab1216a7830 100644 (file)
@@ -483,6 +483,10 @@ static int ceph_dir_rename(struct inode *old_dir, struct dentry *old_dentry,
        kfree(newpath);
        if (IS_ERR(req))
                return PTR_ERR(req);
+       dget(old_dentry);
+       req->r_old_dentry = old_dentry;
+       dget(new_dentry);
+       req->r_last_dentry = new_dentry;
        ceph_mdsc_lease_release(mdsc, old_dir, old_dentry, 
                                CEPH_LOCK_DN|CEPH_LOCK_ICONTENT);
        if (new_dentry->d_inode)
index a370cc3fded3f51cbe9a989109d0e1a8ac85cc7a..eddd620bddda322c080e5f8db21e4157d165df37 100644 (file)
@@ -437,12 +437,16 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                
                /* dentry */
                ininfo = rinfo->trace_in[d+1].in;
-               if (d == rinfo->trace_numd-1 &&
-                   req->r_last_dentry) {
+               if (d == rinfo->trace_numd-1 && req->r_last_dentry) {
                        dout(10, "fill_trace using provided dentry\n");
                        dn = req->r_last_dentry;
                        ceph_init_dentry(dn);  /* just in case */
                        req->r_last_dentry = NULL;
+                       if (req->r_old_dentry) {
+                               dout(10, "fill_trace doing d_move %p -> %p\n",
+                                    req->r_old_dentry, dn);
+                               d_move(req->r_old_dentry, dn);
+                       }
                } else {
                        dname.name = rinfo->trace_dname[d];
                        dname.len = rinfo->trace_dname_len[d];
@@ -469,8 +473,9 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                                ceph_init_dentry(dn);
                        }
                }
-               ceph_update_dentry_lease(dn, rinfo->trace_dlease[d], 
-                                        session, req->r_from_time);
+               if (dn->d_parent == parent)
+                       ceph_update_dentry_lease(dn, rinfo->trace_dlease[d], 
+                                                session, req->r_from_time);
 
                /* inode */
                if (d+1 == rinfo->trace_numi) {
@@ -533,6 +538,8 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                dput(parent);
 
        dout(10, "fill_trace done, last dn %p in %p\n", dn, in);
+       if (req->r_old_dentry)
+               dput(req->r_old_dentry);
        if (req->r_last_dentry)
                dput(req->r_last_dentry);
        if (req->r_last_inode)
index 4472861e73e3fdc2d4e845fd5aec2fc6da45d5ea..a469254b966aae6bf9f0a29b52343b99f0443e49 100644 (file)
@@ -404,6 +404,7 @@ static struct ceph_mds_request *new_request(struct ceph_msg *msg)
        req->r_reply = 0;
        req->r_last_inode = 0;
        req->r_last_dentry = 0;
+       req->r_old_dentry = 0;
        req->r_expects_cap = 0;
        req->r_cap = 0;
        req->r_session = 0;
index 1d3a9cbb2ba1896703d1d2f24f95ac50cc7d91eb..690366a5155d657abb683bcb6b9b941893d2f7f9 100644 (file)
@@ -68,16 +68,17 @@ struct ceph_mds_session {
  */
 struct ceph_mds_request {
        __u64             r_tid;
-       struct ceph_msg r_request;  /* original request */
-       struct ceph_msg r_reply;
+       struct ceph_msg  *r_request;  /* original request */
+       struct ceph_msg  *r_reply;
        struct ceph_mds_reply_info r_reply_info;
-       struct inode    * r_last_inode;
-       struct dentry   * r_last_dentry;
-       int                             r_expects_cap;
+       struct inode     *r_last_inode;
+       struct dentry    *r_last_dentry;
+       struct dentry    *r_old_dentry;   /* for rename */
+       int                     r_expects_cap;
        unsigned long           r_from_time;
-       struct ceph_inode_cap r_cap;
-       struct ceph_mds_session * r_session;
-       struct ceph_mds_session * r_mds[2];
+       struct ceph_inode_cap  *r_cap;
+       struct ceph_mds_session *r_session;
+       struct ceph_mds_session *r_mds[2];
        int               r_num_mds;    /* items in r_mds */
 
        int               r_attempts;   /* resend attempts */
index 7c944dee01458e3713057f4ce789051de50c0171..0969131c4ef3c1f5eb60c3dc322e5b485db330a7 100644 (file)
@@ -537,7 +537,7 @@ static struct file_system_type ceph_fs_type = {
        .name           = "ceph",
        .get_sb         = ceph_get_sb,
        .kill_sb        = ceph_kill_sb,
-/*     .fs_flags       =   */
+       .fs_flags       = FS_RENAME_DOES_D_MOVE,
 };
 
 static int __init init_ceph(void)