diff options
Diffstat (limited to 'xlators/storage/posix/src/posix.c')
-rw-r--r-- | xlators/storage/posix/src/posix.c | 241 |
1 files changed, 150 insertions, 91 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index fe59d64861a..9861d16cf57 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -590,7 +590,6 @@ posix_releasedir (xlator_t *this, struct posix_fd * pfd = NULL; uint64_t tmp_pfd = 0; int ret = 0; - xattr_cache_handle_t handle = {{0,},0}; VALIDATE_OR_GOTO (this, out); VALIDATE_OR_GOTO (fd, out); @@ -612,9 +611,6 @@ posix_releasedir (xlator_t *this, goto out; } - handle.fd = fd; - posix_xattr_cache_flush (this, &handle); - ret = closedir (pfd->dir); if (ret == -1) { op_errno = errno; @@ -816,8 +812,6 @@ posix_unlink (call_frame_t *frame, xlator_t *this, int32_t op_errno = 0; char * real_path = NULL; - xattr_cache_handle_t handle = {{0,}, 0}; - DECLARE_OLD_FS_ID_VAR; VALIDATE_OR_GOTO (frame, out); @@ -827,12 +821,6 @@ posix_unlink (call_frame_t *frame, xlator_t *this, SET_FS_ID (frame->root->uid, frame->root->gid); MAKE_REAL_PATH (real_path, this, loc->path); - loc_copy (&handle.loc, loc); - { - posix_xattr_cache_flush (this, &handle); - } - loc_wipe (&handle.loc); - op_ret = unlink (real_path); if (op_ret == -1) { op_errno = errno; @@ -859,8 +847,6 @@ posix_rmdir (call_frame_t *frame, xlator_t *this, int32_t op_errno = 0; char * real_path = 0; - xattr_cache_handle_t handle = {{0,}, 0}; - DECLARE_OLD_FS_ID_VAR; VALIDATE_OR_GOTO (frame, out); @@ -870,12 +856,6 @@ posix_rmdir (call_frame_t *frame, xlator_t *this, SET_FS_ID (frame->root->uid, frame->root->gid); MAKE_REAL_PATH (real_path, this, loc->path); - loc_copy (&handle.loc, loc); - { - posix_xattr_cache_flush (this, &handle); - } - loc_wipe (&handle.loc); - op_ret = rmdir (real_path); op_errno = errno; @@ -967,8 +947,6 @@ posix_rename (call_frame_t *frame, xlator_t *this, char * real_newpath = NULL; struct stat stbuf = {0, }; - xattr_cache_handle_t handle = {{0,}, 0}; - DECLARE_OLD_FS_ID_VAR; VALIDATE_OR_GOTO (frame, out); @@ -980,12 +958,6 @@ posix_rename (call_frame_t *frame, xlator_t *this, MAKE_REAL_PATH (real_oldpath, this, oldloc->path); MAKE_REAL_PATH (real_newpath, this, newloc->path); - loc_copy (&handle.loc, oldloc); - { - posix_xattr_cache_flush (this, &handle); - } - loc_wipe (&handle.loc); - op_ret = rename (real_oldpath, real_newpath); if (op_ret == -1) { op_errno = errno; @@ -1811,7 +1783,6 @@ posix_flush (call_frame_t *frame, xlator_t *this, _fd = pfd->fd; /* do nothing */ - posix_xattr_cache_flush_all (this); op_ret = 0; @@ -1834,7 +1805,6 @@ posix_release (xlator_t *this, struct posix_fd * pfd = NULL; int ret = -1; uint64_t tmp_pfd = 0; - xattr_cache_handle_t handle = {{0,},0}; VALIDATE_OR_GOTO (this, out); VALIDATE_OR_GOTO (fd, out); @@ -1852,9 +1822,6 @@ posix_release (xlator_t *this, } pfd = (struct posix_fd *)(long)tmp_pfd; - handle.fd = fd; - posix_xattr_cache_flush (this, &handle); - _fd = pfd->fd; op_ret = close (_fd); @@ -2419,15 +2386,13 @@ __add_array (int32_t *dest, int32_t *src, int count) * "key" ==> array of 32-bit numbers */ - int -posix_xattrop_common (call_frame_t *frame, xlator_t *this, - xattr_cache_handle_t *handle, - gf_xattrop_flags_t optype, dict_t *xattr) +posix_xattrop (call_frame_t *frame, xlator_t *this, + loc_t *loc, gf_xattrop_flags_t optype, dict_t *xattr) { - int32_t *array = NULL; - - int ret = 0; + char *real_path = NULL; + int32_t *array = NULL; + int size = 0; int count = 0; int op_ret = 0; @@ -2441,87 +2406,191 @@ posix_xattrop_common (call_frame_t *frame, xlator_t *this, trav = xattr->members_list; + if (loc->path) + MAKE_REAL_PATH (real_path, this, loc->path); + while (trav) { count = trav->value->len / sizeof (int32_t); array = CALLOC (count, sizeof (int32_t)); - - ret = posix_xattr_cache_read (this, handle, trav->key, - array, trav->value->len); + + size = lgetxattr (real_path, trav->key, (char *)array, + trav->value->len); + + op_errno = errno; + if ((size == -1) && (op_errno != ENODATA) && + (op_errno != ENOATTR)) { + if (op_errno == ENOTSUP) { + GF_LOG_OCCASIONALLY(gf_posix_xattr_enotsup_log, + this->name,GF_LOG_WARNING, + "extended attributes not " + "supported by filesystem"); + } else { + gf_log (this->name, GF_LOG_ERROR, + "%s: %s", loc->path, + strerror (op_errno)); + } + goto out; + } switch (optype) { case GF_XATTROP_ADD_ARRAY: - __add_array (array, (int32_t *) trav->value->data, - trav->value->len / 4); + __add_array (array, (int32_t *) trav->value->data, + trav->value->len / 4); break; default: gf_log (this->name, GF_LOG_ERROR, - "unknown xattrop type %d", - optype); - + "unknown xattrop type %d. path=%s", + optype, loc->path); op_ret = -1; op_errno = EINVAL; goto out; } - ret = posix_xattr_cache_write (this, handle, trav->key, - array, trav->value->len); - - ret = dict_set_bin (xattr, trav->key, array, - trav->value->len); + size = lsetxattr (real_path, trav->key, array, + trav->value->len, 0); - if (ret != 0) { + op_errno = errno; + if (size == -1) { gf_log (this->name, GF_LOG_ERROR, - "key=%s (%s)", - trav->key, strerror (-ret)); + "%s: key=%s (%s)", loc->path, + trav->key, strerror (op_errno)); op_ret = -1; - op_errno = EINVAL; goto out; - } + } else { + size = dict_set_bin (xattr, trav->key, array, + trav->value->len); - trav = trav->next; + if (size != 0) { + gf_log (this->name, GF_LOG_ERROR, + "%s: key=%s (%s)", loc->path, + trav->key, strerror (-size)); + op_ret = -1; + op_errno = EINVAL; + goto out; + } + array = NULL; + } + array = NULL; + trav = trav->next; } - + out: if (array) FREE (array); - STACK_UNWIND (frame, op_ret, op_errno, xattr); return 0; } int -posix_xattrop (call_frame_t *frame, xlator_t *this, - loc_t *loc, gf_xattrop_flags_t optype, dict_t *xattr) +posix_fxattrop (call_frame_t *frame, xlator_t *this, + fd_t *fd, gf_xattrop_flags_t optype, dict_t *xattr) { - xattr_cache_handle_t handle = {{0,}, 0}; - int ret = -1; + int32_t *array = NULL; + int size = 0; + int count = 0; + + int op_ret = 0; + int op_errno = 0; + + int _fd = -1; + struct posix_fd *pfd = NULL; + + data_pair_t *trav = NULL; + int32_t ret = -1; + + VALIDATE_OR_GOTO (frame, out); + VALIDATE_OR_GOTO (xattr, out); + VALIDATE_OR_GOTO (this, out); - loc_copy (&handle.loc, loc); - { - ret = posix_xattrop_common (frame, this, &handle, optype, xattr); + trav = xattr->members_list; + + if (fd) { + ret = fd_ctx_get (fd, this, (uint64_t *)&pfd); + if (ret < 0) { + gf_log (this->name, GF_LOG_ERROR, + "failed to get pfd from fd=%p", + fd); + op_ret = -1; + op_errno = EBADFD; + goto out; + } + _fd = pfd->fd; } - loc_wipe (&handle.loc); - return ret; -} + while (trav) { + count = trav->value->len / sizeof (int32_t); + array = CALLOC (count, sizeof (int32_t)); + + size = fgetxattr (_fd, trav->key, (char *)array, trav->value->len); + op_errno = errno; + if ((size == -1) && ((op_errno != ENODATA) && + (op_errno != ENOATTR))) { + if (op_errno == ENOTSUP) { + GF_LOG_OCCASIONALLY(gf_posix_xattr_enotsup_log, + this->name,GF_LOG_WARNING, + "extended attributes not " + "supported by filesystem"); + } else { + gf_log (this->name, GF_LOG_ERROR, + "%d: %s", _fd, + strerror (op_errno)); + } + goto out; + } -int -posix_fxattrop (call_frame_t *frame, xlator_t *this, - fd_t *fd, gf_xattrop_flags_t optype, dict_t *xattr) -{ - int ret = -1; - xattr_cache_handle_t handle = {{0,}, 0}; - - handle.fd = fd; + switch (optype) { + case GF_XATTROP_ADD_ARRAY: + __add_array (array, (int32_t *) trav->value->data, + trav->value->len / 4); + break; + default: + gf_log (this->name, GF_LOG_ERROR, + "unknown xattrop type %d. fd=%d", + optype, _fd); + op_ret = -1; + op_errno = EINVAL; + goto out; + } - ret = posix_xattrop_common (frame, this, &handle, optype, xattr); + size = fsetxattr (_fd, trav->key, (char *)array, + trav->value->len, 0); - return ret; + op_errno = errno; + if (size == -1) { + gf_log (this->name, GF_LOG_ERROR, + "%d: key=%s (%s)", _fd, + trav->key, strerror (op_errno)); + op_ret = -1; + goto out; + } else { + size = dict_set_bin (xattr, trav->key, array, + trav->value->len); + + if (size != 0) { + gf_log (this->name, GF_LOG_ERROR, + "%d: key=%s (%s)", _fd, + trav->key, strerror (-size)); + op_ret = -1; + op_errno = EINVAL; + goto out; + } + array = NULL; + } + + array = NULL; + trav = trav->next; + } + +out: + if (array) + FREE (array); + STACK_UNWIND (frame, op_ret, op_errno, xattr); + return 0; } @@ -2961,8 +3030,6 @@ posix_setdents (call_frame_t *frame, xlator_t *this, strcpy (entry_path, real_path); entry_path[real_path_len] = '/'; - posix_xattr_cache_flush_all (this); - /* fd exists, and everything looks fine */ /** * create an entry for each one present in '@entries' @@ -3563,14 +3630,6 @@ init (xlator_t *this) _private->base_path_length = strlen (_private->base_path); _private->base_stdev = buf.st_dev; - _private->xattr_cache = posix_xattr_cache_init (16); - if (!_private->xattr_cache) { - gf_log (this->name, GF_LOG_ERROR, - "out of memory :("); - ret = -1; - goto out; - } - { /* Stats related variables */ gettimeofday (&_private->init_time, NULL); |