diff options
author | Gaurav <gaurav@gluster.com> | 2011-03-31 05:42:47 +0000 |
---|---|---|
committer | Vijay Bellur <vijay@gluster.com> | 2011-04-06 10:51:49 -0700 |
commit | b8ae8d95a814d9329c34e6bf3d705c0fc07115b7 (patch) | |
tree | d771b5db25932498e1243aaf64478521fce53435 | |
parent | e4c5ad45612e845eb476b29d51ec12b963660855 (diff) |
NFS : Store verifier for exlusive mode craete.
Signed-off-by: Gaurav <gaurav@gluster.com>
Signed-off-by: Vijay Bellur <vijay@gluster.com>
BUG: 2553 (NFS file create with Mac client and UNCHECKED mode returns "Operation not permitted")
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2553
-rw-r--r-- | xlators/nfs/server/src/nfs3.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/xlators/nfs/server/src/nfs3.c b/xlators/nfs/server/src/nfs3.c index 0f2c284ec..11b4ede17 100644 --- a/xlators/nfs/server/src/nfs3.c +++ b/xlators/nfs/server/src/nfs3.c @@ -2401,16 +2401,24 @@ nfs3svc_create_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, goto nfs3err; } - if (cs->preparent.ia_mtime == buf->ia_mtime) + if ((cs->stbuf.ia_mtime == buf->ia_mtime) && + (cs->stbuf.ia_atime == buf->ia_atime)) { + gf_log (GF_NFS3, GF_LOG_DEBUG, "Create req retransmitted verf %x %x", + cs->stbuf.ia_mtime, cs->stbuf.ia_atime); stat = NFS3_OK; - else + nfs3_fh_build_child_fh (&cs->parent, buf, &cs->fh); + } else { + gf_log (GF_NFS3, GF_LOG_DEBUG, "File already exist new_verf %x %x" + "old_verf %x %x", cs->stbuf.ia_mtime, cs->stbuf.ia_atime, + buf->ia_mtime, buf->ia_atime); stat = NFS3ERR_EXIST; + } nfs3err: if (ret < 0) { nfs3_log_common_res (nfs_rpcsvc_request_xid (cs->req), "CREATE", stat, op_errno); - nfs3_create_reply (cs->req, stat, NULL, NULL, NULL, NULL); + nfs3_create_reply (cs->req, stat, &cs->fh, buf, NULL, NULL); nfs3_call_state_wipe (cs); } @@ -2427,9 +2435,12 @@ nfs3_create_exclusive (nfs3_call_state_t *cs) if (!cs) return ret; - /* HACK warning. */ - cs->preparent.ia_mtime = cs->cookieverf; - cs->preparent.ia_atime = 9669; + /* Storing verifier as a mtime and atime attribute, to store it + * in stable storage */ + cs->stbuf.ia_atime = (cs->cookieverf && 0xFFFFFFFF00000000); + cs->stbuf.ia_mtime = (cs->cookieverf && 0x00000000FFFFFFFF); + cs->setattr_valid |= GF_SET_ATTR_ATIME; + cs->setattr_valid |= GF_SET_ATTR_MTIME; nfs_request_user_init (&nfu, cs->req); /* If the file already existed we need to get that attributes so we can |