From 7c7bbc027feb4c5b233e3078951e5bb1d9fc4618 Mon Sep 17 00:00:00 2001 From: Raghavendra Bhat Date: Thu, 9 Apr 2015 18:44:23 +0530 Subject: 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 Reviewed-on: http://review.gluster.org/10179 Tested-by: Gluster Build System Reviewed-by: Venky Shankar Reviewed-by: Niels de Vos --- tests/bugs/nfs/bug-1210338.c | 32 ++++++++++++++++++++++++++++++++ tests/bugs/nfs/bug-1210338.t | 27 +++++++++++++++++++++++++++ xlators/nfs/server/src/nfs3.c | 9 ++++++--- 3 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 tests/bugs/nfs/bug-1210338.c create mode 100644 tests/bugs/nfs/bug-1210338.t 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 +#include +#include +#include +#include +#include +#include +#include + + +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) \ -- cgit