From d55acadd85e37ee4bf56da36640a5bf8a0e2f66e Mon Sep 17 00:00:00 2001 From: Rajesh Amaravathi Date: Mon, 5 Nov 2012 16:39:37 +0530 Subject: nfs: resolve parent inode during inode_loc_fill This commit resolves the parent inode in nfs_inode_loc_fill if the inode has a resolved path. Change-Id: If407c91c246b0b9f3349cedae0baec8bd6831d10 BUG: 872923 Signed-off-by: Rajesh Amaravathi Reviewed-on: http://review.gluster.org/4157 Reviewed-by: Krishna Srinivas Tested-by: Gluster Build System --- tests/bugs/bug-872923.t | 57 +++++++++++++++++++++++++++++++++++++ xlators/nfs/server/src/nfs-common.c | 2 ++ 2 files changed, 59 insertions(+) create mode 100755 tests/bugs/bug-872923.t diff --git a/tests/bugs/bug-872923.t b/tests/bugs/bug-872923.t new file mode 100755 index 000000000..6757846dc --- /dev/null +++ b/tests/bugs/bug-872923.t @@ -0,0 +1,57 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info +TEST $CLI volume create $V0 replica 2 $H0:$B0/brick0 $H0:$B0/brick1 +TEST $CLI volume start $V0 +sleep 5 + +mount -t nfs -o vers=3,nolock `hostname`:/$V0 $N0 + +cd $N0 +mkdir test_hardlink_self_heal; +cd test_hardlink_self_heal; + +for i in `seq 1 5`; +do + mkdir dir.$i; + for j in `seq 1 10`; + do + dd if=/dev/zero of=dir.$i/file.$j bs=1k count=$j > /dev/null 2>&1; + done; +done; + +cd .. +kill `cat /var/lib/glusterd/vols/$V0/run/$H0-d-backends-brick0.pid` +sleep 2 + + +cd test_hardlink_self_heal; + +RET=0 +for i in `seq 1 5`; +do + for j in `seq 1 10`; + do + ln dir.$i/file.$j dir.$i/link_file.$j > /dev/null 2>&1; + RET=$? + if [ $RET -ne 0 ]; then + break; + fi + done ; + if [ $RET -ne 0 ]; then + break; + fi +done; + +cd +umount $N0 + +EXPECT "0" echo $RET; + +cleanup; diff --git a/xlators/nfs/server/src/nfs-common.c b/xlators/nfs/server/src/nfs-common.c index 67509b546..0fe6b34d7 100644 --- a/xlators/nfs/server/src/nfs-common.c +++ b/xlators/nfs/server/src/nfs-common.c @@ -221,6 +221,8 @@ nfs_inode_loc_fill (inode_t *inode, loc_t *loc, int how) snprintf (tmp_path, sizeof (tmp_path), "", uuid_utoa (loc->gfid)); resolvedpath = gf_strdup (tmp_path); + } else { + parent = inode_parent (inode, loc->pargfid, NULL); } ret = nfs_loc_fill (loc, inode, parent, resolvedpath); -- cgit