Blame view
fs/nfsd/fault_inject.c
1.8 KB
65178db42 NFSD: Added fault... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
/* * Copyright (c) 2011 Bryan Schumaker <bjschuma@netapp.com> * * Uses debugfs to create fault injection points for client testing */ #include <linux/types.h> #include <linux/fs.h> #include <linux/debugfs.h> #include <linux/module.h> #include "state.h" #include "fault_inject.h" struct nfsd_fault_inject_op { char *file; void (*func)(u64); }; static struct nfsd_fault_inject_op inject_ops[] = { { .file = "forget_clients", .func = nfsd_forget_clients, }, { .file = "forget_locks", .func = nfsd_forget_locks, }, { .file = "forget_openowners", .func = nfsd_forget_openowners, }, { .file = "forget_delegations", .func = nfsd_forget_delegations, }, { .file = "recall_delegations", .func = nfsd_recall_delegations, }, }; static long int NUM_INJECT_OPS = sizeof(inject_ops) / sizeof(struct nfsd_fault_inject_op); static struct dentry *debug_dir; static int nfsd_inject_set(void *op_ptr, u64 val) { struct nfsd_fault_inject_op *op = op_ptr; if (val == 0) printk(KERN_INFO "NFSD Fault Injection: %s (all)", op->file); else printk(KERN_INFO "NFSD Fault Injection: %s (n = %llu)", op->file, val); op->func(val); return 0; } static int nfsd_inject_get(void *data, u64 *val) { return 0; } DEFINE_SIMPLE_ATTRIBUTE(fops_nfsd, nfsd_inject_get, nfsd_inject_set, "%llu "); void nfsd_fault_inject_cleanup(void) { debugfs_remove_recursive(debug_dir); } int nfsd_fault_inject_init(void) { unsigned int i; struct nfsd_fault_inject_op *op; mode_t mode = S_IFREG | S_IRUSR | S_IWUSR; debug_dir = debugfs_create_dir("nfsd", NULL); if (!debug_dir) goto fail; for (i = 0; i < NUM_INJECT_OPS; i++) { op = &inject_ops[i]; if (!debugfs_create_file(op->file, mode, debug_dir, op, &fops_nfsd)) goto fail; } return 0; fail: nfsd_fault_inject_cleanup(); return -ENOMEM; } |