summaryrefslogtreecommitdiffstats
path: root/xlators/storage/posix
diff options
context:
space:
mode:
authorPranith Kumar K <pkarampu@redhat.com>2016-06-07 21:27:10 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2016-06-26 23:18:13 -0700
commitd5088c056d5aee1bda2997ad5835379465fed3a1 (patch)
tree122fa5d61e5a0e4dd668fb77cbe814e8267b7131 /xlators/storage/posix
parent0d280e0b7f2042e78b8d94a48d5e3bcc5c13f422 (diff)
storage/posix: Give correct errno for anon-fd operations
Change-Id: Ia9e61d3baa6881eb7dc03dd8ddb6bfdde5a01958 BUG: 1343906 Signed-off-by: Pranith Kumar K <pkarampu@redhat.com> Reviewed-on: http://review.gluster.org/14669 Smoke: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'xlators/storage/posix')
-rw-r--r--xlators/storage/posix/src/posix-aio.c6
-rw-r--r--xlators/storage/posix/src/posix-helpers.c29
-rw-r--r--xlators/storage/posix/src/posix.c62
-rw-r--r--xlators/storage/posix/src/posix.h3
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);