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 b2e522b88041..caa31d527045 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 25d3d7602f19..caabe10df0e3 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 24b463435b44..f50a9ccf011d 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;