]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
xattr: convert ENOATTR to ENODATA on DARWIN
authorYan, Zheng <zyan@redhat.com>
Mon, 27 Jul 2015 08:01:31 +0000 (16:01 +0800)
committerKefu Chai <kchai@redhat.com>
Mon, 31 Aug 2015 08:00:25 +0000 (16:00 +0800)
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 <zyan@redhat.com>
src/common/xattr.c
src/include/compat.h
src/os/chain_xattr.cc

index b2e522b880413cfc734fb108a622b8b1be61ad99..caa31d5270456a2750aafbe9e566f0ceefaa53a8 100644 (file)
@@ -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);
index 25d3d7602f19c4fe9c7a9c82a32ae0c6a3758844..caabe10df0e36566d1749b6bafd9e290846e0be1 100644 (file)
@@ -13,7 +13,7 @@
 #define CEPH_COMPAT_H
 
 #if defined(__FreeBSD__)
-#define        ENODATA 61
+#define        ENODATA ENOATTR
 #define        MSG_MORE 0
 #endif /* !__FreeBSD__ */
 
index 24b463435b44f82c581e4196b626fe137adf94ed..f50a9ccf011d99418a405b9c6b5e9ad603d4b60c 100644 (file)
@@ -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;