From: Sage Weil Date: Mon, 7 Apr 2008 16:54:42 +0000 (-0700) Subject: kclient: do rename d_move in ceph_fill_trace X-Git-Tag: v0.3~239^2~81^2^2~10^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=95053ee77bd465c72b0923bad321531918a8c538;p=ceph.git kclient: do rename d_move in ceph_fill_trace --- diff --git a/src/kernel/dir.c b/src/kernel/dir.c index e9ed828b0c84..69e4380de147 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -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) diff --git a/src/kernel/inode.c b/src/kernel/inode.c index a370cc3fded3..eddd620bddda 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -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) diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 4472861e73e3..a469254b966a 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -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; diff --git a/src/kernel/mds_client.h b/src/kernel/mds_client.h index 1d3a9cbb2ba1..690366a5155d 100644 --- a/src/kernel/mds_client.h +++ b/src/kernel/mds_client.h @@ -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 */ diff --git a/src/kernel/super.c b/src/kernel/super.c index 7c944dee0145..0969131c4ef3 100644 --- a/src/kernel/super.c +++ b/src/kernel/super.c @@ -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)