summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghavendra Bhat <raghavendra@redhat.com>2015-04-09 18:44:23 +0530
committerNiels de Vos <ndevos@redhat.com>2015-04-13 05:45:24 +0000
commit7c7bbc027feb4c5b233e3078951e5bb1d9fc4618 (patch)
tree4766aa8ccdf1b4f1317d4162602ebb06e2a0b193
parent3fc4f31a78e06dc09e03a958be500683dc9bcd78 (diff)
nfs: do not overwrite the return value and errno of resolve operation
* In auth status check which is done in the resume function, the op_ret and op_errno values saved in nfs3_call_state are overwritten by the return value of the auth status check function. Change-Id: Id4682ddd399c78a1cef6313a534892ef309c57a6 BUG: 1210338 Signed-off-by: Raghavendra Bhat <raghavendra@redhat.com> Reviewed-on: http://review.gluster.org/10179 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Venky Shankar <vshankar@redhat.com> Reviewed-by: Niels de Vos <ndevos@redhat.com>
-rw-r--r--tests/bugs/nfs/bug-1210338.c32
-rw-r--r--tests/bugs/nfs/bug-1210338.t27
-rw-r--r--xlators/nfs/server/src/nfs3.c9
3 files changed, 65 insertions, 3 deletions
diff --git a/tests/bugs/nfs/bug-1210338.c b/tests/bugs/nfs/bug-1210338.c
new file mode 100644
index 00000000000..77f56eb9d0b
--- /dev/null
+++ b/tests/bugs/nfs/bug-1210338.c
@@ -0,0 +1,32 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+
+int
+main (int argc, char *argv[])
+{
+ int ret = -1;
+ int fd = -1;
+
+ fd = open (argv[1], O_CREAT|O_EXCL);
+
+ if (fd == -1) {
+ fprintf (stderr, "creation of the file %s failed (%s)\n", argv[1],
+ strerror (errno));
+ goto out;
+ }
+
+ ret = 0;
+
+out:
+ if (fd > 0)
+ close (fd);
+
+ return ret;
+}
diff --git a/tests/bugs/nfs/bug-1210338.t b/tests/bugs/nfs/bug-1210338.t
new file mode 100644
index 00000000000..cdac24e3e8e
--- /dev/null
+++ b/tests/bugs/nfs/bug-1210338.t
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+. $(dirname $0)/../../include.rc
+. $(dirname $0)/../../volume.rc
+. $(dirname $0)/../../nfs.rc
+
+cleanup;
+
+NFS_SOURCE=$(dirname $0)/bug-1210338.c
+NFS_EXEC=$(dirname $0)/excl_create
+
+TEST glusterd
+TEST pidof glusterd
+
+TEST $CLI volume create $V0 $H0:$B0/$V0
+TEST $CLI volume start $V0
+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;
+TEST mount_nfs $H0:/$V0 $N0 nolock
+
+build_tester $NFS_SOURCE -o $NFS_EXEC
+TEST [ -e $NFS_EXEC ]
+
+TEST $NFS_EXEC $N0/my_file
+
+rm -f $NFS_EXEC;
+
+cleanup
diff --git a/xlators/nfs/server/src/nfs3.c b/xlators/nfs/server/src/nfs3.c
index 1a94c00ce8c..4e03277b496 100644
--- a/xlators/nfs/server/src/nfs3.c
+++ b/xlators/nfs/server/src/nfs3.c
@@ -249,12 +249,15 @@ out:
#define nfs3_check_fh_auth_status(cst, nfstat, is_write_op, erlabl) \
do { \
+ int auth_ret = 0; \
+ int auth_errno = 0; \
xlator_t *xlatorp = NULL; \
char buf[256], gfid[256]; \
rpc_transport_t *trans = NULL; \
- cst->resolve_ret = cst->resolve_errno = \
+ \
+ auth_ret = auth_errno = \
nfs3_fh_auth_nfsop (cst, is_write_op); \
- if ((cst)->resolve_ret < 0) { \
+ if (auth_ret < 0) { \
trans = rpcsvc_request_transport (cst->req); \
xlatorp = nfs3_fh_to_xlator (cst->nfs3state, \
&cst->resolvefh); \
@@ -264,7 +267,7 @@ out:
xlatorp ? xlatorp->name : "ERR", gfid); \
gf_log (GF_NFS3, GF_LOG_ERROR, "Unable to resolve FH"\
": %s", buf); \
- nfstat = nfs3_errno_to_nfsstat3 (-cst->resolve_errno);\
+ nfstat = nfs3_errno_to_nfsstat3 (-auth_errno);\
goto erlabl; \
} \
} while (0) \