diff options
author | Sage Weil <sage@inktank.com> | 2013-01-21 01:08:33 -0500 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-02-13 21:26:17 -0500 |
commit | 695b711933689ea51af782760f4b1e2c6a42a631 (patch) | |
tree | c2dba4e701916cf86434f5074bcbf04e5672e526 /fs/ceph/xattr.c | |
parent | 1f08f2b056ea6c2e12f4e95e88949a882a996208 (diff) |
ceph: implement hidden per-field ceph.*.layout.* vxattrs
Allow individual fields of the layout to be fetched via getxattr.
The ceph.dir.layout.* vxattr with "disappear" if the exists_cb
indicates there no dir layout set.
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Sam Lang <sam.lang@inktank.com>
Diffstat (limited to 'fs/ceph/xattr.c')
-rw-r--r-- | fs/ceph/xattr.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index f3c4fe7202c7..2135817e708d 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c | |||
@@ -77,6 +77,46 @@ static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val, | |||
77 | return ret; | 77 | return ret; |
78 | } | 78 | } |
79 | 79 | ||
80 | static size_t ceph_vxattrcb_layout_stripe_unit(struct ceph_inode_info *ci, | ||
81 | char *val, size_t size) | ||
82 | { | ||
83 | return snprintf(val, size, "%lld", | ||
84 | (unsigned long long)ceph_file_layout_su(ci->i_layout)); | ||
85 | } | ||
86 | |||
87 | static size_t ceph_vxattrcb_layout_stripe_count(struct ceph_inode_info *ci, | ||
88 | char *val, size_t size) | ||
89 | { | ||
90 | return snprintf(val, size, "%lld", | ||
91 | (unsigned long long)ceph_file_layout_stripe_count(ci->i_layout)); | ||
92 | } | ||
93 | |||
94 | static size_t ceph_vxattrcb_layout_object_size(struct ceph_inode_info *ci, | ||
95 | char *val, size_t size) | ||
96 | { | ||
97 | return snprintf(val, size, "%lld", | ||
98 | (unsigned long long)ceph_file_layout_object_size(ci->i_layout)); | ||
99 | } | ||
100 | |||
101 | static size_t ceph_vxattrcb_layout_pool(struct ceph_inode_info *ci, | ||
102 | char *val, size_t size) | ||
103 | { | ||
104 | int ret; | ||
105 | struct ceph_fs_client *fsc = ceph_sb_to_client(ci->vfs_inode.i_sb); | ||
106 | struct ceph_osd_client *osdc = &fsc->client->osdc; | ||
107 | s64 pool = ceph_file_layout_pg_pool(ci->i_layout); | ||
108 | const char *pool_name; | ||
109 | |||
110 | down_read(&osdc->map_sem); | ||
111 | pool_name = ceph_pg_pool_name_by_id(osdc->osdmap, pool); | ||
112 | if (pool_name) | ||
113 | ret = snprintf(val, size, "%s", pool_name); | ||
114 | else | ||
115 | ret = snprintf(val, size, "%lld", (unsigned long long)pool); | ||
116 | up_read(&osdc->map_sem); | ||
117 | return ret; | ||
118 | } | ||
119 | |||
80 | /* directories */ | 120 | /* directories */ |
81 | 121 | ||
82 | static size_t ceph_vxattrcb_dir_entries(struct ceph_inode_info *ci, char *val, | 122 | static size_t ceph_vxattrcb_dir_entries(struct ceph_inode_info *ci, char *val, |
@@ -130,6 +170,8 @@ static size_t ceph_vxattrcb_dir_rctime(struct ceph_inode_info *ci, char *val, | |||
130 | 170 | ||
131 | 171 | ||
132 | #define CEPH_XATTR_NAME(_type, _name) XATTR_CEPH_PREFIX #_type "." #_name | 172 | #define CEPH_XATTR_NAME(_type, _name) XATTR_CEPH_PREFIX #_type "." #_name |
173 | #define CEPH_XATTR_NAME2(_type, _name, _name2) \ | ||
174 | XATTR_CEPH_PREFIX #_type "." #_name "." #_name2 | ||
133 | 175 | ||
134 | #define XATTR_NAME_CEPH(_type, _name) \ | 176 | #define XATTR_NAME_CEPH(_type, _name) \ |
135 | { \ | 177 | { \ |
@@ -140,6 +182,15 @@ static size_t ceph_vxattrcb_dir_rctime(struct ceph_inode_info *ci, char *val, | |||
140 | .hidden = false, \ | 182 | .hidden = false, \ |
141 | .exists_cb = NULL, \ | 183 | .exists_cb = NULL, \ |
142 | } | 184 | } |
185 | #define XATTR_LAYOUT_FIELD(_type, _name, _field) \ | ||
186 | { \ | ||
187 | .name = CEPH_XATTR_NAME2(_type, _name, _field), \ | ||
188 | .name_size = sizeof (CEPH_XATTR_NAME2(_type, _name, _field)), \ | ||
189 | .getxattr_cb = ceph_vxattrcb_ ## _name ## _ ## _field, \ | ||
190 | .readonly = false, \ | ||
191 | .hidden = true, \ | ||
192 | .exists_cb = ceph_vxattrcb_layout_exists, \ | ||
193 | } | ||
143 | 194 | ||
144 | static struct ceph_vxattr ceph_dir_vxattrs[] = { | 195 | static struct ceph_vxattr ceph_dir_vxattrs[] = { |
145 | { | 196 | { |
@@ -150,6 +201,10 @@ static struct ceph_vxattr ceph_dir_vxattrs[] = { | |||
150 | .hidden = false, | 201 | .hidden = false, |
151 | .exists_cb = ceph_vxattrcb_layout_exists, | 202 | .exists_cb = ceph_vxattrcb_layout_exists, |
152 | }, | 203 | }, |
204 | XATTR_LAYOUT_FIELD(dir, layout, stripe_unit), | ||
205 | XATTR_LAYOUT_FIELD(dir, layout, stripe_count), | ||
206 | XATTR_LAYOUT_FIELD(dir, layout, object_size), | ||
207 | XATTR_LAYOUT_FIELD(dir, layout, pool), | ||
153 | XATTR_NAME_CEPH(dir, entries), | 208 | XATTR_NAME_CEPH(dir, entries), |
154 | XATTR_NAME_CEPH(dir, files), | 209 | XATTR_NAME_CEPH(dir, files), |
155 | XATTR_NAME_CEPH(dir, subdirs), | 210 | XATTR_NAME_CEPH(dir, subdirs), |
@@ -173,6 +228,10 @@ static struct ceph_vxattr ceph_file_vxattrs[] = { | |||
173 | .hidden = false, | 228 | .hidden = false, |
174 | .exists_cb = ceph_vxattrcb_layout_exists, | 229 | .exists_cb = ceph_vxattrcb_layout_exists, |
175 | }, | 230 | }, |
231 | XATTR_LAYOUT_FIELD(file, layout, stripe_unit), | ||
232 | XATTR_LAYOUT_FIELD(file, layout, stripe_count), | ||
233 | XATTR_LAYOUT_FIELD(file, layout, object_size), | ||
234 | XATTR_LAYOUT_FIELD(file, layout, pool), | ||
176 | { 0 } /* Required table terminator */ | 235 | { 0 } /* Required table terminator */ |
177 | }; | 236 | }; |
178 | static size_t ceph_file_vxattrs_name_size; /* total size of all names */ | 237 | static size_t ceph_file_vxattrs_name_size; /* total size of all names */ |