From d5088c056d5aee1bda2997ad5835379465fed3a1 Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Tue, 7 Jun 2016 21:27:10 +0530 Subject: storage/posix: Give correct errno for anon-fd operations Change-Id: Ia9e61d3baa6881eb7dc03dd8ddb6bfdde5a01958 BUG: 1343906 Signed-off-by: Pranith Kumar K Reviewed-on: http://review.gluster.org/14669 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Raghavendra G --- xlators/storage/posix/src/posix-aio.c | 6 +-- xlators/storage/posix/src/posix-helpers.c | 29 +++++++++++---- xlators/storage/posix/src/posix.c | 62 ++++++++++++++----------------- xlators/storage/posix/src/posix.h | 3 +- 4 files changed, 52 insertions(+), 48 deletions(-) diff --git a/xlators/storage/posix/src/posix-aio.c b/xlators/storage/posix/src/posix-aio.c index 44824943fe4..d8ef5f7b73f 100644 --- a/xlators/storage/posix/src/posix-aio.c +++ b/xlators/storage/posix/src/posix-aio.c @@ -174,9 +174,8 @@ posix_aio_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, priv = this->private; - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { - op_errno = -ret; gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, "pfd is NULL from fd=%p", fd); goto err; @@ -332,9 +331,8 @@ posix_aio_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, priv = this->private; - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { - op_errno = -ret; gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, "pfd is NULL from fd=%p", fd); goto err; diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index d953db249a0..d6209521206 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -1608,7 +1608,8 @@ out: } static int -__posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p) +__posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p, + int *op_errno_p) { uint64_t tmp_pfd = 0; struct posix_fd *pfd = NULL; @@ -1616,6 +1617,7 @@ __posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p) char *real_path = NULL; char *unlink_path = NULL; int _fd = -1; + int op_errno = 0; DIR *dir = NULL; struct posix_private *priv = NULL; @@ -1633,6 +1635,7 @@ __posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p) "Failed to get fd context for a non-anonymous fd, " "file: %s, gfid: %s", real_path, uuid_utoa (fd->inode->gfid)); + op_errno = EINVAL; goto out; } @@ -1643,10 +1646,12 @@ __posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p) "Failed to create handle path (%s)", uuid_utoa (fd->inode->gfid)); ret = -1; + op_errno = EINVAL; goto out; } pfd = GF_CALLOC (1, sizeof (*pfd), gf_posix_mt_posix_fd); if (!pfd) { + op_errno = ENOMEM; goto out; } pfd->fd = -1; @@ -1654,6 +1659,7 @@ __posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p) if (fd->inode->ia_type == IA_IFDIR) { dir = sys_opendir (real_path); if (!dir) { + op_errno = errno; GF_FREE (pfd); pfd = NULL; goto out; @@ -1674,7 +1680,8 @@ __posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p) _fd = open (unlink_path, fd->flags); } if (_fd == -1) { - gf_msg (this->name, GF_LOG_ERROR, errno, + op_errno = errno; + gf_msg (this->name, GF_LOG_ERROR, op_errno, P_MSG_READ_FAILED, "Failed to get anonymous " "real_path: %s _fd = %d", real_path, _fd); @@ -1690,6 +1697,7 @@ __posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p) ret = __fd_ctx_set (fd, this, (uint64_t) (long) pfd); if (ret != 0) { + op_errno = ENOMEM; if (_fd != -1) sys_close (_fd); if (dir) @@ -1701,6 +1709,9 @@ __posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p) ret = 0; out: + if (ret < 0 && op_errno_p) + *op_errno_p = op_errno; + if (pfd_p) *pfd_p = pfd; return ret; @@ -1708,13 +1719,14 @@ out: int -posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd) +posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd, + int *op_errno) { int ret; LOCK (&fd->inode->lock); { - ret = __posix_fd_ctx_get (fd, this, pfd); + ret = __posix_fd_ctx_get (fd, this, pfd, op_errno); } UNLOCK (&fd->inode->lock); @@ -1925,16 +1937,17 @@ posix_fsyncer_process (xlator_t *this, call_stub_t *stub, gf_boolean_t do_fsync) struct posix_fd *pfd = NULL; int ret = -1; struct posix_private *priv = NULL; + int op_errno = 0; priv = this->private; - ret = posix_fd_ctx_get (stub->args.fd, this, &pfd); + ret = posix_fd_ctx_get (stub->args.fd, this, &pfd, &op_errno); if (ret < 0) { - gf_msg (this->name, GF_LOG_ERROR, EINVAL, + gf_msg (this->name, GF_LOG_ERROR, op_errno, P_MSG_GET_FDCTX_FAILED, "could not get fdctx for fd(%s)", uuid_utoa (stub->args.fd->inode->gfid)); - call_unwind_error (stub, -1, EINVAL); + call_unwind_error (stub, -1, op_errno); return; } @@ -1967,7 +1980,7 @@ posix_fsyncer_syncfs (xlator_t *this, struct list_head *head) int ret = -1; stub = list_entry (head->prev, call_stub_t, list); - ret = posix_fd_ctx_get (stub->args.fd, this, &pfd); + ret = posix_fd_ctx_get (stub->args.fd, this, &pfd, NULL); if (ret) return; diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 4294fa4fe36..deecb09a954 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -572,9 +572,8 @@ posix_fsetattr (call_frame_t *frame, xlator_t *this, VALIDATE_OR_GOTO (this, out); VALIDATE_OR_GOTO (fd, out); - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { - op_errno = -ret; gf_msg_debug (this->name, 0, "pfd is NULL from fd=%p", fd); goto out; } @@ -664,6 +663,7 @@ posix_do_fallocate (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *statpre, struct iatt *statpost, dict_t *xdata) { int32_t ret = -1; + int32_t op_errno = 0; struct posix_fd *pfd = NULL; gf_boolean_t locked = _gf_false; @@ -675,7 +675,7 @@ posix_do_fallocate (call_frame_t *frame, xlator_t *this, fd_t *fd, VALIDATE_OR_GOTO (this, out); VALIDATE_OR_GOTO (fd, out); - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { gf_msg_debug (this->name, 0, "pfd is NULL from fd=%p", fd); goto out; @@ -820,6 +820,7 @@ posix_do_zerofill (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, dict_t *xdata) { int32_t ret = -1; + int32_t op_errno = 0; struct posix_fd *pfd = NULL; gf_boolean_t locked = _gf_false; @@ -831,7 +832,7 @@ posix_do_zerofill (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, VALIDATE_OR_GOTO (this, out); VALIDATE_OR_GOTO (fd, out); - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { gf_msg_debug (this->name, 0, "pfd is NULL from fd=%p", fd); goto out; @@ -1011,7 +1012,7 @@ posix_seek (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, goto out; } - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &err); if (ret < 0) { gf_msg_debug (this->name, 0, "pfd is NULL from fd=%p", fd); goto out; @@ -3060,9 +3061,8 @@ posix_readv (call_frame_t *frame, xlator_t *this, priv = this->private; VALIDATE_OR_GOTO (priv, out); - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { - op_errno = -ret; gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, "pfd is NULL from fd=%p", fd); goto out; @@ -3315,7 +3315,7 @@ posix_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, VALIDATE_OR_GOTO (priv, out); - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { gf_msg (this->name, GF_LOG_WARNING, ret, P_MSG_PFD_NULL, "pfd is NULL from fd=%p", fd); @@ -3501,9 +3501,8 @@ posix_flush (call_frame_t *frame, xlator_t *this, VALIDATE_OR_GOTO (this, out); VALIDATE_OR_GOTO (fd, out); - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { - op_errno = -ret; gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, "pfd is NULL on fd=%p", fd); goto out; @@ -3624,9 +3623,8 @@ posix_fsync (call_frame_t *frame, xlator_t *this, return 0; } - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { - op_errno = -ret; gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, "pfd not found in fd's ctx"); goto out; @@ -4731,10 +4729,9 @@ posix_fgetxattr (call_frame_t *frame, xlator_t *this, SET_FS_ID (frame->root->uid, frame->root->gid); - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { op_ret = -1; - op_errno = -ret; gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, "pfd is NULL from fd=%p", fd); goto out; @@ -4973,9 +4970,8 @@ posix_fsetxattr (call_frame_t *frame, xlator_t *this, VALIDATE_OR_GOTO (fd, out); VALIDATE_OR_GOTO (dict, out); - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { - op_errno = -ret; gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, "pfd is NULL from fd=%p", fd); goto out; @@ -5204,9 +5200,8 @@ posix_fremovexattr (call_frame_t *frame, xlator_t *this, goto out; } - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { - op_errno = -ret; gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, "pfd is NULL from fd=%p", fd); goto out; @@ -5265,9 +5260,8 @@ posix_fsyncdir (call_frame_t *frame, xlator_t *this, VALIDATE_OR_GOTO (this, out); VALIDATE_OR_GOTO (fd, out); - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { - op_errno = -ret; gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, "pfd is NULL, fd=%p", fd); goto out; @@ -5637,12 +5631,12 @@ do_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd, VALIDATE_OR_GOTO (this, out); if (fd) { - op_ret = posix_fd_ctx_get (fd, this, &pfd); + op_ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (op_ret < 0) { - gf_msg (this->name, GF_LOG_WARNING, EBADFD, + gf_msg (this->name, GF_LOG_WARNING, + fop_log_level(GF_FOP_FXATTROP, op_errno), P_MSG_PFD_GET_FAILED, "failed to get pfd from" " fd=%p", fd); - op_errno = EBADFD; goto out; } _fd = pfd->fd; @@ -5772,11 +5766,10 @@ posix_ftruncate (call_frame_t *frame, xlator_t *this, priv = this->private; VALIDATE_OR_GOTO (priv, out); - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { - gf_msg (this->name, GF_LOG_WARNING, -ret, P_MSG_PFD_NULL, + gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, "pfd is NULL, fd=%p", fd); - op_errno = -ret; goto out; } @@ -5842,9 +5835,9 @@ posix_fstat (call_frame_t *frame, xlator_t *this, priv = this->private; VALIDATE_OR_GOTO (priv, out); - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { - gf_msg (this->name, GF_LOG_WARNING, -ret, P_MSG_PFD_NULL, + gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, "pfd is NULL, fd=%p", fd); op_errno = -ret; goto out; @@ -5982,13 +5975,14 @@ posix_fill_readdir (fd_t *fd, DIR *dir, off_t off, size_t size, char *hpath = NULL; int len = 0; int ret = 0; + int op_errno = 0; - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { - gf_msg (this->name, GF_LOG_WARNING, -ret, P_MSG_PFD_NULL, + gf_msg (this->name, GF_LOG_WARNING, op_errno, P_MSG_PFD_NULL, "pfd is NULL, fd=%p", fd); count = -1; - errno = -ret; + errno = op_errno; goto out; } @@ -6272,11 +6266,10 @@ posix_do_readdir (call_frame_t *frame, xlator_t *this, INIT_LIST_HEAD (&entries.list); - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { gf_msg (this->name, GF_LOG_WARNING, -ret, P_MSG_PFD_NULL, "pfd is NULL, fd=%p", fd); - op_errno = -ret; goto out; } @@ -6445,11 +6438,10 @@ posix_rchecksum (call_frame_t *frame, xlator_t *this, goto out; } - ret = posix_fd_ctx_get (fd, this, &pfd); + ret = posix_fd_ctx_get (fd, this, &pfd, &op_errno); if (ret < 0) { gf_msg (this->name, GF_LOG_WARNING, -ret, P_MSG_PFD_NULL, "pfd is NULL, fd=%p", fd); - op_errno = -ret; goto out; } diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h index 12ed884323c..87f91e57747 100644 --- a/xlators/storage/posix/src/posix.h +++ b/xlators/storage/posix/src/posix.h @@ -243,7 +243,8 @@ int posix_gfid_heal (xlator_t *this, const char *path, loc_t *loc, dict_t *xattr int posix_entry_create_xattr_set (xlator_t *this, const char *path, dict_t *dict); -int posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd); +int posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd, + int *op_errno); void posix_fill_ino_from_gfid (xlator_t *this, struct iatt *buf); gf_boolean_t posix_special_xattr (char **pattern, char *key); -- cgit