From e2c916078ea33fe14a208c5b4ba6fe8e52ecda1a Mon Sep 17 00:00:00 2001 From: Emmanuel Dreyfus Date: Sat, 6 Sep 2014 06:27:03 +0200 Subject: Always check for ENODATA with ENOATTR Linux defines ENODATA and ENOATTR with the same value, which means that code can miss on on the two without breaking. FreeBSD does not have ENODATA and GlusterFS defines it as ENOATTR just like Linux does. On NetBSD, ENODATA != ENOATTR, hence we need to check for both values to get portable behavior. This is a backport of I003a3af055fdad285d235f2a0c192c9cce56fab8 BUG: 1138897 Change-Id: I272cd53e637993c7fd2ac74bd607001d3581ced7 Signed-off-by: Emmanuel Dreyfus Reviewed-on: http://review.gluster.org/8634 Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- xlators/storage/posix/src/posix-handle.c | 2 +- xlators/storage/posix/src/posix-handle.h | 2 +- xlators/storage/posix/src/posix.c | 20 ++++++++++++-------- 3 files changed, 14 insertions(+), 10 deletions(-) (limited to 'xlators/storage/posix/src') diff --git a/xlators/storage/posix/src/posix-handle.c b/xlators/storage/posix/src/posix-handle.c index b6cfbd081ea..46ef5ada1f1 100644 --- a/xlators/storage/posix/src/posix-handle.c +++ b/xlators/storage/posix/src/posix-handle.c @@ -549,7 +549,7 @@ posix_does_old_trash_exists (char *old_trash) ret = lstat (old_trash, &stbuf); if ((ret == 0) && S_ISDIR (stbuf.st_mode)) { ret = sys_lgetxattr (old_trash, "trusted.gfid", gfid, 16); - if ((ret < 0) && (errno == ENODATA)) + if ((ret < 0) && (errno == ENODATA || errno == ENOATTR) ) exists = _gf_true; } return exists; diff --git a/xlators/storage/posix/src/posix-handle.h b/xlators/storage/posix/src/posix-handle.h index 0f596b6069e..0654bcd5ee0 100644 --- a/xlators/storage/posix/src/posix-handle.h +++ b/xlators/storage/posix/src/posix-handle.h @@ -66,7 +66,7 @@ op_ret = sys_lgetxattr (path, key, &value, sizeof (value)); \ if (op_ret == -1) { \ op_errno = errno; \ - if (op_errno == ENOATTR) { \ + if (op_errno == ENOATTR || op_errno == ENODATA) { \ value = 1; \ } else { \ gf_log (this->name, GF_LOG_WARNING,"getting xattr " \ diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index eb0bac66d06..561b8f7f019 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -3792,8 +3792,9 @@ posix_fgetxattr (call_frame_t *frame, xlator_t *this, size = sys_fgetxattr (_fd, key, NULL, 0); if (size <= 0) { op_errno = errno; - gf_log (this->name, ((errno == ENODATA) ? - GF_LOG_DEBUG : GF_LOG_ERROR), + gf_log (this->name, + ((errno == ENODATA || errno == ENOATTR) ? + GF_LOG_DEBUG : GF_LOG_ERROR), "fgetxattr failed on key %s (%s)", key, strerror (op_errno)); goto done; @@ -4013,7 +4014,7 @@ _posix_remove_xattr (dict_t *dict, char *key, data_t *value, void *data) op_ret = sys_lremovexattr (filler->real_path, key); if (op_ret == -1) { filler->op_errno = errno; - if (errno != ENOATTR && errno != EPERM) + if (errno != ENOATTR && errno != ENODATA && errno != EPERM) gf_log (this->name, GF_LOG_ERROR, "removexattr failed on %s (for %s): %s", filler->real_path, key, strerror (errno)); @@ -4073,7 +4074,8 @@ posix_removexattr (call_frame_t *frame, xlator_t *this, op_ret = sys_lremovexattr (real_path, name); if (op_ret == -1) { op_errno = errno; - if (op_errno != ENOATTR && op_errno != EPERM) + if (op_errno != ENOATTR && op_errno != ENODATA && + op_errno != EPERM) gf_log (this->name, GF_LOG_ERROR, "removexattr on %s (for %s): %s", real_path, name, strerror (op_errno)); @@ -4128,7 +4130,8 @@ posix_fremovexattr (call_frame_t *frame, xlator_t *this, op_ret = sys_fremovexattr (_fd, name); if (op_ret == -1) { op_errno = errno; - if (op_errno != ENOATTR && op_errno != EPERM) + if (op_errno != ENOATTR && op_errno != ENODATA && + op_errno != EPERM) gf_log (this->name, GF_LOG_ERROR, "fremovexattr (for %s): %s", name, strerror (op_errno)); @@ -5398,15 +5401,16 @@ init (xlator_t *this) ret = -1; goto out; } - } else if ((size == -1) && (errno == ENODATA)) { - + } else if ((size == -1) && + (errno == ENODATA || errno == ENOATTR)) { gf_log (this->name, GF_LOG_ERROR, "Extended attribute trusted.glusterfs." "volume-id is absent"); ret = -1; goto out; - } else if ((size == -1) && (errno != ENODATA)) { + } else if ((size == -1) && (errno != ENODATA) && + (errno != ENOATTR)) { /* Wrong 'volume-id' is set, it should be error */ gf_log (this->name, GF_LOG_WARNING, "%s: failed to fetch volume-id (%s)", -- cgit