Whamcloud - gitweb
LU-10337 mdt: Allow open of open orphans
[fs/lustre-release.git] / lustre / obdclass / lprocfs_status_server.c
index 08f3f18..f878de0 100644 (file)
 #include <lprocfs_status.h>
 #include <lustre_nodemap.h>
 
+#define MAX_STRING_SIZE 128
+
+struct dentry *ldebugfs_add_symlink(const char *name, const char *target,
+                                   const char *format, ...)
+{
+       struct dentry *entry = NULL;
+       struct dentry *parent;
+       struct qstr dname;
+       va_list ap;
+       char *dest;
+
+       if (!target || !format)
+               return NULL;
+
+       dname.name = target;
+       dname.len = strlen(dname.name);
+       dname.hash = ll_full_name_hash(debugfs_lustre_root,
+                                      dname.name, dname.len);
+       parent = d_lookup(debugfs_lustre_root, &dname);
+       if (!parent)
+               return NULL;
+
+       OBD_ALLOC_WAIT(dest, MAX_STRING_SIZE + 1);
+       if (!dest)
+               goto no_entry;
+
+       va_start(ap, format);
+       vsnprintf(dest, MAX_STRING_SIZE, format, ap);
+       va_end(ap);
+
+       entry = debugfs_create_symlink(name, parent, dest);
+       if (IS_ERR_OR_NULL(entry)) {
+               CERROR("LdebugFS: Could not create symbolic link from %s to %s\n",
+                      name, dest);
+               entry = NULL;
+       }
+
+       OBD_FREE(dest, MAX_STRING_SIZE + 1);
+no_entry:
+       dput(parent);
+       return entry;
+}
+EXPORT_SYMBOL(ldebugfs_add_symlink);
+
 #ifdef CONFIG_PROC_FS
 
 int lprocfs_evict_client_open(struct inode *inode, struct file *f)
@@ -542,92 +586,24 @@ int lprocfs_exp_cleanup(struct obd_export *exp)
        return 0;
 }
 
-#define LPROCFS_OBD_OP_INIT(base, stats, op)                   \
-do {                                                           \
-       unsigned int coffset = base + OBD_COUNTER_OFFSET(op);   \
-       LASSERT(coffset < stats->ls_num);                       \
-       lprocfs_counter_init(stats, coffset, 0, #op, "reqs");   \
-} while (0)
-
-void lprocfs_init_ops_stats(int num_private_stats, struct lprocfs_stats *stats)
-{
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, iocontrol);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, get_info);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, set_info_async);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, setup);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, precleanup);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, cleanup);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, process_config);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, postrecov);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, add_conn);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, del_conn);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, connect);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, reconnect);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, disconnect);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_init);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_fini);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_alloc);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, statfs);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, statfs_async);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, create);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, destroy);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, setattr);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, getattr);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, preprw);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, commitrw);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, init_export);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, destroy_export);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, import_event);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, notify);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, health_check);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, get_uuid);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, quotactl);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, ping);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, pool_new);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, pool_rem);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, pool_add);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, pool_del);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, getref);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, putref);
-
-       CLASSERT(NUM_OBD_STATS == OBD_COUNTER_OFFSET(putref) + 1);
-}
-EXPORT_SYMBOL(lprocfs_init_ops_stats);
-
-int lprocfs_alloc_obd_stats(struct obd_device *obd, unsigned num_private_stats)
+int lprocfs_alloc_obd_stats(struct obd_device *obd, unsigned int num_stats)
 {
        struct lprocfs_stats *stats;
-       unsigned int num_stats;
-       int rc, i;
+       int rc;
 
        LASSERT(obd->obd_stats == NULL);
        LASSERT(obd->obd_proc_entry != NULL);
-       LASSERT(obd->obd_cntr_base == 0);
 
-       num_stats = NUM_OBD_STATS + num_private_stats;
        stats = lprocfs_alloc_stats(num_stats, 0);
        if (stats == NULL)
                return -ENOMEM;
 
-       lprocfs_init_ops_stats(num_private_stats, stats);
-
-       for (i = num_private_stats; i < num_stats; i++) {
-               /* If this LBUGs, it is likely that an obd
-                * operation was added to struct obd_ops in
-                * <obd.h>, and that the corresponding line item
-                * LPROCFS_OBD_OP_INIT(.., .., opname)
-                * is missing from the list above. */
-               LASSERTF(stats->ls_cnt_header[i].lc_name != NULL,
-                        "Missing obd_stat initializer obd_op "
-                        "operation at offset %d.\n", i - num_private_stats);
-       }
        rc = lprocfs_register_stats(obd->obd_proc_entry, "stats", stats);
-       if (rc < 0) {
+       if (rc < 0)
                lprocfs_free_stats(&stats);
-       } else {
-               obd->obd_stats  = stats;
-               obd->obd_cntr_base = num_private_stats;
-       }
+       else
+               obd->obd_stats = stats;
+
        return rc;
 }
 EXPORT_SYMBOL(lprocfs_alloc_obd_stats);
@@ -772,11 +748,11 @@ lprocfs_ir_factor_seq_write(struct file *file, const char __user *buffer,
 {
        struct seq_file *m = file->private_data;
        struct obd_device *obd = m->private;
+       int val;
        int rc;
-       __s64 val;
 
        LASSERT(obd != NULL);
-       rc = lprocfs_str_to_s64(buffer, count, &val);
+       rc = kstrtoint_from_user(buffer, count, 10, &val);
        if (rc)
                return rc;
 
@@ -804,15 +780,15 @@ lprocfs_checksum_dump_seq_write(struct file *file, const char __user *buffer,
 {
        struct seq_file *m = file->private_data;
        struct obd_device *obd = m->private;
+       bool val;
        int rc;
-       __s64 val;
 
        LASSERT(obd != NULL);
-       rc = lprocfs_str_to_s64(buffer, count, &val);
+       rc = kstrtobool_from_user(buffer, count, &val);
        if (rc)
                return rc;
 
-       obd->obd_checksum_dump = !!val;
+       obd->obd_checksum_dump = val;
        return count;
 }
 EXPORT_SYMBOL(lprocfs_checksum_dump_seq_write);
@@ -834,15 +810,13 @@ lprocfs_recovery_time_soft_seq_write(struct file *file,
 {
        struct seq_file *m = file->private_data;
        struct obd_device *obd = m->private;
+       unsigned int val;
        int rc;
-       __s64 val;
 
        LASSERT(obd != NULL);
-       rc = lprocfs_str_to_s64(buffer, count, &val);
+       rc = kstrtouint_from_user(buffer, count, 0, &val);
        if (rc)
                return rc;
-       if (val < 0 || val > INT_MAX)
-               return -ERANGE;
 
        obd->obd_recovery_timeout = val;
        return count;
@@ -866,15 +840,13 @@ lprocfs_recovery_time_hard_seq_write(struct file *file,
 {
        struct seq_file *m = file->private_data;
        struct obd_device *obd = m->private;
+       unsigned int val;
        int rc;
-       __s64 val;
 
        LASSERT(obd != NULL);
-       rc = lprocfs_str_to_s64(buffer, count, &val);
+       rc = kstrtouint_from_user(buffer, count, 0, &val);
        if (rc)
                return rc;
-       if (val < 0 || val > INT_MAX)
-               return -ERANGE;
 
        obd->obd_recovery_time_hard = val;
        return count;