From 4f6d513366236eabbb5c9b5b62accb77ceed6873 Mon Sep 17 00:00:00 2001 From: Ma Jianpeng Date: Thu, 7 Aug 2014 21:33:18 +0800 Subject: [PATCH] os/chain_xattr: Remove all old xattr entry when overwrite the xattr. Ceph use multiple xattrs to store the value of a single xattr which size is larger than CHAIN_XATTR_MAX_BLOCK_LEN. But when overwote the content of xattr in func chain_setxattr/chain_fsetxattr, we don't know the size of previous content of the xattr. So we only try to remove until system return -ENODATA. Signed-off-by: Ma Jianpeng --- src/os/chain_xattr.cc | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/os/chain_xattr.cc b/src/os/chain_xattr.cc index c020c9db84398..5c80c573da7aa 100644 --- a/src/os/chain_xattr.cc +++ b/src/os/chain_xattr.cc @@ -252,13 +252,15 @@ int chain_setxattr(const char *fn, const char *name, const void *val, size_t siz i++; } while (size); - /* if we're exactly at a chunk size, remove the next one (if wasn't removed - before) */ - if (ret >= 0 && chunk_size == CHAIN_XATTR_MAX_BLOCK_LEN) { - get_raw_xattr_name(name, i, raw_name, sizeof(raw_name)); - int r = sys_removexattr(fn, raw_name); - if (r < 0 && r != -ENODATA) - ret = r; + if (ret >= 0 ) { + int r; + do { + get_raw_xattr_name(name, i, raw_name, sizeof(raw_name)); + r = sys_removexattr(fn, raw_name); + if (r < 0 && r != -ENODATA) + ret = r; + i++; + } while (r != -ENODATA); } return ret; @@ -286,13 +288,15 @@ int chain_fsetxattr(int fd, const char *name, const void *val, size_t size) i++; } while (size); - /* if we're exactly at a chunk size, remove the next one (if wasn't removed - before) */ - if (ret >= 0 && chunk_size == CHAIN_XATTR_MAX_BLOCK_LEN) { - get_raw_xattr_name(name, i, raw_name, sizeof(raw_name)); - int r = sys_fremovexattr(fd, raw_name); - if (r < 0 && r != -ENODATA) - ret = r; + if (ret >= 0) { + int r; + do { + get_raw_xattr_name(name, i, raw_name, sizeof(raw_name)); + r = sys_fremovexattr(fd, raw_name); + if (r < 0 && r != -ENODATA) + ret = r; + i++; + } while (r != -ENODATA); } return ret; -- 2.39.5