diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-21 15:38:28 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-21 15:38:28 -0400 |
| commit | 2017bd19454ea7cdae19922d15b6930f6c8088a2 (patch) | |
| tree | 53974657ab3a2c98f2da7b3fcb050ff5b697f876 /fs/ceph/debugfs.c | |
| parent | 9f1ad09493451c19d00c004da479acf699eeedd6 (diff) | |
| parent | efa4c1206eaff047c474af2136748a58eb8cc33b (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client: (22 commits)
ceph: do not carry i_lock for readdir from dcache
fs/ceph/xattr.c: Use kmemdup
rbd: passing wrong variable to bvec_kunmap_irq()
rbd: null vs ERR_PTR
ceph: fix num_pages_free accounting in pagelist
ceph: add CEPH_MDS_OP_SETDIRLAYOUT and associated ioctl.
ceph: don't crash when passed bad mount options
ceph: fix debugfs warnings
block: rbd: removing unnecessary test
block: rbd: fixed may leaks
ceph: switch from BKL to lock_flocks()
ceph: preallocate flock state without locks held
ceph: add pagelist_reserve, pagelist_truncate, pagelist_set_cursor
ceph: use mapping->nrpages to determine if mapping is empty
ceph: only invalidate on check_caps if we actually have pages
ceph: do not hide .snap in root directory
rbd: introduce rados block device (rbd), based on libceph
ceph: factor out libceph from Ceph file system
ceph-rbd: osdc support for osd call and rollback operations
ceph: messenger and osdc changes for rbd
...
Diffstat (limited to 'fs/ceph/debugfs.c')
| -rw-r--r-- | fs/ceph/debugfs.c | 406 |
1 files changed, 94 insertions, 312 deletions
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c index 6fd8b20a8611..7ae1b3d55b58 100644 --- a/fs/ceph/debugfs.c +++ b/fs/ceph/debugfs.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | #include "ceph_debug.h" | 1 | #include <linux/ceph/ceph_debug.h> |
| 2 | 2 | ||
| 3 | #include <linux/device.h> | 3 | #include <linux/device.h> |
| 4 | #include <linux/slab.h> | 4 | #include <linux/slab.h> |
| @@ -7,143 +7,49 @@ | |||
| 7 | #include <linux/debugfs.h> | 7 | #include <linux/debugfs.h> |
| 8 | #include <linux/seq_file.h> | 8 | #include <linux/seq_file.h> |
| 9 | 9 | ||
| 10 | #include <linux/ceph/libceph.h> | ||
| 11 | #include <linux/ceph/mon_client.h> | ||
| 12 | #include <linux/ceph/auth.h> | ||
| 13 | #include <linux/ceph/debugfs.h> | ||
| 14 | |||
| 10 | #include "super.h" | 15 | #include "super.h" |
| 11 | #include "mds_client.h" | ||
| 12 | #include "mon_client.h" | ||
| 13 | #include "auth.h" | ||
| 14 | 16 | ||
| 15 | #ifdef CONFIG_DEBUG_FS | 17 | #ifdef CONFIG_DEBUG_FS |
| 16 | 18 | ||
| 17 | /* | 19 | #include "mds_client.h" |
| 18 | * Implement /sys/kernel/debug/ceph fun | ||
| 19 | * | ||
| 20 | * /sys/kernel/debug/ceph/client* - an instance of the ceph client | ||
| 21 | * .../osdmap - current osdmap | ||
| 22 | * .../mdsmap - current mdsmap | ||
| 23 | * .../monmap - current monmap | ||
| 24 | * .../osdc - active osd requests | ||
| 25 | * .../mdsc - active mds requests | ||
| 26 | * .../monc - mon client state | ||
| 27 | * .../dentry_lru - dump contents of dentry lru | ||
| 28 | * .../caps - expose cap (reservation) stats | ||
| 29 | * .../bdi - symlink to ../../bdi/something | ||
| 30 | */ | ||
| 31 | |||
| 32 | static struct dentry *ceph_debugfs_dir; | ||
| 33 | |||
| 34 | static int monmap_show(struct seq_file *s, void *p) | ||
| 35 | { | ||
| 36 | int i; | ||
| 37 | struct ceph_client *client = s->private; | ||
| 38 | |||
| 39 | if (client->monc.monmap == NULL) | ||
| 40 | return 0; | ||
| 41 | |||
| 42 | seq_printf(s, "epoch %d\n", client->monc.monmap->epoch); | ||
| 43 | for (i = 0; i < client->monc.monmap->num_mon; i++) { | ||
| 44 | struct ceph_entity_inst *inst = | ||
| 45 | &client->monc.monmap->mon_inst[i]; | ||
| 46 | |||
| 47 | seq_printf(s, "\t%s%lld\t%s\n", | ||
| 48 | ENTITY_NAME(inst->name), | ||
| 49 | pr_addr(&inst->addr.in_addr)); | ||
| 50 | } | ||
| 51 | return 0; | ||
| 52 | } | ||
| 53 | 20 | ||
| 54 | static int mdsmap_show(struct seq_file *s, void *p) | 21 | static int mdsmap_show(struct seq_file *s, void *p) |
| 55 | { | 22 | { |
| 56 | int i; | 23 | int i; |
| 57 | struct ceph_client *client = s->private; | 24 | struct ceph_fs_client *fsc = s->private; |
| 58 | 25 | ||
| 59 | if (client->mdsc.mdsmap == NULL) | 26 | if (fsc->mdsc == NULL || fsc->mdsc->mdsmap == NULL) |
| 60 | return 0; | 27 | return 0; |
| 61 | seq_printf(s, "epoch %d\n", client->mdsc.mdsmap->m_epoch); | 28 | seq_printf(s, "epoch %d\n", fsc->mdsc->mdsmap->m_epoch); |
| 62 | seq_printf(s, "root %d\n", client->mdsc.mdsmap->m_root); | 29 | seq_printf(s, "root %d\n", fsc->mdsc->mdsmap->m_root); |
| 63 | seq_printf(s, "session_timeout %d\n", | 30 | seq_printf(s, "session_timeout %d\n", |
| 64 | client->mdsc.mdsmap->m_session_timeout); | 31 | fsc->mdsc->mdsmap->m_session_timeout); |
| 65 | seq_printf(s, "session_autoclose %d\n", | 32 | seq_printf(s, "session_autoclose %d\n", |
| 66 | client->mdsc.mdsmap->m_session_autoclose); | 33 | fsc->mdsc->mdsmap->m_session_autoclose); |
| 67 | for (i = 0; i < client->mdsc.mdsmap->m_max_mds; i++) { | 34 | for (i = 0; i < fsc->mdsc->mdsmap->m_max_mds; i++) { |
| 68 | struct ceph_entity_addr *addr = | 35 | struct ceph_entity_addr *addr = |
| 69 | &client->mdsc.mdsmap->m_info[i].addr; | 36 | &fsc->mdsc->mdsmap->m_info[i].addr; |
| 70 | int state = client->mdsc.mdsmap->m_info[i].state; | 37 | int state = fsc->mdsc->mdsmap->m_info[i].state; |
| 71 | 38 | ||
| 72 | seq_printf(s, "\tmds%d\t%s\t(%s)\n", i, pr_addr(&addr->in_addr), | 39 | seq_printf(s, "\tmds%d\t%s\t(%s)\n", i, |
| 40 | ceph_pr_addr(&addr->in_addr), | ||
| 73 | ceph_mds_state_name(state)); | 41 | ceph_mds_state_name(state)); |
| 74 | } | 42 | } |
| 75 | return 0; | 43 | return 0; |
| 76 | } | 44 | } |
| 77 | 45 | ||
| 78 | static int osdmap_show(struct seq_file *s, void *p) | 46 | /* |
| 79 | { | 47 | * mdsc debugfs |
| 80 | int i; | 48 | */ |
| 81 | struct ceph_client *client = s->private; | ||
| 82 | struct rb_node *n; | ||
| 83 | |||
| 84 | if (client->osdc.osdmap == NULL) | ||
| 85 | return 0; | ||
| 86 | seq_printf(s, "epoch %d\n", client->osdc.osdmap->epoch); | ||
| 87 | seq_printf(s, "flags%s%s\n", | ||
| 88 | (client->osdc.osdmap->flags & CEPH_OSDMAP_NEARFULL) ? | ||
| 89 | " NEARFULL" : "", | ||
| 90 | (client->osdc.osdmap->flags & CEPH_OSDMAP_FULL) ? | ||
| 91 | " FULL" : ""); | ||
| 92 | for (n = rb_first(&client->osdc.osdmap->pg_pools); n; n = rb_next(n)) { | ||
| 93 | struct ceph_pg_pool_info *pool = | ||
| 94 | rb_entry(n, struct ceph_pg_pool_info, node); | ||
| 95 | seq_printf(s, "pg_pool %d pg_num %d / %d, lpg_num %d / %d\n", | ||
| 96 | pool->id, pool->v.pg_num, pool->pg_num_mask, | ||
| 97 | pool->v.lpg_num, pool->lpg_num_mask); | ||
| 98 | } | ||
| 99 | for (i = 0; i < client->osdc.osdmap->max_osd; i++) { | ||
| 100 | struct ceph_entity_addr *addr = | ||
| 101 | &client->osdc.osdmap->osd_addr[i]; | ||
| 102 | int state = client->osdc.osdmap->osd_state[i]; | ||
| 103 | char sb[64]; | ||
| 104 | |||
| 105 | seq_printf(s, "\tosd%d\t%s\t%3d%%\t(%s)\n", | ||
| 106 | i, pr_addr(&addr->in_addr), | ||
| 107 | ((client->osdc.osdmap->osd_weight[i]*100) >> 16), | ||
| 108 | ceph_osdmap_state_str(sb, sizeof(sb), state)); | ||
| 109 | } | ||
| 110 | return 0; | ||
| 111 | } | ||
| 112 | |||
| 113 | static int monc_show(struct seq_file *s, void *p) | ||
| 114 | { | ||
| 115 | struct ceph_client *client = s->private; | ||
| 116 | struct ceph_mon_generic_request *req; | ||
| 117 | struct ceph_mon_client *monc = &client->monc; | ||
| 118 | struct rb_node *rp; | ||
| 119 | |||
| 120 | mutex_lock(&monc->mutex); | ||
| 121 | |||
| 122 | if (monc->have_mdsmap) | ||
| 123 | seq_printf(s, "have mdsmap %u\n", (unsigned)monc->have_mdsmap); | ||
| 124 | if (monc->have_osdmap) | ||
| 125 | seq_printf(s, "have osdmap %u\n", (unsigned)monc->have_osdmap); | ||
| 126 | if (monc->want_next_osdmap) | ||
| 127 | seq_printf(s, "want next osdmap\n"); | ||
| 128 | |||
| 129 | for (rp = rb_first(&monc->generic_request_tree); rp; rp = rb_next(rp)) { | ||
| 130 | __u16 op; | ||
| 131 | req = rb_entry(rp, struct ceph_mon_generic_request, node); | ||
| 132 | op = le16_to_cpu(req->request->hdr.type); | ||
| 133 | if (op == CEPH_MSG_STATFS) | ||
| 134 | seq_printf(s, "%lld statfs\n", req->tid); | ||
| 135 | else | ||
| 136 | seq_printf(s, "%lld unknown\n", req->tid); | ||
| 137 | } | ||
| 138 | |||
| 139 | mutex_unlock(&monc->mutex); | ||
| 140 | return 0; | ||
| 141 | } | ||
| 142 | |||
| 143 | static int mdsc_show(struct seq_file *s, void *p) | 49 | static int mdsc_show(struct seq_file *s, void *p) |
| 144 | { | 50 | { |
| 145 | struct ceph_client *client = s->private; | 51 | struct ceph_fs_client *fsc = s->private; |
| 146 | struct ceph_mds_client *mdsc = &client->mdsc; | 52 | struct ceph_mds_client *mdsc = fsc->mdsc; |
| 147 | struct ceph_mds_request *req; | 53 | struct ceph_mds_request *req; |
| 148 | struct rb_node *rp; | 54 | struct rb_node *rp; |
| 149 | int pathlen; | 55 | int pathlen; |
| @@ -214,61 +120,12 @@ static int mdsc_show(struct seq_file *s, void *p) | |||
| 214 | return 0; | 120 | return 0; |
| 215 | } | 121 | } |
| 216 | 122 | ||
| 217 | static int osdc_show(struct seq_file *s, void *pp) | ||
| 218 | { | ||
| 219 | struct ceph_client *client = s->private; | ||
| 220 | struct ceph_osd_client *osdc = &client->osdc; | ||
| 221 | struct rb_node *p; | ||
| 222 | |||
| 223 | mutex_lock(&osdc->request_mutex); | ||
| 224 | for (p = rb_first(&osdc->requests); p; p = rb_next(p)) { | ||
| 225 | struct ceph_osd_request *req; | ||
| 226 | struct ceph_osd_request_head *head; | ||
| 227 | struct ceph_osd_op *op; | ||
| 228 | int num_ops; | ||
| 229 | int opcode, olen; | ||
| 230 | int i; | ||
| 231 | |||
| 232 | req = rb_entry(p, struct ceph_osd_request, r_node); | ||
| 233 | |||
| 234 | seq_printf(s, "%lld\tosd%d\t%d.%x\t", req->r_tid, | ||
| 235 | req->r_osd ? req->r_osd->o_osd : -1, | ||
| 236 | le32_to_cpu(req->r_pgid.pool), | ||
| 237 | le16_to_cpu(req->r_pgid.ps)); | ||
| 238 | |||
| 239 | head = req->r_request->front.iov_base; | ||
| 240 | op = (void *)(head + 1); | ||
| 241 | |||
| 242 | num_ops = le16_to_cpu(head->num_ops); | ||
| 243 | olen = le32_to_cpu(head->object_len); | ||
| 244 | seq_printf(s, "%.*s", olen, | ||
| 245 | (const char *)(head->ops + num_ops)); | ||
| 246 | |||
| 247 | if (req->r_reassert_version.epoch) | ||
| 248 | seq_printf(s, "\t%u'%llu", | ||
| 249 | (unsigned)le32_to_cpu(req->r_reassert_version.epoch), | ||
| 250 | le64_to_cpu(req->r_reassert_version.version)); | ||
| 251 | else | ||
| 252 | seq_printf(s, "\t"); | ||
| 253 | |||
| 254 | for (i = 0; i < num_ops; i++) { | ||
| 255 | opcode = le16_to_cpu(op->op); | ||
| 256 | seq_printf(s, "\t%s", ceph_osd_op_name(opcode)); | ||
| 257 | op++; | ||
| 258 | } | ||
| 259 | |||
| 260 | seq_printf(s, "\n"); | ||
| 261 | } | ||
| 262 | mutex_unlock(&osdc->request_mutex); | ||
| 263 | return 0; | ||
| 264 | } | ||
| 265 | |||
| 266 | static int caps_show(struct seq_file *s, void *p) | 123 | static int caps_show(struct seq_file *s, void *p) |
| 267 | { | 124 | { |
| 268 | struct ceph_client *client = s->private; | 125 | struct ceph_fs_client *fsc = s->private; |
| 269 | int total, avail, used, reserved, min; | 126 | int total, avail, used, reserved, min; |
| 270 | 127 | ||
| 271 | ceph_reservation_status(client, &total, &avail, &used, &reserved, &min); | 128 | ceph_reservation_status(fsc, &total, &avail, &used, &reserved, &min); |
| 272 | seq_printf(s, "total\t\t%d\n" | 129 | seq_printf(s, "total\t\t%d\n" |
| 273 | "avail\t\t%d\n" | 130 | "avail\t\t%d\n" |
| 274 | "used\t\t%d\n" | 131 | "used\t\t%d\n" |
| @@ -280,8 +137,8 @@ static int caps_show(struct seq_file *s, void *p) | |||
| 280 | 137 | ||
| 281 | static int dentry_lru_show(struct seq_file *s, void *ptr) | 138 | static int dentry_lru_show(struct seq_file *s, void *ptr) |
| 282 | { | 139 | { |
| 283 | struct ceph_client *client = s->private; | 140 | struct ceph_fs_client *fsc = s->private; |
| 284 | struct ceph_mds_client *mdsc = &client->mdsc; | 141 | struct ceph_mds_client *mdsc = fsc->mdsc; |
| 285 | struct ceph_dentry_info *di; | 142 | struct ceph_dentry_info *di; |
| 286 | 143 | ||
| 287 | spin_lock(&mdsc->dentry_lru_lock); | 144 | spin_lock(&mdsc->dentry_lru_lock); |
| @@ -295,199 +152,124 @@ static int dentry_lru_show(struct seq_file *s, void *ptr) | |||
| 295 | return 0; | 152 | return 0; |
| 296 | } | 153 | } |
| 297 | 154 | ||
| 298 | #define DEFINE_SHOW_FUNC(name) \ | 155 | CEPH_DEFINE_SHOW_FUNC(mdsmap_show) |
| 299 | static int name##_open(struct inode *inode, struct file *file) \ | 156 | CEPH_DEFINE_SHOW_FUNC(mdsc_show) |
| 300 | { \ | 157 | CEPH_DEFINE_SHOW_FUNC(caps_show) |
| 301 | struct seq_file *sf; \ | 158 | CEPH_DEFINE_SHOW_FUNC(dentry_lru_show) |
| 302 | int ret; \ | 159 | |
| 303 | \ | ||
| 304 | ret = single_open(file, name, NULL); \ | ||
| 305 | sf = file->private_data; \ | ||
| 306 | sf->private = inode->i_private; \ | ||
| 307 | return ret; \ | ||
| 308 | } \ | ||
| 309 | \ | ||
| 310 | static const struct file_operations name##_fops = { \ | ||
| 311 | .open = name##_open, \ | ||
| 312 | .read = seq_read, \ | ||
| 313 | .llseek = seq_lseek, \ | ||
| 314 | .release = single_release, \ | ||
| 315 | }; | ||
| 316 | |||
| 317 | DEFINE_SHOW_FUNC(monmap_show) | ||
| 318 | DEFINE_SHOW_FUNC(mdsmap_show) | ||
| 319 | DEFINE_SHOW_FUNC(osdmap_show) | ||
| 320 | DEFINE_SHOW_FUNC(monc_show) | ||
| 321 | DEFINE_SHOW_FUNC(mdsc_show) | ||
| 322 | DEFINE_SHOW_FUNC(osdc_show) | ||
| 323 | DEFINE_SHOW_FUNC(dentry_lru_show) | ||
| 324 | DEFINE_SHOW_FUNC(caps_show) | ||
| 325 | 160 | ||
| 161 | /* | ||
| 162 | * debugfs | ||
| 163 | */ | ||
| 326 | static int congestion_kb_set(void *data, u64 val) | 164 | static int congestion_kb_set(void *data, u64 val) |
| 327 | { | 165 | { |
| 328 | struct ceph_client *client = (struct ceph_client *)data; | 166 | struct ceph_fs_client *fsc = (struct ceph_fs_client *)data; |
| 329 | |||
| 330 | if (client) | ||
| 331 | client->mount_args->congestion_kb = (int)val; | ||
| 332 | 167 | ||
| 168 | fsc->mount_options->congestion_kb = (int)val; | ||
| 333 | return 0; | 169 | return 0; |
| 334 | } | 170 | } |
| 335 | 171 | ||
| 336 | static int congestion_kb_get(void *data, u64 *val) | 172 | static int congestion_kb_get(void *data, u64 *val) |
| 337 | { | 173 | { |
| 338 | struct ceph_client *client = (struct ceph_client *)data; | 174 | struct ceph_fs_client *fsc = (struct ceph_fs_client *)data; |
| 339 | |||
| 340 | if (client) | ||
| 341 | *val = (u64)client->mount_args->congestion_kb; | ||
| 342 | 175 | ||
| 176 | *val = (u64)fsc->mount_options->congestion_kb; | ||
| 343 | return 0; | 177 | return 0; |
| 344 | } | 178 | } |
| 345 | 179 | ||
| 346 | |||
| 347 | DEFINE_SIMPLE_ATTRIBUTE(congestion_kb_fops, congestion_kb_get, | 180 | DEFINE_SIMPLE_ATTRIBUTE(congestion_kb_fops, congestion_kb_get, |
| 348 | congestion_kb_set, "%llu\n"); | 181 | congestion_kb_set, "%llu\n"); |
| 349 | 182 | ||
| 350 | int __init ceph_debugfs_init(void) | ||
| 351 | { | ||
| 352 | ceph_debugfs_dir = debugfs_create_dir("ceph", NULL); | ||
| 353 | if (!ceph_debugfs_dir) | ||
| 354 | return -ENOMEM; | ||
| 355 | return 0; | ||
| 356 | } | ||
| 357 | 183 | ||
| 358 | void ceph_debugfs_cleanup(void) | 184 | void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc) |
| 359 | { | 185 | { |
| 360 | debugfs_remove(ceph_debugfs_dir); | 186 | dout("ceph_fs_debugfs_cleanup\n"); |
| 187 | debugfs_remove(fsc->debugfs_bdi); | ||
| 188 | debugfs_remove(fsc->debugfs_congestion_kb); | ||
| 189 | debugfs_remove(fsc->debugfs_mdsmap); | ||
| 190 | debugfs_remove(fsc->debugfs_caps); | ||
| 191 | debugfs_remove(fsc->debugfs_mdsc); | ||
| 192 | debugfs_remove(fsc->debugfs_dentry_lru); | ||
| 361 | } | 193 | } |
| 362 | 194 | ||
| 363 | int ceph_debugfs_client_init(struct ceph_client *client) | 195 | int ceph_fs_debugfs_init(struct ceph_fs_client *fsc) |
| 364 | { | 196 | { |
| 365 | int ret = 0; | 197 | char name[100]; |
| 366 | char name[80]; | 198 | int err = -ENOMEM; |
| 367 | |||
| 368 | snprintf(name, sizeof(name), "%pU.client%lld", &client->fsid, | ||
| 369 | client->monc.auth->global_id); | ||
| 370 | 199 | ||
| 371 | client->debugfs_dir = debugfs_create_dir(name, ceph_debugfs_dir); | 200 | dout("ceph_fs_debugfs_init\n"); |
| 372 | if (!client->debugfs_dir) | 201 | fsc->debugfs_congestion_kb = |
| 373 | goto out; | 202 | debugfs_create_file("writeback_congestion_kb", |
| 374 | 203 | 0600, | |
| 375 | client->monc.debugfs_file = debugfs_create_file("monc", | 204 | fsc->client->debugfs_dir, |
| 376 | 0600, | 205 | fsc, |
| 377 | client->debugfs_dir, | 206 | &congestion_kb_fops); |
| 378 | client, | 207 | if (!fsc->debugfs_congestion_kb) |
| 379 | &monc_show_fops); | ||
| 380 | if (!client->monc.debugfs_file) | ||
| 381 | goto out; | 208 | goto out; |
| 382 | 209 | ||
| 383 | client->mdsc.debugfs_file = debugfs_create_file("mdsc", | 210 | dout("a\n"); |
| 384 | 0600, | ||
| 385 | client->debugfs_dir, | ||
| 386 | client, | ||
| 387 | &mdsc_show_fops); | ||
| 388 | if (!client->mdsc.debugfs_file) | ||
| 389 | goto out; | ||
| 390 | 211 | ||
| 391 | client->osdc.debugfs_file = debugfs_create_file("osdc", | 212 | snprintf(name, sizeof(name), "../../bdi/%s", |
| 392 | 0600, | 213 | dev_name(fsc->backing_dev_info.dev)); |
| 393 | client->debugfs_dir, | 214 | fsc->debugfs_bdi = |
| 394 | client, | 215 | debugfs_create_symlink("bdi", |
| 395 | &osdc_show_fops); | 216 | fsc->client->debugfs_dir, |
| 396 | if (!client->osdc.debugfs_file) | 217 | name); |
| 218 | if (!fsc->debugfs_bdi) | ||
| 397 | goto out; | 219 | goto out; |
| 398 | 220 | ||
| 399 | client->debugfs_monmap = debugfs_create_file("monmap", | 221 | dout("b\n"); |
| 222 | fsc->debugfs_mdsmap = debugfs_create_file("mdsmap", | ||
| 400 | 0600, | 223 | 0600, |
| 401 | client->debugfs_dir, | 224 | fsc->client->debugfs_dir, |
| 402 | client, | 225 | fsc, |
| 403 | &monmap_show_fops); | ||
| 404 | if (!client->debugfs_monmap) | ||
| 405 | goto out; | ||
| 406 | |||
| 407 | client->debugfs_mdsmap = debugfs_create_file("mdsmap", | ||
| 408 | 0600, | ||
| 409 | client->debugfs_dir, | ||
| 410 | client, | ||
| 411 | &mdsmap_show_fops); | 226 | &mdsmap_show_fops); |
| 412 | if (!client->debugfs_mdsmap) | 227 | if (!fsc->debugfs_mdsmap) |
| 413 | goto out; | ||
| 414 | |||
| 415 | client->debugfs_osdmap = debugfs_create_file("osdmap", | ||
| 416 | 0600, | ||
| 417 | client->debugfs_dir, | ||
| 418 | client, | ||
| 419 | &osdmap_show_fops); | ||
| 420 | if (!client->debugfs_osdmap) | ||
| 421 | goto out; | 228 | goto out; |
| 422 | 229 | ||
| 423 | client->debugfs_dentry_lru = debugfs_create_file("dentry_lru", | 230 | dout("ca\n"); |
| 424 | 0600, | 231 | fsc->debugfs_mdsc = debugfs_create_file("mdsc", |
| 425 | client->debugfs_dir, | 232 | 0600, |
| 426 | client, | 233 | fsc->client->debugfs_dir, |
| 427 | &dentry_lru_show_fops); | 234 | fsc, |
| 428 | if (!client->debugfs_dentry_lru) | 235 | &mdsc_show_fops); |
| 236 | if (!fsc->debugfs_mdsc) | ||
| 429 | goto out; | 237 | goto out; |
| 430 | 238 | ||
| 431 | client->debugfs_caps = debugfs_create_file("caps", | 239 | dout("da\n"); |
| 240 | fsc->debugfs_caps = debugfs_create_file("caps", | ||
| 432 | 0400, | 241 | 0400, |
| 433 | client->debugfs_dir, | 242 | fsc->client->debugfs_dir, |
| 434 | client, | 243 | fsc, |
| 435 | &caps_show_fops); | 244 | &caps_show_fops); |
| 436 | if (!client->debugfs_caps) | 245 | if (!fsc->debugfs_caps) |
| 437 | goto out; | 246 | goto out; |
| 438 | 247 | ||
| 439 | client->debugfs_congestion_kb = | 248 | dout("ea\n"); |
| 440 | debugfs_create_file("writeback_congestion_kb", | 249 | fsc->debugfs_dentry_lru = debugfs_create_file("dentry_lru", |
| 441 | 0600, | 250 | 0600, |
| 442 | client->debugfs_dir, | 251 | fsc->client->debugfs_dir, |
| 443 | client, | 252 | fsc, |
| 444 | &congestion_kb_fops); | 253 | &dentry_lru_show_fops); |
| 445 | if (!client->debugfs_congestion_kb) | 254 | if (!fsc->debugfs_dentry_lru) |
| 446 | goto out; | 255 | goto out; |
| 447 | 256 | ||
| 448 | sprintf(name, "../../bdi/%s", dev_name(client->sb->s_bdi->dev)); | ||
| 449 | client->debugfs_bdi = debugfs_create_symlink("bdi", client->debugfs_dir, | ||
| 450 | name); | ||
| 451 | |||
| 452 | return 0; | 257 | return 0; |
| 453 | 258 | ||
| 454 | out: | 259 | out: |
| 455 | ceph_debugfs_client_cleanup(client); | 260 | ceph_fs_debugfs_cleanup(fsc); |
| 456 | return ret; | 261 | return err; |
| 457 | } | 262 | } |
| 458 | 263 | ||
| 459 | void ceph_debugfs_client_cleanup(struct ceph_client *client) | ||
| 460 | { | ||
| 461 | debugfs_remove(client->debugfs_bdi); | ||
| 462 | debugfs_remove(client->debugfs_caps); | ||
| 463 | debugfs_remove(client->debugfs_dentry_lru); | ||
| 464 | debugfs_remove(client->debugfs_osdmap); | ||
| 465 | debugfs_remove(client->debugfs_mdsmap); | ||
| 466 | debugfs_remove(client->debugfs_monmap); | ||
| 467 | debugfs_remove(client->osdc.debugfs_file); | ||
| 468 | debugfs_remove(client->mdsc.debugfs_file); | ||
| 469 | debugfs_remove(client->monc.debugfs_file); | ||
| 470 | debugfs_remove(client->debugfs_congestion_kb); | ||
| 471 | debugfs_remove(client->debugfs_dir); | ||
| 472 | } | ||
| 473 | 264 | ||
| 474 | #else /* CONFIG_DEBUG_FS */ | 265 | #else /* CONFIG_DEBUG_FS */ |
| 475 | 266 | ||
| 476 | int __init ceph_debugfs_init(void) | 267 | int ceph_fs_debugfs_init(struct ceph_fs_client *fsc) |
| 477 | { | ||
| 478 | return 0; | ||
| 479 | } | ||
| 480 | |||
| 481 | void ceph_debugfs_cleanup(void) | ||
| 482 | { | ||
| 483 | } | ||
| 484 | |||
| 485 | int ceph_debugfs_client_init(struct ceph_client *client) | ||
| 486 | { | 268 | { |
| 487 | return 0; | 269 | return 0; |
| 488 | } | 270 | } |
| 489 | 271 | ||
| 490 | void ceph_debugfs_client_cleanup(struct ceph_client *client) | 272 | void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc) |
| 491 | { | 273 | { |
| 492 | } | 274 | } |
| 493 | 275 | ||
