From: Yan, Zheng Date: Mon, 27 Jul 2015 08:01:31 +0000 (+0800) Subject: xattr: convert ENOATTR to ENODATA on DARWIN X-Git-Tag: v9.1.0~259^2~18 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5db6915d80f2ad5d5bf1896d26060cfac5fdb502;p=ceph.git xattr: convert ENOATTR to ENODATA on DARWIN On Darwin, getxattr/removexattr return ENOATTR when extended attribute does not exist. But lots of ceph codes expect ENODATA is returned in that case. On Darwin, ENOATTR and ENODATA have different values, so we convert ENOATTR to ENODATA. Signed-off-by: Yan, Zheng --- diff --git a/src/common/xattr.c b/src/common/xattr.c index b2e522b8804..caa31d52704 100644 --- a/src/common/xattr.c +++ b/src/common/xattr.c @@ -98,6 +98,9 @@ void *value, size_t size) error = getxattr(path, name, value, size); #elif defined(DARWIN) error = getxattr(path, name, value, size, 0 /* position */, 0); + /* ENOATTR and ENODATA have different values */ + if (error < 0 && errno == ENOATTR) + errno = ENODATA; #endif return (error); @@ -130,6 +133,9 @@ ceph_os_fgetxattr(int fd, const char *name, void *value, error = fgetxattr(fd, name, value, size); #elif defined(DARWIN) error = fgetxattr(fd, name, value, size, 0, 0 /* no options */); + /* ENOATTR and ENODATA have different values */ + if (error < 0 && errno == ENOATTR) + errno = ENODATA; #endif return (error); @@ -244,6 +250,9 @@ ceph_os_removexattr(const char *path, const char *name) error = removexattr(path, name); #elif defined(DARWIN) error = removexattr(path, name, 0); + /* ENOATTR and ENODATA have different values */ + if (error < 0 && errno == ENOATTR) + errno = ENODATA; #endif return (error); @@ -260,6 +269,9 @@ ceph_os_fremovexattr(int fd, const char *name) error = fremovexattr(fd, name); #elif defined(DARWIN) error = fremovexattr(fd, name, 0); + /* ENOATTR and ENODATA have different values */ + if (error < 0 && errno == ENOATTR) + errno = ENODATA; #endif return (error); diff --git a/src/include/compat.h b/src/include/compat.h index 25d3d7602f1..caabe10df0e 100644 --- a/src/include/compat.h +++ b/src/include/compat.h @@ -13,7 +13,7 @@ #define CEPH_COMPAT_H #if defined(__FreeBSD__) -#define ENODATA 61 +#define ENODATA ENOATTR #define MSG_MORE 0 #endif /* !__FreeBSD__ */ diff --git a/src/os/chain_xattr.cc b/src/os/chain_xattr.cc index 24b463435b4..f50a9ccf011 100644 --- a/src/os/chain_xattr.cc +++ b/src/os/chain_xattr.cc @@ -138,7 +138,7 @@ int chain_getxattr(const char *fn, const char *name, void *val, size_t size) get_raw_xattr_name(name, i, raw_name, sizeof(raw_name)); r = sys_getxattr(fn, raw_name, (char *)val + pos, chunk_size); - if (i && r == -ENOATTR) { + if (i && r == -ENODATA) { ret = pos; break; } @@ -209,7 +209,7 @@ int chain_fgetxattr(int fd, const char *name, void *val, size_t size) get_raw_xattr_name(name, i, raw_name, sizeof(raw_name)); r = sys_fgetxattr(fd, raw_name, (char *)val + pos, chunk_size); - if (i && r == -ENOATTR) { + if (i && r == -ENODATA) { ret = pos; break; } @@ -282,10 +282,10 @@ int chain_setxattr(const char *fn, const char *name, const void *val, size_t siz do { get_raw_xattr_name(name, i, raw_name, sizeof(raw_name)); r = sys_removexattr(fn, raw_name); - if (r < 0 && r != -ENOATTR) + if (r < 0 && r != -ENODATA) ret = r; i++; - } while (r != -ENOATTR); + } while (r != -ENODATA); } return ret; @@ -318,10 +318,10 @@ int chain_fsetxattr(int fd, const char *name, const void *val, size_t size) do { get_raw_xattr_name(name, i, raw_name, sizeof(raw_name)); r = sys_fremovexattr(fd, raw_name); - if (r < 0 && r != -ENOATTR) + if (r < 0 && r != -ENODATA) ret = r; i++; - } while (r != -ENOATTR); + } while (r != -ENODATA); } return ret;