From 6b8ffa6b54b3c7614a348e3e6f809a3ff4d03144 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 2 Apr 2009 12:04:25 -0700 Subject: [PATCH] kclient: refactor message creation --- src/kernel/mds_client.c | 84 ++++++++++++++++++++++++----------------- src/kernel/mds_client.h | 1 + src/kernel/super.c | 4 +- 3 files changed, 54 insertions(+), 35 deletions(-) diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 9b35a50e294e5..93f8bab5727cd 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -990,6 +990,40 @@ static int build_inode_path(struct inode *inode, return 1; } +static int set_request_path_attr(struct inode *rinode, struct dentry *rdentry, + const char *rpath, u64 rino, + const char **ppath, int *pathlen, + u64 *ino, int *freepath) +{ + *freepath = 0; + *pathlen = 0; + *ino = 0; + + if (rinode) { + *freepath = build_inode_path(rinode, ppath, + pathlen, ino); + dout(10, "create_request_message inode %p %llx.%llx\n", + rinode, ceph_ino(rinode), + ceph_snap(rinode)); + } else if (rdentry) { + *freepath = build_dentry_path(rdentry, ppath, + pathlen, ino); + dout(10, "create_request_message dentry %p %llx/%.*s\n", + rdentry, rino, *pathlen, *ppath); + } else if (rpath) { + *ino = rino; + *ppath = rpath; + *pathlen = strlen(rpath); + dout(10, "create_request_message path %.*s\n", + *pathlen, rpath); + } + + if (*freepath < 0) + return *freepath; + + return 0; +} + /* * called under mdsc->mutex */ @@ -1001,46 +1035,28 @@ static struct ceph_msg *create_request_message(struct ceph_mds_client *mdsc, struct ceph_mds_request_head *head; const char *path1 = req->r_path1; const char *path2 = req->r_path2; - u64 ino1 = 1, ino2 = 0; - int pathlen1 = 0, pathlen2 = 0; + u64 ino1, ino2; + int pathlen1, pathlen2; int pathlen; - int freepath1 = 0, freepath2 = 0; + int freepath1, freepath2; void *p, *end; + int ret; - if (req->r_inode) { - freepath1 = build_inode_path(req->r_inode, &path1, - &pathlen1, &ino1); - dout(10, "create_request_message inode %p %llx.%llx\n", - req->r_inode, ceph_ino(req->r_inode), - ceph_snap(req->r_inode)); - } else if (req->r_dentry) { - freepath1 = build_dentry_path(req->r_dentry, &path1, - &pathlen1, &ino1); - dout(10, "create_request_message dentry %p %llx/%.*s\n", - req->r_dentry, ino1, pathlen1, path1); - } else if (path1) { - pathlen1 = strlen(path1); - dout(10, "create_request_message path1 %.*s\n", - pathlen1, path1); - } - if (freepath1 < 0) { - msg = ERR_PTR(freepath1); + ret = set_request_path_attr(req->r_inode, req->r_dentry, + req->r_path1, req->r_ino1.ino, + &path1, &pathlen1, &ino1, &freepath1); + if (ret < 0) { + msg = ERR_PTR(ret); goto out; } - if (req->r_old_dentry) { - freepath2 = build_dentry_path(req->r_old_dentry, &path2, - &pathlen2, &ino2); - dout(10, "create_request_message dentry %p %llx/%.*s\n", - req->r_old_dentry, ino2, pathlen2, path2); - if (freepath2 < 0) { - msg = ERR_PTR(freepath2); - goto out_free1; - } - } else if (path2) { - pathlen2 = strlen(path2); - dout(10, "create_request_message path2 %.*s\n", - pathlen2, path2); + ret = set_request_path_attr(NULL, req->r_old_dentry, + req->r_path2, req->r_ino2.ino, + &path2, &pathlen2, &ino2, &freepath2); + + if (ret < 0) { + msg = ERR_PTR(ret); + goto out_free1; } pathlen = pathlen1 + pathlen2 + 2*(sizeof(u32) + sizeof(u64)); diff --git a/src/kernel/mds_client.h b/src/kernel/mds_client.h index b3d37d26021a1..b92b051756621 100644 --- a/src/kernel/mds_client.h +++ b/src/kernel/mds_client.h @@ -164,6 +164,7 @@ struct ceph_mds_request { struct dentry *r_dentry; struct dentry *r_old_dentry; /* rename from or link from */ const char *r_path1, *r_path2; + struct ceph_vino r_ino1, r_ino2; union ceph_mds_request_args r_args; struct inode *r_target_inode; diff --git a/src/kernel/super.c b/src/kernel/super.c index 65cb3adaec686..aca5cb9342cc8 100644 --- a/src/kernel/super.c +++ b/src/kernel/super.c @@ -768,6 +768,8 @@ static struct dentry *open_root_dentry(struct ceph_client *client, if (IS_ERR(req)) return ERR_PTR(PTR_ERR(req)); req->r_path1 = path; + req->r_ino1.ino = CEPH_INO_ROOT; + req->r_ino1.snap = CEPH_NOSNAP; req->r_started = started; req->r_timeout = client->mount_args.mount_timeout * HZ; req->r_args.stat.mask = cpu_to_le32(CEPH_STAT_CAP_INODE); @@ -859,7 +861,7 @@ static int ceph_mount(struct ceph_client *client, struct vfsmount *mnt, dout(30, "mount opening root\n"); - root = open_root_dentry(client, NULL, started); + root = open_root_dentry(client, "", started); if (IS_ERR(root)) { err = PTR_ERR(root); goto out; -- 2.39.5