diff options
author | Raghavendra Bhat <raghavendra@redhat.com> | 2015-04-09 18:44:23 +0530 |
---|---|---|
committer | Niels de Vos <ndevos@redhat.com> | 2015-04-13 05:45:24 +0000 |
commit | 7c7bbc027feb4c5b233e3078951e5bb1d9fc4618 (patch) | |
tree | 4766aa8ccdf1b4f1317d4162602ebb06e2a0b193 | |
parent | 3fc4f31a78e06dc09e03a958be500683dc9bcd78 (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.c | 32 | ||||
-rw-r--r-- | tests/bugs/nfs/bug-1210338.t | 27 | ||||
-rw-r--r-- | xlators/nfs/server/src/nfs3.c | 9 |
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) \ |