diff options
author | Sage Weil <sage@inktank.com> | 2013-01-19 09:05:59 -0800 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-02-04 12:09:41 -0800 |
commit | 99824b93cec93daaa0d536f031eb3b6180f94e3b (patch) | |
tree | 62b083ad5d48e3bdc6d70ebcabc5834ceb916129 | |
parent | 809cff488ea1ffa299edd678ba6260993771bde3 (diff) | |
download | ceph-99824b93cec93daaa0d536f031eb3b6180f94e3b.tar.gz |
client: list only aggregate xattr, but allow setting subfield xattrs
Signed-off-by: Sage Weil <sage@inktank.com>
(cherry picked from commit ba32ea9454d36072ec5ea3e6483dc3daf9199903)
-rw-r--r-- | src/client/Client.cc | 67 |
1 files changed, 34 insertions, 33 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc index be8243e477b..94b976c510e 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -6392,31 +6392,41 @@ int Client::lsetxattr(const char *path, const char *name, const void *value, siz int Client::_getxattr(Inode *in, const char *name, void *value, size_t size, int uid, int gid) { - int r = -ENODATA; + int r; if (strncmp(name, "ceph.", 5) == 0) { string n(name); - char buf[32]; - size_t buf_size = sizeof(buf); - if (in->is_file()) { - if (n == "ceph.file.layout.stripe_unit") { - r = snprintf(buf, buf_size, "%lu", (long unsigned)in->layout.fl_stripe_unit); - } else if (n == "ceph.file.layout.stripe_count") { - r = snprintf(buf, buf_size, "%lu", (long unsigned)in->layout.fl_stripe_count); - } else if (n == "ceph.file.layout.object_size") { - r = snprintf(buf, buf_size, "%lu", (long unsigned)in->layout.fl_object_size); - } else if (n == "ceph.file.layout.pool") { - r = snprintf(buf, buf_size, "%lu", (long unsigned)in->layout.fl_pg_pool); - } - } else if (in->is_dir() && in->has_dir_layout()) { - if (n == "ceph.dir.layout.stripe_unit") { - r = snprintf(buf, buf_size, "%lu", (long unsigned)in->layout.fl_stripe_unit); - } else if (n == "ceph.dir.layout.stripe_count") { - r = snprintf(buf, buf_size, "%lu", (long unsigned)in->layout.fl_stripe_count); - } else if (n == "ceph.dir.layout.object_size") { - r = snprintf(buf, buf_size, "%lu", (long unsigned)in->layout.fl_object_size); - } else if (n == "ceph.dir.layout.pool") { - r = snprintf(buf, buf_size, "%lu", (long unsigned)in->layout.fl_pg_pool); + char buf[256]; + + r = -ENODATA; + if ((in->is_file() && n.find("ceph.file.layout") == 0) || + (in->is_dir() && in->has_dir_layout() && n.find("ceph.dir.layout") == 0)) { + string rest = n.substr(n.find("layout")); + if (rest == "layout") { + r = snprintf(buf, sizeof(buf), + "stripe_unit=%lu stripe_count=%lu object_size=%lu pool=", + (long unsigned)in->layout.fl_stripe_unit, + (long unsigned)in->layout.fl_stripe_count, + (long unsigned)in->layout.fl_object_size); + if (osdmap->have_pg_pool(in->layout.fl_pg_pool)) + r += snprintf(buf + r, sizeof(buf) - r, "%s", + osdmap->get_pool_name(in->layout.fl_pg_pool)); + else + r += snprintf(buf + r, sizeof(buf) - r, "%lu", + (long unsigned)in->layout.fl_pg_pool); + } else if (rest == "layout.stripe_unit") { + r = snprintf(buf, sizeof(buf), "%lu", (long unsigned)in->layout.fl_stripe_unit); + } else if (rest == "layout.stripe_count") { + r = snprintf(buf, sizeof(buf), "%lu", (long unsigned)in->layout.fl_stripe_count); + } else if (rest == "layout.object_size") { + r = snprintf(buf, sizeof(buf), "%lu", (long unsigned)in->layout.fl_object_size); + } else if (rest == "layout.pool") { + if (osdmap->have_pg_pool(in->layout.fl_pg_pool)) + r = snprintf(buf, sizeof(buf), "%s", + osdmap->get_pool_name(in->layout.fl_pg_pool)); + else + r = snprintf(buf, sizeof(buf), "%lu", + (long unsigned)in->layout.fl_pg_pool); } } if (size != 0) { @@ -6462,17 +6472,8 @@ int Client::ll_getxattr(vinodeno_t vino, const char *name, void *value, size_t s int Client::_listxattr(Inode *in, char *name, size_t size, int uid, int gid) { - const char file_vxattrs[] = - "ceph.file.layout.stripe_unit\0" - "ceph.file.layout.stripe_count\0" - "ceph.file.layout.object_size\0" - "ceph.file.layout.pool\0"; - const char dir_vxattrs[] = - "ceph.dir.layout.stripe_unit\0" - "ceph.dir.layout.stripe_count\0" - "ceph.dir.layout.object_size\0" - "ceph.dir.layout.pool\0"; - + const char file_vxattrs[] = "ceph.file.layout"; + const char dir_vxattrs[] = "ceph.dir.layout"; int r = _getattr(in, CEPH_STAT_CAP_XATTR, uid, gid); if (r == 0) { for (map<string,bufferptr>::iterator p = in->xattrs.begin(); |