From: David Disseldorp Date: Thu, 12 Dec 2019 15:26:42 +0000 (+0100) Subject: common: move xattr -> os/filestore/os_xattr X-Git-Tag: v15.1.0~505^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F32219%2Fhead;p=ceph.git common: move xattr -> os/filestore/os_xattr Aside from unittest_chain_xattr, these functions are only used by filestore, so it makes sense to move them out of common. Signed-off-by: David Disseldorp --- diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 46dab5362f2..7affa6d5f6b 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -98,8 +98,7 @@ set(common_srcs url_escape.cc utf8.c util.cc - version.cc - xattr.c) + version.cc) set_source_files_properties(${CMAKE_SOURCE_DIR}/src/common/version.cc APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/src/include/ceph_ver.h) diff --git a/src/common/xattr.c b/src/common/xattr.c deleted file mode 100644 index c7afcf1e1e0..00000000000 --- a/src/common/xattr.c +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Ceph - scalable distributed file system - * - * Copyright (C) 2011 Stanislav Sedov - * - * This is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License version 2.1, as published by the Free Software - * Foundation. See file COPYING. - */ - -#if defined(__FreeBSD__) -#include -#include -#include -#include -#include -#include -#elif defined(__linux__) -#include -#include -#elif defined(__APPLE__) -#include -#include -#else -#error "Your system is not supported!" -#endif - -#include "common/xattr.h" - -/* - * Sets extended attribute on a file. - * Returns 0 on success, -1 on failure. - */ -int -ceph_os_setxattr(const char *path, const char *name, - const void *value, size_t size) -{ - int error = -1; - -#if defined(__FreeBSD__) - error = extattr_set_file(path, EXTATTR_NAMESPACE_USER, name, value, - size); - if (error > 0) - error = 0; -#elif defined(__linux__) - error = setxattr(path, name, value, size, 0); -#elif defined(__APPLE__) - error = setxattr(path, name, value, size, 0 /* position */, 0); -#endif - - return (error); -} - -int -ceph_os_fsetxattr(int fd, const char *name, const void *value, - size_t size) -{ - int error = -1; - -#if defined(__FreeBSD__) - error = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, name, value, size); - if (error > 0) - error = 0; -#elif defined(__linux__) - error = fsetxattr(fd, name, value, size, 0); -#elif defined(__APPLE__) - error = fsetxattr(fd, name, value, size, 0, 0 /* no options should be identical to Linux */ ); -#endif - - return (error); -} - -ssize_t -ceph_os_getxattr(const char *path, const char *name, -void *value, size_t size) -{ - ssize_t error = -1; - -#if defined(__FreeBSD__) - if (value == NULL || size == 0) { - error = extattr_get_file(path, EXTATTR_NAMESPACE_USER, name, value, - size); - } else { - error = extattr_get_file(path, EXTATTR_NAMESPACE_USER, name, NULL, - 0); - if (error > 0) { - if (error > size) { - errno = ERANGE; - error = -1; - } else { - error = extattr_get_file(path, EXTATTR_NAMESPACE_USER, - name, value, size); - } - } - } -#elif defined(__linux__) - error = getxattr(path, name, value, size); -#elif defined(__APPLE__) - 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); -} - -ssize_t -ceph_os_fgetxattr(int fd, const char *name, void *value, - size_t size) -{ - ssize_t error = -1; - -#if defined(__FreeBSD__) - if (value == NULL || size == 0) { - error = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name, value, - size); - } else { - error = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name, NULL, - 0); - if (error > 0) { - if (error > size) { - errno = ERANGE; - error = -1; - } else { - error = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, - name, value, size); - } - } - } -#elif defined(__linux__) - error = fgetxattr(fd, name, value, size); -#elif defined(__APPLE__) - 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); -} - -ssize_t -ceph_os_listxattr(const char *path, char *list, size_t size) -{ - ssize_t error = -1; - -#if defined(__FreeBSD__) - /* - * XXX. The format of the list FreeBSD returns differs - * from the Linux ones. We have to perform the conversion. :-( - */ - char *newlist, *p, *p1; - - if (size != 0) { - newlist = malloc(size); - if (newlist != NULL) { - error = extattr_list_file(path, EXTATTR_NAMESPACE_USER, - newlist, size); - if (error > 0) { - p = newlist; - p1 = list; - while ((p - newlist) < error) { - uint8_t len = *(uint8_t *)p; - p++; - if ((p + len - newlist) > error) - break; - if (len > 0) { - bcopy(p, p1, len); - p += len; - p1 += len; - *p1++ = '\0'; - } - } - error = p1 - list; - } - free(newlist); - } - } else { - error = extattr_list_file(path, EXTATTR_NAMESPACE_USER, - list, size); - } -#elif defined(__linux__) - error = listxattr(path, list, size); -#elif defined(__APPLE__) - error = listxattr(path, list, size, 0); -#endif - - return (error); -} - -ssize_t -ceph_os_flistxattr(int fd, char *list, size_t size) -{ - ssize_t error = -1; - -#if defined(__FreeBSD__) - /* - * XXX. The format of the list FreeBSD returns differs - * from the Linux ones. We have to perform the conversion. :-( - */ - char *newlist, *p, *p1; - - if (size != 0) { - newlist = malloc(size); - if (newlist != NULL) { - error = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, - newlist, size); - if (error > 0) { - p = newlist; - p1 = list; - while ((p - newlist) < error) { - uint8_t len = *(uint8_t *)p; - p++; - if ((p + len - newlist) > error) - break; - if (len > 0) { - bcopy(p, p1, len); - p += len; - p1 += len; - *p1++ = '\0'; - } - } - error = p1 - list; - } - free(newlist); - } - } else { - error = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, - list, size); - } -#elif defined(__linux__) - error = flistxattr(fd, list, size); -#elif defined(__APPLE__) - error = flistxattr(fd, list, size, 0); -#endif - - return (error); -} - -int -ceph_os_removexattr(const char *path, const char *name) -{ - int error = -1; - -#if defined(__FreeBSD__) - error = extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name); -#elif defined(__linux__) - error = removexattr(path, name); -#elif defined(__APPLE__) - error = removexattr(path, name, 0); - /* ENOATTR and ENODATA have different values */ - if (error < 0 && errno == ENOATTR) - errno = ENODATA; -#endif - - return (error); -} - -int -ceph_os_fremovexattr(int fd, const char *name) -{ - int error = -1; - -#if defined(__FreeBSD__) - error = extattr_delete_fd(fd, EXTATTR_NAMESPACE_USER, name); -#elif defined(__linux__) - error = fremovexattr(fd, name); -#elif defined(__APPLE__) - 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/common/xattr.h b/src/common/xattr.h deleted file mode 100644 index 15b356196c9..00000000000 --- a/src/common/xattr.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Ceph - scalable distributed file system - * - * Copyright (C) 2011 Stanislav Sedov - * - * This is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License version 2.1, as published by the Free Software - * Foundation. See file COPYING. - */ - -#ifndef CEPH_EXTATTR_H -#define CEPH_EXTATTR_H - - -#ifdef __cplusplus -extern "C" { -#endif - -// Almost everyone defines ENOATTR, except for Linux, -// which does #define ENOATTR ENODATA. It seems that occasionally that -// isn't defined, though, so let's make sure. -#ifndef ENOATTR -# define ENOATTR ENODATA -#endif - -int ceph_os_setxattr(const char *path, const char *name, - const void *value, size_t size); -int ceph_os_fsetxattr(int fd, const char *name, const void *value, - size_t size); -ssize_t ceph_os_getxattr(const char *path, const char *name, - void *value, size_t size); -ssize_t ceph_os_fgetxattr(int fd, const char *name, void *value, - size_t size); -ssize_t ceph_os_listxattr(const char *path, char *list, size_t size); -ssize_t ceph_os_flistxattr(int fd, char *list, size_t size); -int ceph_os_removexattr(const char *path, const char *name); -int ceph_os_fremovexattr(int fd, const char *name); - -#ifdef __cplusplus -} -#endif - -#endif /* !CEPH_EXTATTR_H */ diff --git a/src/os/CMakeLists.txt b/src/os/CMakeLists.txt index c9de652ee3e..51894fd9a3c 100644 --- a/src/os/CMakeLists.txt +++ b/src/os/CMakeLists.txt @@ -13,6 +13,7 @@ set(libos_srcs filestore/IndexManager.cc filestore/LFNIndex.cc filestore/WBThrottle.cc + filestore/os_xattr.c memstore/MemStore.cc kstore/KStore.cc kstore/kstore_types.cc diff --git a/src/os/filestore/FileStore.cc b/src/os/filestore/FileStore.cc index 03346afba19..d6aceafda17 100644 --- a/src/os/filestore/FileStore.cc +++ b/src/os/filestore/FileStore.cc @@ -36,7 +36,6 @@ #include "include/linux_fiemap.h" -#include "common/xattr.h" #include "chain_xattr.h" #if defined(__APPLE__) || defined(__FreeBSD__) diff --git a/src/os/filestore/chain_xattr.h b/src/os/filestore/chain_xattr.h index a2d17fa64af..99c1aedd429 100644 --- a/src/os/filestore/chain_xattr.h +++ b/src/os/filestore/chain_xattr.h @@ -7,7 +7,7 @@ #include "include/compat.h" #include #include -#include "common/xattr.h" +#include "os_xattr.h" #include "include/ceph_assert.h" #include "include/buffer_fwd.h" diff --git a/src/os/filestore/os_xattr.c b/src/os/filestore/os_xattr.c new file mode 100644 index 00000000000..8de0e1d921a --- /dev/null +++ b/src/os/filestore/os_xattr.c @@ -0,0 +1,278 @@ +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2011 Stanislav Sedov + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + */ + +#if defined(__FreeBSD__) +#include +#include +#include +#include +#include +#include +#elif defined(__linux__) +#include +#include +#elif defined(__APPLE__) +#include +#include +#else +#error "Your system is not supported!" +#endif + +#include "os_xattr.h" + +/* + * Sets extended attribute on a file. + * Returns 0 on success, -1 on failure. + */ +int +ceph_os_setxattr(const char *path, const char *name, + const void *value, size_t size) +{ + int error = -1; + +#if defined(__FreeBSD__) + error = extattr_set_file(path, EXTATTR_NAMESPACE_USER, name, value, + size); + if (error > 0) + error = 0; +#elif defined(__linux__) + error = setxattr(path, name, value, size, 0); +#elif defined(__APPLE__) + error = setxattr(path, name, value, size, 0 /* position */, 0); +#endif + + return (error); +} + +int +ceph_os_fsetxattr(int fd, const char *name, const void *value, + size_t size) +{ + int error = -1; + +#if defined(__FreeBSD__) + error = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, name, value, size); + if (error > 0) + error = 0; +#elif defined(__linux__) + error = fsetxattr(fd, name, value, size, 0); +#elif defined(__APPLE__) + error = fsetxattr(fd, name, value, size, 0, 0 /* no options should be identical to Linux */ ); +#endif + + return (error); +} + +ssize_t +ceph_os_getxattr(const char *path, const char *name, +void *value, size_t size) +{ + ssize_t error = -1; + +#if defined(__FreeBSD__) + if (value == NULL || size == 0) { + error = extattr_get_file(path, EXTATTR_NAMESPACE_USER, name, value, + size); + } else { + error = extattr_get_file(path, EXTATTR_NAMESPACE_USER, name, NULL, + 0); + if (error > 0) { + if (error > size) { + errno = ERANGE; + error = -1; + } else { + error = extattr_get_file(path, EXTATTR_NAMESPACE_USER, + name, value, size); + } + } + } +#elif defined(__linux__) + error = getxattr(path, name, value, size); +#elif defined(__APPLE__) + 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); +} + +ssize_t +ceph_os_fgetxattr(int fd, const char *name, void *value, + size_t size) +{ + ssize_t error = -1; + +#if defined(__FreeBSD__) + if (value == NULL || size == 0) { + error = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name, value, + size); + } else { + error = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name, NULL, + 0); + if (error > 0) { + if (error > size) { + errno = ERANGE; + error = -1; + } else { + error = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, + name, value, size); + } + } + } +#elif defined(__linux__) + error = fgetxattr(fd, name, value, size); +#elif defined(__APPLE__) + 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); +} + +ssize_t +ceph_os_listxattr(const char *path, char *list, size_t size) +{ + ssize_t error = -1; + +#if defined(__FreeBSD__) + /* + * XXX. The format of the list FreeBSD returns differs + * from the Linux ones. We have to perform the conversion. :-( + */ + char *newlist, *p, *p1; + + if (size != 0) { + newlist = malloc(size); + if (newlist != NULL) { + error = extattr_list_file(path, EXTATTR_NAMESPACE_USER, + newlist, size); + if (error > 0) { + p = newlist; + p1 = list; + while ((p - newlist) < error) { + uint8_t len = *(uint8_t *)p; + p++; + if ((p + len - newlist) > error) + break; + if (len > 0) { + bcopy(p, p1, len); + p += len; + p1 += len; + *p1++ = '\0'; + } + } + error = p1 - list; + } + free(newlist); + } + } else { + error = extattr_list_file(path, EXTATTR_NAMESPACE_USER, + list, size); + } +#elif defined(__linux__) + error = listxattr(path, list, size); +#elif defined(__APPLE__) + error = listxattr(path, list, size, 0); +#endif + + return (error); +} + +ssize_t +ceph_os_flistxattr(int fd, char *list, size_t size) +{ + ssize_t error = -1; + +#if defined(__FreeBSD__) + /* + * XXX. The format of the list FreeBSD returns differs + * from the Linux ones. We have to perform the conversion. :-( + */ + char *newlist, *p, *p1; + + if (size != 0) { + newlist = malloc(size); + if (newlist != NULL) { + error = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, + newlist, size); + if (error > 0) { + p = newlist; + p1 = list; + while ((p - newlist) < error) { + uint8_t len = *(uint8_t *)p; + p++; + if ((p + len - newlist) > error) + break; + if (len > 0) { + bcopy(p, p1, len); + p += len; + p1 += len; + *p1++ = '\0'; + } + } + error = p1 - list; + } + free(newlist); + } + } else { + error = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, + list, size); + } +#elif defined(__linux__) + error = flistxattr(fd, list, size); +#elif defined(__APPLE__) + error = flistxattr(fd, list, size, 0); +#endif + + return (error); +} + +int +ceph_os_removexattr(const char *path, const char *name) +{ + int error = -1; + +#if defined(__FreeBSD__) + error = extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name); +#elif defined(__linux__) + error = removexattr(path, name); +#elif defined(__APPLE__) + error = removexattr(path, name, 0); + /* ENOATTR and ENODATA have different values */ + if (error < 0 && errno == ENOATTR) + errno = ENODATA; +#endif + + return (error); +} + +int +ceph_os_fremovexattr(int fd, const char *name) +{ + int error = -1; + +#if defined(__FreeBSD__) + error = extattr_delete_fd(fd, EXTATTR_NAMESPACE_USER, name); +#elif defined(__linux__) + error = fremovexattr(fd, name); +#elif defined(__APPLE__) + 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/os/filestore/os_xattr.h b/src/os/filestore/os_xattr.h new file mode 100644 index 00000000000..15b356196c9 --- /dev/null +++ b/src/os/filestore/os_xattr.h @@ -0,0 +1,44 @@ +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2011 Stanislav Sedov + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + */ + +#ifndef CEPH_EXTATTR_H +#define CEPH_EXTATTR_H + + +#ifdef __cplusplus +extern "C" { +#endif + +// Almost everyone defines ENOATTR, except for Linux, +// which does #define ENOATTR ENODATA. It seems that occasionally that +// isn't defined, though, so let's make sure. +#ifndef ENOATTR +# define ENOATTR ENODATA +#endif + +int ceph_os_setxattr(const char *path, const char *name, + const void *value, size_t size); +int ceph_os_fsetxattr(int fd, const char *name, const void *value, + size_t size); +ssize_t ceph_os_getxattr(const char *path, const char *name, + void *value, size_t size); +ssize_t ceph_os_fgetxattr(int fd, const char *name, void *value, + size_t size); +ssize_t ceph_os_listxattr(const char *path, char *list, size_t size); +ssize_t ceph_os_flistxattr(int fd, char *list, size_t size); +int ceph_os_removexattr(const char *path, const char *name); +int ceph_os_fremovexattr(int fd, const char *name); + +#ifdef __cplusplus +} +#endif + +#endif /* !CEPH_EXTATTR_H */