Skip xattrs with unidentified "system." prefix to avoid ENODATA error. Such as building AOSP on NFSv4 servers.
Signed-off-by: Weizhao Ouyang <[email protected]> --- include/erofs/xattr.h | 6 ++++++ lib/xattr.c | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/erofs/xattr.h b/include/erofs/xattr.h index 9efadc5e5e80..de078a5eb08a 100644 --- a/include/erofs/xattr.h +++ b/include/erofs/xattr.h @@ -41,6 +41,12 @@ static inline unsigned int xattrblock_offset(unsigned int xattr_id) (_size - sizeof(struct erofs_xattr_ibody_header)) / \ sizeof(struct erofs_xattr_entry) + 1; }) +#ifndef XATTR_SYSTEM_PREFIX +#define XATTR_SYSTEM_PREFIX "system." +#endif +#ifndef XATTR_SYSTEM_PREFIX_LEN +#define XATTR_SYSTEM_PREFIX_LEN (sizeof(XATTR_SYSTEM_PREFIX) - 1) +#endif #ifndef XATTR_USER_PREFIX #define XATTR_USER_PREFIX "user." #endif diff --git a/lib/xattr.c b/lib/xattr.c index 6034e7b6b4eb..7c776330bdaa 100644 --- a/lib/xattr.c +++ b/lib/xattr.c @@ -288,6 +288,18 @@ static bool erofs_is_skipped_xattr(const char *key) if (cfg.sehnd && !strcmp(key, XATTR_SECURITY_PREFIX "selinux")) return true; #endif + + /* skip xattrs with unidentified "system." prefix */ + if (!strncmp(key, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) { + if (!strcmp(key, XATTR_NAME_POSIX_ACL_ACCESS) || + !strcmp(key, XATTR_NAME_POSIX_ACL_DEFAULT)) { + return false; + } else { + erofs_warn("skip unidentified xattr: %s", key); + return true; + } + } + return false; } -- 2.25.1
