diff options
4 files changed, 70 insertions, 24 deletions
diff --git a/xlators/features/snapview-client/src/snapview-client.c b/xlators/features/snapview-client/src/snapview-client.c index 0f8913d18ce..849cab390fa 100644 --- a/xlators/features/snapview-client/src/snapview-client.c +++ b/xlators/features/snapview-client/src/snapview-client.c @@ -546,17 +546,58 @@ int32_t svc_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, const char *name, dict_t *xdata) { - int32_t ret = -1; - int inode_type = -1; - xlator_t *subvolume = NULL; - int op_ret = -1; - int op_errno = EINVAL; - gf_boolean_t wind = _gf_false; + int32_t ret = -1; + int inode_type = -1; + xlator_t *subvolume = NULL; + int op_ret = -1; + int op_errno = EINVAL; + gf_boolean_t wind = _gf_false; + svc_private_t *priv = NULL; + char attrname[PATH_MAX] = ""; + char attrval[64] = ""; + dict_t *dict = NULL; GF_VALIDATE_OR_GOTO ("svc", this, out); GF_VALIDATE_OR_GOTO (this->name, frame, out); GF_VALIDATE_OR_GOTO (this->name, loc, out); GF_VALIDATE_OR_GOTO (this->name, loc->inode, out); + priv = this->private; + GF_VALIDATE_OR_GOTO (this->name, priv, out); + + /* + * Samba sends this special key for case insensitive + * filename check. This request comes with a parent + * path and with a special key GF_XATTR_GET_REAL_FILENAME_KEY. + * e.g. "glusterfs.get_real_filename:.snaps". + * If the name variable matches this key then we have + * to send back .snaps as the real filename. + */ + sscanf (name, "%[^:]:%[^@]", attrname, attrval); + strcat (attrname, ":"); + + if (!strcmp (attrname, GF_XATTR_GET_REAL_FILENAME_KEY)) { + if (!strcasecmp (attrval, priv->path)) { + dict = dict_new (); + if (NULL == dict) { + op_errno = ENOMEM; + goto out; + } + + ret = dict_set_dynstr_with_alloc (dict, + (char *)name, + priv->path); + if (ret) { + op_errno = ENOMEM; + dict_unref (dict); + goto out; + } + + op_errno = 0; + op_ret = strlen (priv->path) + 1; + /* We should return from here */ + goto out; + } + } SVC_GET_SUBVOL_FROM_CTX (this, op_ret, op_errno, inode_type, ret, loc->inode, subvolume, out); @@ -569,7 +610,7 @@ svc_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, const char *name, out: if (!wind) SVC_STACK_UNWIND (getxattr, frame, op_ret, op_errno, - NULL, NULL); + dict, NULL); return 0; } diff --git a/xlators/features/snapview-server/src/snapview-server-helpers.c b/xlators/features/snapview-server/src/snapview-server-helpers.c index a8183e35d01..a038126eb07 100644 --- a/xlators/features/snapview-server/src/snapview-server-helpers.c +++ b/xlators/features/snapview-server/src/snapview-server-helpers.c @@ -98,7 +98,7 @@ out: } svs_inode_t * -svs_inode_new () +svs_inode_new (void) { svs_inode_t *svs_inode = NULL; @@ -120,7 +120,7 @@ svs_inode_ctx_get_or_new (xlator_t *this, inode_t *inode) { svs_inode = __svs_inode_ctx_get (this, inode); if (!svs_inode) { - svs_inode = svs_inode_new (this, inode); + svs_inode = svs_inode_new (); if (svs_inode) { ret = __svs_inode_ctx_set (this, inode, svs_inode); @@ -138,7 +138,7 @@ out: } svs_fd_t * -svs_fd_new () +svs_fd_new (void) { svs_fd_t *svs_fd = NULL; @@ -243,7 +243,7 @@ __svs_fd_ctx_get_or_new (xlator_t *this, fd_t *fd) goto out; } - svs_fd = svs_fd_new (this, fd); + svs_fd = svs_fd_new (); if (!svs_fd) { gf_log (this->name, GF_LOG_ERROR, "failed to allocate new fd " "context for gfid %s", uuid_utoa (inode->gfid)); diff --git a/xlators/features/snapview-server/src/snapview-server.c b/xlators/features/snapview-server/src/snapview-server.c index 8655bf5636c..14fb6f14907 100644 --- a/xlators/features/snapview-server/src/snapview-server.c +++ b/xlators/features/snapview-server/src/snapview-server.c @@ -14,6 +14,7 @@ #include "snapview-server.h" #include "snapview-server-mem-types.h" +#include "compat-errno.h" #include "xlator.h" #include "rpc-clnt.h" @@ -746,7 +747,7 @@ svs_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, const char *name, goto out; } - /* EINVAL is sent if the getxattr is on entry point directory + /* ENODATA is sent if the getxattr is on entry point directory or the inode is SNAP_VIEW_ENTRY_POINT_INODE. Entry point is a virtual directory on which setxattr operations are not allowed. If getxattr has to be faked as success, then a value @@ -754,7 +755,7 @@ svs_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, const char *name, */ if (inode_ctx->type == SNAP_VIEW_ENTRY_POINT_INODE) { op_ret = -1; - op_errno = EINVAL; + op_errno = ENODATA; goto out; } else { @@ -1032,17 +1033,27 @@ int32_t svs_flush (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata) { - int32_t op_ret = -1; - int32_t op_errno = 0; - int ret = -1; - uint64_t value = 0; + int32_t op_ret = -1; + int32_t op_errno = 0; + int ret = -1; + uint64_t value = 0; + svs_inode_t *inode_ctx = NULL; GF_VALIDATE_OR_GOTO ("snapview-server", this, out); GF_VALIDATE_OR_GOTO (this->name, frame, out); GF_VALIDATE_OR_GOTO (this->name, fd, out); + inode_ctx = svs_inode_ctx_get (this, fd->inode); + if (!inode_ctx) { + gf_log (this->name, GF_LOG_ERROR, "inode context not found for" + " the inode %s", uuid_utoa (fd->inode->gfid)); + op_ret = -1; + op_errno = EINVAL; + goto out; + } + ret = fd_ctx_get (fd, this, &value); - if (ret < 0) { + if (ret < 0 && inode_ctx->type != SNAP_VIEW_ENTRY_POINT_INODE) { op_errno = EINVAL; gf_log (this->name, GF_LOG_WARNING, "pfd is NULL on fd=%p", fd); diff --git a/xlators/features/snapview-server/src/snapview-server.h b/xlators/features/snapview-server/src/snapview-server.h index 9c13cf74610..c80d3456c30 100644 --- a/xlators/features/snapview-server/src/snapview-server.h +++ b/xlators/features/snapview-server/src/snapview-server.h @@ -173,14 +173,8 @@ int32_t svs_inode_ctx_set (xlator_t *this, inode_t *inode, svs_inode_t *svs_inode); svs_inode_t * -svs_inode_new (); - -svs_inode_t * svs_inode_ctx_get_or_new (xlator_t *this, inode_t *inode); -svs_fd_t * -svs_fd_new (); - int __svs_fd_ctx_set (xlator_t *this, fd_t *fd, svs_fd_t *svs_fd); |