summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghavendra Bhat <raghavendrabhat@gluster.com>2012-03-12 21:06:45 +0530
committerVijay Bellur <vijay@gluster.com>2012-03-14 05:57:18 -0700
commitaa0f68aa8ec38808a83553abde8d8211047e7b4e (patch)
treed35a5efa3f65d2f16b3512535dec5377169a2c74
parent7bd561996d5a32071942b598739b130e020f89ee (diff)
nfs: do not call inode_path on the newly created inode
While resolving, for building the path into the loc, inode_find is called with gfid as argument to get the inode from the inode table. If the inode is not found, then a new inode is created. Then the path is build using inode_path. But if the inode is not linked to inode table (newly created inode), then gfid will be null and inode_path returns null gfid as the path. Suppose the lookup operation on that gfid fails, then we print the null gfid in the log message. To avoid it, build the path using the gfid only if inode_path fails. Change-Id: I2506fa8675761ddb0bc02980cd3583d9d068fc85 BUG: 802424 Signed-off-by: Raghavendra Bhat <raghavendrabhat@gluster.com> Reviewed-on: http://review.gluster.com/2930 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Amar Tumballi <amarts@redhat.com> Reviewed-by: Vijay Bellur <vijay@gluster.com>
-rw-r--r--xlators/nfs/server/src/nfs-common.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/xlators/nfs/server/src/nfs-common.c b/xlators/nfs/server/src/nfs-common.c
index b5c56d03df6..ec76c294f01 100644
--- a/xlators/nfs/server/src/nfs-common.c
+++ b/xlators/nfs/server/src/nfs-common.c
@@ -203,11 +203,24 @@ nfs_inode_loc_fill (inode_t *inode, loc_t *loc, int how)
if ((!inode) || (!loc))
return ret;
- ret = inode_path (inode, NULL, &resolvedpath);
- if (ret < 0) {
- gf_log (GF_NFS, GF_LOG_ERROR, "path resolution failed %s",
- resolvedpath);
- goto err;
+ /* If gfid is not null, then the inode is already linked to
+ * the inode table, and not a newly created one. For newly
+ * created inode, inode_path returns null gfid as the path.
+ */
+ if (!uuid_is_null (inode->gfid)) {
+ ret = inode_path (inode, NULL, &resolvedpath);
+ if (ret < 0) {
+ gf_log (GF_NFS, GF_LOG_ERROR, "path resolution failed "
+ "%s", resolvedpath);
+ goto err;
+ }
+ }
+
+ if (resolvedpath == NULL) {
+ char tmp_path[GFID_STR_PFX_LEN + 1] = {0,};
+ snprintf (tmp_path, sizeof (tmp_path), "<gfid:%s>",
+ uuid_utoa (loc->gfid));
+ resolvedpath = gf_strdup (tmp_path);
}
ret = nfs_loc_fill (loc, inode, parent, resolvedpath);