Whamcloud - gitweb
LU-6142 ldlm: Fix style issues for ptlrpcd.c
[fs/lustre-release.git] / lustre / ptlrpc / sec_lproc.c
index 05a239b..37bca07 100644 (file)
@@ -101,15 +101,16 @@ static int sptlrpc_info_lprocfs_seq_show(struct seq_file *seq, void *v)
        seq_printf(seq, "refcount:      %d\n",
                   atomic_read(&sec->ps_refcount));
        seq_printf(seq, "nctx:  %d\n", atomic_read(&sec->ps_nctx));
-       seq_printf(seq, "gc internal    %ld\n", sec->ps_gc_interval);
-       seq_printf(seq, "gc next        %ld\n",
+       seq_printf(seq, "gc internal    %lld\n", sec->ps_gc_interval);
+       seq_printf(seq, "gc next        %lld\n",
                   sec->ps_gc_interval ?
-                  sec->ps_gc_next - cfs_time_current_sec() : 0);
+                  (s64)(sec->ps_gc_next - ktime_get_real_seconds()) : 0ll);
 
        sptlrpc_sec_put(sec);
 out:
         return 0;
 }
+
 LPROC_SEQ_FOPS_RO(sptlrpc_info_lprocfs);
 
 static int sptlrpc_ctxs_lprocfs_seq_show(struct seq_file *seq, void *v)
@@ -136,11 +137,81 @@ static int sptlrpc_ctxs_lprocfs_seq_show(struct seq_file *seq, void *v)
 out:
         return 0;
 }
+
 LPROC_SEQ_FOPS_RO(sptlrpc_ctxs_lprocfs);
 
+static ssize_t
+lprocfs_sptlrpc_sepol_seq_write(struct file *file, const char __user *buffer,
+                               size_t count, void *data)
+{
+       struct seq_file *seq = file->private_data;
+       struct obd_device *dev = seq->private;
+       struct client_obd *cli = &dev->u.cli;
+       struct obd_import *imp = cli->cl_import;
+       struct sepol_downcall_data *param;
+       int size = sizeof(*param);
+       int rc = 0;
+
+       if (count < size) {
+               CERROR("%s: invalid data count = %lu, size = %d\n",
+                      dev->obd_name, (unsigned long) count, size);
+               return -EINVAL;
+       }
+
+       OBD_ALLOC(param, size);
+       if (param == NULL)
+               return -ENOMEM;
+
+       if (copy_from_user(param, buffer, size)) {
+               CERROR("%s: bad sepol data\n", dev->obd_name);
+               GOTO(out, rc = -EFAULT);
+       }
+
+       if (param->sdd_magic != SEPOL_DOWNCALL_MAGIC) {
+               CERROR("%s: sepol downcall bad params\n",
+                      dev->obd_name);
+               GOTO(out, rc = -EINVAL);
+       }
+
+       if (param->sdd_sepol_len == 0 ||
+           param->sdd_sepol_len >= sizeof(imp->imp_sec->ps_sepol)) {
+               CERROR("%s: invalid sepol data returned\n",
+                      dev->obd_name);
+               GOTO(out, rc = -EINVAL);
+       }
+       rc = param->sdd_sepol_len; /* save sdd_sepol_len */
+       OBD_FREE(param, size);
+       size = offsetof(struct sepol_downcall_data,
+                       sdd_sepol[rc]);
+
+       /* alloc again with real size */
+       rc = 0;
+       OBD_ALLOC(param, size);
+       if (param == NULL)
+               return -ENOMEM;
+
+       if (copy_from_user(param, buffer, size)) {
+               CERROR("%s: bad sepol data\n", dev->obd_name);
+               GOTO(out, rc = -EFAULT);
+       }
+
+       spin_lock(&imp->imp_sec->ps_lock);
+       snprintf(imp->imp_sec->ps_sepol, param->sdd_sepol_len + 1, "%s",
+                param->sdd_sepol);
+       imp->imp_sec->ps_sepol_mtime = param->sdd_sepol_mtime;
+       spin_unlock(&imp->imp_sec->ps_lock);
+
+out:
+       if (param != NULL)
+               OBD_FREE(param, size);
+
+       return rc ? rc : count;
+}
+LPROC_SEQ_FOPS_WR_ONLY(srpc, sptlrpc_sepol);
+
 int sptlrpc_lprocfs_cliobd_attach(struct obd_device *dev)
 {
-        int     rc;
+       int     rc;
 
        if (strcmp(dev->obd_type->typ_name, LUSTRE_OSC_NAME) != 0 &&
            strcmp(dev->obd_type->typ_name, LUSTRE_MDC_NAME) != 0 &&
@@ -152,23 +223,31 @@ int sptlrpc_lprocfs_cliobd_attach(struct obd_device *dev)
                return -EINVAL;
        }
 
-        rc = lprocfs_obd_seq_create(dev, "srpc_info", 0444,
-                                    &sptlrpc_info_lprocfs_fops, dev);
-        if (rc) {
-                CERROR("create proc entry srpc_info for %s: %d\n",
-                       dev->obd_name, rc);
-                return rc;
-        }
+       rc = ldebugfs_seq_create(dev->obd_debugfs_entry, "srpc_info", 0444,
+                                &sptlrpc_info_lprocfs_fops, dev);
+       if (rc) {
+               CERROR("create proc entry srpc_info for %s: %d\n",
+                      dev->obd_name, rc);
+               return rc;
+       }
 
-        rc = lprocfs_obd_seq_create(dev, "srpc_contexts", 0444,
-                                    &sptlrpc_ctxs_lprocfs_fops, dev);
-        if (rc) {
-                CERROR("create proc entry srpc_contexts for %s: %d\n",
-                       dev->obd_name, rc);
-                return rc;
-        }
+       rc = ldebugfs_seq_create(dev->obd_debugfs_entry, "srpc_contexts",
+                                0444, &sptlrpc_ctxs_lprocfs_fops, dev);
+       if (rc) {
+               CERROR("create proc entry srpc_contexts for %s: %d\n",
+                      dev->obd_name, rc);
+               return rc;
+       }
 
-        return 0;
+       rc = ldebugfs_seq_create(dev->obd_debugfs_entry, "srpc_sepol",
+                                0200, &srpc_sptlrpc_sepol_fops, dev);
+       if (rc) {
+               CERROR("create proc entry srpc_sepol for %s: %d\n",
+                      dev->obd_name, rc);
+               return rc;
+       }
+
+       return 0;
 }
 EXPORT_SYMBOL(sptlrpc_lprocfs_cliobd_attach);