Whamcloud - gitweb
LU-8066 sysfs: make ping sysfs file read and writable
[fs/lustre-release.git] / lustre / osc / lproc_osc.c
index 5c012e4..727e930 100644 (file)
@@ -186,9 +186,10 @@ static ssize_t max_dirty_mb_store(struct kobject *kobj,
 }
 LUSTRE_RW_ATTR(max_dirty_mb);
 
+LUSTRE_ATTR(ost_conn_uuid, 0444, conn_uuid_show, NULL);
 LUSTRE_RO_ATTR(conn_uuid);
 
-LUSTRE_WO_ATTR(ping);
+LUSTRE_RW_ATTR(ping);
 
 static int osc_cached_mb_seq_show(struct seq_file *m, void *v)
 {
@@ -614,8 +615,13 @@ static ssize_t idle_timeout_show(struct kobject *kobj, struct attribute *attr,
        struct obd_device *obd = container_of(kobj, struct obd_device,
                                              obd_kset.kobj);
        struct client_obd *cli = &obd->u.cli;
+       int ret;
 
-       return sprintf(buf, "%u\n", cli->cl_import->imp_idle_timeout);
+       LPROCFS_CLIMP_CHECK(obd);
+       ret = sprintf(buf, "%u\n", cli->cl_import->imp_idle_timeout);
+       LPROCFS_CLIMP_EXIT(obd);
+
+       return ret;
 }
 
 static ssize_t idle_timeout_store(struct kobject *kobj, struct attribute *attr,
@@ -625,24 +631,37 @@ static ssize_t idle_timeout_store(struct kobject *kobj, struct attribute *attr,
                                              obd_kset.kobj);
        struct client_obd *cli = &dev->u.cli;
        struct ptlrpc_request *req;
+       unsigned int idle_debug = 0;
        unsigned int val;
        int rc;
 
-       rc = kstrtouint(buffer, 10, &val);
-       if (rc)
-               return rc;
-
-       if (val > CONNECTION_SWITCH_MAX)
-               return -ERANGE;
-
-       cli->cl_import->imp_idle_timeout = val;
+       if (strncmp(buffer, "debug", 5) == 0) {
+               idle_debug = D_CONSOLE;
+       } else if (strncmp(buffer, "nodebug", 6) == 0) {
+               idle_debug = D_HA;
+       } else {
+               rc = kstrtouint(buffer, 10, &val);
+               if (rc)
+                       return rc;
+
+               if (val > CONNECTION_SWITCH_MAX)
+                       return -ERANGE;
+       }
 
-       /* to initiate the connection if it's in IDLE state */
-       if (!val) {
-               req = ptlrpc_request_alloc(cli->cl_import, &RQF_OST_STATFS);
-               if (req != NULL)
-                       ptlrpc_req_finished(req);
+       LPROCFS_CLIMP_CHECK(dev);
+       if (idle_debug) {
+               cli->cl_import->imp_idle_debug = idle_debug;
+       } else {
+               if (!val) {
+                       /* initiate the connection if it's in IDLE state */
+                       req = ptlrpc_request_alloc(cli->cl_import,
+                                                  &RQF_OST_STATFS);
+                       if (req != NULL)
+                               ptlrpc_req_finished(req);
+               }
+               cli->cl_import->imp_idle_timeout = val;
        }
+       LPROCFS_CLIMP_EXIT(dev);
 
        return count;
 }
@@ -656,16 +675,78 @@ static ssize_t idle_connect_store(struct kobject *kobj, struct attribute *attr,
        struct client_obd *cli = &dev->u.cli;
        struct ptlrpc_request *req;
 
+       LPROCFS_CLIMP_CHECK(dev);
        /* to initiate the connection if it's in IDLE state */
        req = ptlrpc_request_alloc(cli->cl_import, &RQF_OST_STATFS);
        if (req)
                ptlrpc_req_finished(req);
        ptlrpc_pinger_force(cli->cl_import);
+       LPROCFS_CLIMP_EXIT(dev);
 
        return count;
 }
 LUSTRE_WO_ATTR(idle_connect);
 
+static ssize_t grant_shrink_show(struct kobject *kobj, struct attribute *attr,
+                                char *buf)
+{
+       struct obd_device *obd = container_of(kobj, struct obd_device,
+                                             obd_kset.kobj);
+       struct client_obd *cli = &obd->u.cli;
+       struct obd_connect_data *ocd;
+       ssize_t len;
+
+       LPROCFS_CLIMP_CHECK(obd);
+       ocd = &cli->cl_import->imp_connect_data;
+
+       len = snprintf(buf, PAGE_SIZE, "%d\n",
+                      !!OCD_HAS_FLAG(ocd, GRANT_SHRINK));
+       LPROCFS_CLIMP_EXIT(obd);
+
+       return len;
+}
+
+static ssize_t grant_shrink_store(struct kobject *kobj, struct attribute *attr,
+                                 const char *buffer, size_t count)
+{
+       struct obd_device *dev = container_of(kobj, struct obd_device,
+                                             obd_kset.kobj);
+       struct client_obd *cli = &dev->u.cli;
+       struct obd_connect_data *ocd;
+       bool val;
+       int rc;
+
+       if (dev == NULL)
+               return 0;
+
+       rc = kstrtobool(buffer, &val);
+       if (rc)
+               return rc;
+
+       LPROCFS_CLIMP_CHECK(dev);
+       ocd = &cli->cl_import->imp_connect_data;
+
+       if (!val) {
+               if (OCD_HAS_FLAG(ocd, GRANT_SHRINK))
+                       ocd->ocd_connect_flags &= ~OBD_CONNECT_GRANT_SHRINK;
+       } else {
+               /**
+                * server replied obd_connect_data is always bigger, so
+                * client's imp_connect_flags_orig are always supported
+                * by the server
+                */
+               if (!OCD_HAS_FLAG(ocd, GRANT_SHRINK) &&
+                   cli->cl_import->imp_connect_flags_orig &
+                   OBD_CONNECT_GRANT_SHRINK)
+                       ocd->ocd_connect_flags |= OBD_CONNECT_GRANT_SHRINK;
+       }
+
+       LPROCFS_CLIMP_EXIT(dev);
+
+       return count;
+}
+LUSTRE_RW_ATTR(grant_shrink);
+
 LPROC_SEQ_FOPS_RO_TYPE(osc, connect_flags);
 LPROC_SEQ_FOPS_RO_TYPE(osc, server_uuid);
 LPROC_SEQ_FOPS_RO_TYPE(osc, timeouts);
@@ -700,8 +781,6 @@ struct lprocfs_vars lprocfs_osc_obd_vars[] = {
        { NULL }
 };
 
-#define pct(a,b) (b ? a * 100 / b : 0)
-
 static int osc_rpc_stats_seq_show(struct seq_file *seq, void *v)
 {
        struct timespec64 now;
@@ -740,7 +819,7 @@ static int osc_rpc_stats_seq_show(struct seq_file *seq, void *v)
 
                read_cum += r;
                write_cum += w;
-               seq_printf(seq, "%d:\t\t%10lu %3lu %3lu   | %10lu %3lu %3lu\n",
+               seq_printf(seq, "%d:\t\t%10lu %3u %3u   | %10lu %3u %3u\n",
                           1 << i, r, pct(r, read_tot),
                           pct(read_cum, read_tot), w,
                           pct(w, write_tot),
@@ -763,7 +842,7 @@ static int osc_rpc_stats_seq_show(struct seq_file *seq, void *v)
                 unsigned long w = cli->cl_write_rpc_hist.oh_buckets[i];
                 read_cum += r;
                 write_cum += w;
-               seq_printf(seq, "%d:\t\t%10lu %3lu %3lu   | %10lu %3lu %3lu\n",
+               seq_printf(seq, "%d:\t\t%10lu %3u %3u   | %10lu %3u %3u\n",
                           i, r, pct(r, read_tot),
                           pct(read_cum, read_tot), w,
                           pct(w, write_tot),
@@ -786,10 +865,10 @@ static int osc_rpc_stats_seq_show(struct seq_file *seq, void *v)
                 unsigned long w = cli->cl_write_offset_hist.oh_buckets[i];
                 read_cum += r;
                 write_cum += w;
-                seq_printf(seq, "%d:\t\t%10lu %3lu %3lu   | %10lu %3lu %3lu\n",
-                           (i == 0) ? 0 : 1 << (i - 1),
-                           r, pct(r, read_tot), pct(read_cum, read_tot),
-                           w, pct(w, write_tot), pct(write_cum, write_tot));
+               seq_printf(seq, "%d:\t\t%10lu %3u %3u   | %10lu %3u %3u\n",
+                          (i == 0) ? 0 : 1 << (i - 1),
+                          r, pct(r, read_tot), pct(read_cum, read_tot),
+                          w, pct(w, write_tot), pct(write_cum, write_tot));
                 if (read_cum == read_tot && write_cum == write_tot)
                         break;
         }
@@ -798,7 +877,6 @@ static int osc_rpc_stats_seq_show(struct seq_file *seq, void *v)
 
         return 0;
 }
-#undef pct
 
 static ssize_t osc_rpc_stats_seq_write(struct file *file,
                                       const char __user *buf,
@@ -880,10 +958,12 @@ static struct attribute *osc_attrs[] = {
        &lustre_attr_max_rpcs_in_flight.attr,
        &lustre_attr_short_io_bytes.attr,
        &lustre_attr_resend_count.attr,
+       &lustre_attr_ost_conn_uuid.attr,
        &lustre_attr_conn_uuid.attr,
        &lustre_attr_ping.attr,
        &lustre_attr_idle_timeout.attr,
        &lustre_attr_idle_connect.attr,
+       &lustre_attr_grant_shrink.attr,
        NULL,
 };