diff options
author | Jiffin Tony Thottan <jthottan@redhat.com> | 2016-06-06 18:10:09 +0530 |
---|---|---|
committer | Kaleb KEITHLEY <kkeithle@redhat.com> | 2016-06-07 04:37:44 -0700 |
commit | 093902319ccc3d6bbb954fc40944a9e23aa68344 (patch) | |
tree | de5f95db360b1ef2eca1875a25edc0304cb1e0d2 /xlators/nfs | |
parent | eb1744582d57d0f9fe08275781800c0c3459697f (diff) |
nfs : store sattr properly in nfs3_setattr() call
nfs3_setattr stores the input arguments in cs->stbuf.
However, inode/entry resolution code overwrites cs->stbuf
after a successful resolution, thereby overwriting the
input arguments with iatt values stored on backend.
Hence operations like chmod/chown turns out to be a NOP.
Specifically following are the functions that overwrite
cs->stbuf:
nfs3_fh_resolve_inode_lookup_cbk
nfs3_fh_resolve_entry_lookup_cbk
Since we resort to inode resolution only when inode is not
found in inode table and lru limit guards the number of
inodes in itable, we run into this issue only when the data
set is bigger than lru limit of itable.
Fix is to store input arguments in a member other than
cs->stbuf.
Thanks Du for suggesting the fix
Change-Id: I7caef48839d4f177c3557d7823fc1d35c8294939
BUG: 1318204
Signed-off-by: Jiffin Tony Thottan <jthottan@redhat.com>
Reviewed-on: http://review.gluster.org/14657
Smoke: Gluster Build System <jenkins@build.gluster.com>
Tested-by: Atin Mukherjee <amukherj@redhat.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: soumya k <skoduri@redhat.com>
Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com>
Tested-by: Kaleb KEITHLEY <kkeithle@redhat.com>
Diffstat (limited to 'xlators/nfs')
-rw-r--r-- | xlators/nfs/server/src/nfs3.c | 9 | ||||
-rw-r--r-- | xlators/nfs/server/src/nfs3.h | 1 |
2 files changed, 6 insertions, 4 deletions
diff --git a/xlators/nfs/server/src/nfs3.c b/xlators/nfs/server/src/nfs3.c index 67b619ece13..64287c5b1bd 100644 --- a/xlators/nfs/server/src/nfs3.c +++ b/xlators/nfs/server/src/nfs3.c @@ -1019,10 +1019,11 @@ nfs3svc_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, */ if ((gf_attr_size_set (cs->setattr_valid)) && (!IA_ISDIR (postop->ia_type)) && - (preop->ia_size != cs->stbuf.ia_size)) { + (preop->ia_size != cs->attr_in.ia_size)) { nfs_request_user_init (&nfu, cs->req); ret = nfs_truncate (cs->nfsx, cs->vol, &nfu, &cs->resolvedloc, - cs->stbuf.ia_size, nfs3svc_truncate_cbk,cs); + cs->attr_in.ia_size, nfs3svc_truncate_cbk, + cs); if (ret < 0) stat = nfs3_errno_to_nfsstat3 (-ret); @@ -1105,7 +1106,7 @@ nfs3_setattr_resume (void *carg) nfs3_check_fh_resolve_status (cs, stat, nfs3err); nfs_request_user_init (&nfu, cs->req); ret = nfs_setattr (cs->nfsx, cs->vol, &nfu, &cs->resolvedloc, - &cs->stbuf, cs->setattr_valid, + &cs->attr_in, cs->setattr_valid, nfs3svc_setattr_cbk, cs); if (ret < 0) @@ -1147,7 +1148,7 @@ nfs3_setattr (rpcsvc_request_t *req, struct nfs3_fh *fh, sattr3 *sattr, nfs3_check_rw_volaccess (nfs3, fh->exportid, stat, nfs3err); nfs3_handle_call_state_init (nfs3, cs, req, vol, stat, nfs3err); - cs->setattr_valid = nfs3_sattr3_to_setattr_valid (sattr, &cs->stbuf, + cs->setattr_valid = nfs3_sattr3_to_setattr_valid (sattr, &cs->attr_in, NULL); if (guard->check) { gf_msg_trace (GF_NFS3, 0, "Guard check required"); diff --git a/xlators/nfs/server/src/nfs3.h b/xlators/nfs/server/src/nfs3.h index b55cb848638..4cb3e67528d 100644 --- a/xlators/nfs/server/src/nfs3.h +++ b/xlators/nfs/server/src/nfs3.h @@ -225,6 +225,7 @@ struct nfs3_local { cookie3 cookie; struct iovec datavec; mode_t mode; + struct iatt attr_in; /* NFSv3 FH resolver state */ int hardresolved; |