* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2012, 2015, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include "osp_internal.h"
-#ifdef CONFIG_PROC_FS
/**
* Show OSP active status
*
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_active_seq_show(struct seq_file *m, void *data)
+static ssize_t active_show(struct kobject *kobj, struct attribute *attr,
+ char *buf)
{
- struct obd_device *dev = m->private;
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct lu_device *lu = dt2lu_dev(dt);
+ struct obd_device *obd = lu->ld_obd;
+ int rc;
- LPROCFS_CLIMP_CHECK(dev);
- seq_printf(m, "%d\n", !dev->u.cli.cl_import->imp_deactive);
- LPROCFS_CLIMP_EXIT(dev);
- return 0;
+ LPROCFS_CLIMP_CHECK(obd);
+ rc = sprintf(buf, "%d\n", !obd->u.cli.cl_import->imp_deactive);
+ LPROCFS_CLIMP_EXIT(obd);
+ return rc;
}
/**
* \retval \a count on success
* \retval negative number on error
*/
-static ssize_t
-osp_active_seq_write(struct file *file, const char __user *buffer,
- size_t count, loff_t *off)
+static ssize_t active_store(struct kobject *kobj, struct attribute *attr,
+ const char *buffer, size_t count)
{
- struct seq_file *m = file->private_data;
- struct obd_device *dev = m->private;
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct lu_device *lu = dt2lu_dev(dt);
+ struct obd_device *obd = lu->ld_obd;
+ bool val;
int rc;
- __s64 val;
- rc = lprocfs_str_to_s64(buffer, count, &val);
+ rc = kstrtobool(buffer, &val);
if (rc)
return rc;
- if (val < 0 || val > 1)
- return -ERANGE;
- LPROCFS_CLIMP_CHECK(dev);
+ LPROCFS_CLIMP_CHECK(obd);
/* opposite senses */
- if (dev->u.cli.cl_import->imp_deactive == val)
- rc = ptlrpc_set_import_active(dev->u.cli.cl_import, val);
+ if (obd->u.cli.cl_import->imp_deactive == val)
+ rc = ptlrpc_set_import_active(obd->u.cli.cl_import, val);
else
- CDEBUG(D_CONFIG, "activate "LPD64": ignoring repeat request\n",
- val);
+ CDEBUG(D_CONFIG, "activate %u: ignoring repeat request\n",
+ (unsigned int)val);
- LPROCFS_CLIMP_EXIT(dev);
+ LPROCFS_CLIMP_EXIT(obd);
return count;
}
-LPROC_SEQ_FOPS(osp_active);
+LUSTRE_RW_ATTR(active);
/**
* Show number of RPCs in flight
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_syn_in_flight_seq_show(struct seq_file *m, void *data)
+static ssize_t sync_in_flight_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
- if (osp == NULL)
- return -EINVAL;
-
- seq_printf(m, "%u\n", atomic_read(&osp->opd_syn_rpc_in_flight));
- return 0;
+ return sprintf(buf, "%u\n", atomic_read(&osp->opd_sync_rpcs_in_flight));
}
-LPROC_SEQ_FOPS_RO(osp_syn_in_flight);
+LUSTRE_RO_ATTR(sync_in_flight);
/**
* Show number of RPCs in processing (including uncommitted by OST)
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_syn_in_prog_seq_show(struct seq_file *m, void *data)
+static ssize_t sync_in_progress_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
-
- if (osp == NULL)
- return -EINVAL;
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
- seq_printf(m, "%u\n", atomic_read(&osp->opd_syn_rpc_in_progress));
- return 0;
+ return sprintf(buf, "%u\n", atomic_read(&osp->opd_sync_rpcs_in_progress));
}
-LPROC_SEQ_FOPS_RO(osp_syn_in_prog);
+LUSTRE_RO_ATTR(sync_in_progress);
/**
* Show number of changes to sync
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_syn_changes_seq_show(struct seq_file *m, void *data)
+static ssize_t sync_changes_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
-
- if (osp == NULL)
- return -EINVAL;
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
- seq_printf(m, "%u\n", atomic_read(&osp->opd_syn_changes));
- return 0;
+ return sprintf(buf, "%u\n", atomic_read(&osp->opd_sync_changes));
}
/**
* \retval \a count on success
* \retval negative number on error
*/
-static ssize_t osp_syn_changes_seq_write(struct file *file,
- const char __user *buffer,
- size_t count, loff_t *off)
+static ssize_t sync_changes_store(struct kobject *kobj, struct attribute *attr,
+ const char *buffer, size_t count)
{
- struct seq_file *m = file->private_data;
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
- struct lu_env env;
- int rc;
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
+ struct lu_env env;
+ int rc;
rc = lu_env_init(&env, LCT_LOCAL);
if (rc != 0)
return rc == 0 ? count : rc;
}
-LPROC_SEQ_FOPS(osp_syn_changes);
+LUSTRE_RW_ATTR(sync_changes);
/**
* Show maximum number of RPCs in flight allowed
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_max_rpcs_in_flight_seq_show(struct seq_file *m, void *data)
+static ssize_t max_rpcs_in_flight_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
-
- if (osp == NULL)
- return -EINVAL;
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
- seq_printf(m, "%u\n", osp->opd_syn_max_rpc_in_flight);
- return 0;
+ return sprintf(buf, "%u\n", osp->opd_sync_max_rpcs_in_flight);
}
/**
* \retval \a count on success
* \retval negative number on error
*/
-static ssize_t
-osp_max_rpcs_in_flight_seq_write(struct file *file, const char __user *buffer,
- size_t count, loff_t *off)
+static ssize_t max_rpcs_in_flight_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer,
+ size_t count)
{
- struct seq_file *m = file->private_data;
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
+ unsigned int val;
int rc;
- __s64 val;
-
- if (osp == NULL)
- return -EINVAL;
- rc = lprocfs_str_to_s64(buffer, count, &val);
+ rc = kstrtouint(buffer, 0, &val);
if (rc)
return rc;
- if (val < 1 || val > INT_MAX)
+ if (val == 0)
return -ERANGE;
- osp->opd_syn_max_rpc_in_flight = val;
+ osp->opd_sync_max_rpcs_in_flight = val;
return count;
}
-LPROC_SEQ_FOPS(osp_max_rpcs_in_flight);
+LUSTRE_RW_ATTR(max_rpcs_in_flight);
/**
* Show maximum number of RPCs in processing allowed
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_max_rpcs_in_prog_seq_show(struct seq_file *m, void *data)
+static ssize_t max_rpcs_in_progress_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
- if (osp == NULL)
- return -EINVAL;
-
- seq_printf(m, "%u\n", osp->opd_syn_max_rpc_in_progress);
- return 0;
+ return sprintf(buf, "%u\n", osp->opd_sync_max_rpcs_in_progress);
}
/**
* \retval \a count on success
* \retval negative number on error
*/
-static ssize_t
-osp_max_rpcs_in_prog_seq_write(struct file *file, const char __user *buffer,
- size_t count, loff_t *off)
+static ssize_t max_rpcs_in_progress_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer,
+ size_t count)
{
- struct seq_file *m = file->private_data;
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
+ unsigned int val;
int rc;
- __s64 val;
-
- if (osp == NULL)
- return -EINVAL;
- rc = lprocfs_str_to_s64(buffer, count, &val);
+ rc = kstrtouint(buffer, 0, &val);
if (rc)
return rc;
- if (val < 1 || val > INT_MAX)
+ if (val == 0)
return -ERANGE;
- osp->opd_syn_max_rpc_in_progress = val;
+ osp->opd_sync_max_rpcs_in_progress = val;
return count;
}
-LPROC_SEQ_FOPS(osp_max_rpcs_in_prog);
+LUSTRE_RW_ATTR(max_rpcs_in_progress);
/**
* Show number of objects to precreate next time
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_create_count_seq_show(struct seq_file *m, void *data)
+static ssize_t create_count_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *obd = m->private;
- struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
- if (osp == NULL || osp->opd_pre == NULL)
- return 0;
+ if (!osp->opd_pre)
+ return -EINVAL;
- seq_printf(m, "%d\n", osp->opd_pre_create_count);
- return 0;
+ return sprintf(buf, "%d\n", osp->opd_pre_create_count);
}
/**
* \retval \a count on success
* \retval negative number on error
*/
-static ssize_t
-osp_create_count_seq_write(struct file *file, const char __user *buffer,
- size_t count, loff_t *off)
+static ssize_t create_count_store(struct kobject *kobj, struct attribute *attr,
+ const char *buffer, size_t count)
{
- struct seq_file *m = file->private_data;
- struct obd_device *obd = m->private;
- struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
+ unsigned int val;
int rc, i;
- __s64 val;
- if (osp == NULL || osp->opd_pre == NULL)
- return 0;
+ if (!osp->opd_pre)
+ return -EINVAL;
- rc = lprocfs_str_to_s64(buffer, count, &val);
+
+ rc = kstrtouint(buffer, 0, &val);
if (rc)
return rc;
return count;
}
-LPROC_SEQ_FOPS(osp_create_count);
+LUSTRE_RW_ATTR(create_count);
/**
* Show maximum number of objects to precreate
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_max_create_count_seq_show(struct seq_file *m, void *data)
+static ssize_t max_create_count_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *obd = m->private;
- struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
- if (osp == NULL || osp->opd_pre == NULL)
- return 0;
+ if (!osp->opd_pre)
+ return -EINVAL;
- seq_printf(m, "%d\n", osp->opd_pre_max_create_count);
- return 0;
+ return sprintf(buf, "%d\n", osp->opd_pre_max_create_count);
}
/**
* \retval \a count on success
* \retval negative number on error
*/
-static ssize_t
-osp_max_create_count_seq_write(struct file *file, const char __user *buffer,
- size_t count, loff_t *off)
+static ssize_t max_create_count_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer, size_t count)
{
- struct seq_file *m = file->private_data;
- struct obd_device *obd = m->private;
- struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
+ unsigned int val;
int rc;
- __s64 val;
- if (osp == NULL || osp->opd_pre == NULL)
- return 0;
+ if (!osp->opd_pre)
+ return -EINVAL;
- rc = lprocfs_str_to_s64(buffer, count, &val);
+ rc = kstrtouint(buffer, 0, &val);
if (rc)
return rc;
- if (val < 0 || val > INT_MAX)
- return -ERANGE;
- if (val > OST_MAX_PRECREATE)
+ if (val && (val < OST_MIN_PRECREATE ||
+ val > OST_MAX_PRECREATE))
return -ERANGE;
if (osp->opd_pre_create_count > val)
osp->opd_pre_create_count = val;
+ /* Can be 0 after setting max_create_count to 0 */
+ if (osp->opd_pre_create_count == 0 && val != 0)
+ osp->opd_pre_create_count = OST_MIN_PRECREATE;
+
osp->opd_pre_max_create_count = val;
return count;
}
-LPROC_SEQ_FOPS(osp_max_create_count);
+LUSTRE_RW_ATTR(max_create_count);
/**
* Show last id to assign in creation
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_prealloc_next_id_seq_show(struct seq_file *m, void *data)
+static ssize_t prealloc_next_id_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *obd = m->private;
- struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
+ struct lu_fid *fid;
+ u64 id;
- if (osp == NULL || osp->opd_pre == NULL)
- return 0;
+ if (!osp->opd_pre)
+ return -EINVAL;
- seq_printf(m, "%u\n", fid_oid(&osp->opd_pre_used_fid) + 1);
- return 0;
+ fid = &osp->opd_pre_used_fid;
+ if (fid_is_idif(fid)) {
+ id = fid_idif_id(fid_seq(fid), fid_oid(fid), fid_ver(fid));
+ id++;
+ } else {
+ id = unlikely(fid_oid(fid) == LUSTRE_DATA_SEQ_MAX_WIDTH) ?
+ 1 : fid_oid(fid) + 1;
+ }
+
+ return sprintf(buf, "%llu\n", id);
}
-LPROC_SEQ_FOPS_RO(osp_prealloc_next_id);
+LUSTRE_RO_ATTR(prealloc_next_id);
/**
* Show last created id OST reported
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_prealloc_last_id_seq_show(struct seq_file *m, void *data)
+
+static ssize_t prealloc_last_id_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *obd = m->private;
- struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
+ struct lu_fid *fid;
+ u64 id;
- if (osp == NULL || osp->opd_pre == NULL)
- return 0;
+ if (!osp->opd_pre)
+ return -EINVAL;
- seq_printf(m, "%u\n", fid_oid(&osp->opd_pre_last_created_fid));
- return 0;
+ fid = &osp->opd_pre_last_created_fid;
+ id = fid_is_idif(fid) ?
+ fid_idif_id(fid_seq(fid), fid_oid(fid), fid_ver(fid)) :
+ fid_oid(fid);
+
+ return sprintf(buf, "%llu\n", id);
}
-LPROC_SEQ_FOPS_RO(osp_prealloc_last_id);
+LUSTRE_RO_ATTR(prealloc_last_id);
/**
* Show next FID sequence to precreate
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_prealloc_next_seq_seq_show(struct seq_file *m, void *data)
+static ssize_t prealloc_next_seq_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *obd = m->private;
- struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
+ struct lu_fid *fid;
- if (osp == NULL || osp->opd_pre == NULL)
- return 0;
+ if (!osp->opd_pre)
+ return -EINVAL;
- seq_printf(m, LPX64"\n", fid_seq(&osp->opd_pre_used_fid));
- return 0;
+ fid = &osp->opd_pre_used_fid;
+ return sprintf(buf, "%#llx\n", fid_is_idif(fid) ?
+ fid_seq(fid) & (~0xffff) : fid_seq(fid));
}
-LPROC_SEQ_FOPS_RO(osp_prealloc_next_seq);
+LUSTRE_RO_ATTR(prealloc_next_seq);
/**
* Show last created FID sequence OST reported
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_prealloc_last_seq_seq_show(struct seq_file *m, void *data)
+static ssize_t prealloc_last_seq_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *obd = m->private;
- struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
+ struct lu_fid *fid;
- if (osp == NULL || osp->opd_pre == NULL)
- return 0;
+ if (!osp->opd_pre)
+ return -EINVAL;
- seq_printf(m, LPX64"\n",
- fid_seq(&osp->opd_pre_last_created_fid));
- return 0;
+ fid = &osp->opd_pre_last_created_fid;
+ return sprintf(buf, "%#llx\n", fid_is_idif(fid) ?
+ fid_seq(fid) & (~0xffff) : fid_seq(fid));
}
-LPROC_SEQ_FOPS_RO(osp_prealloc_last_seq);
+LUSTRE_RO_ATTR(prealloc_last_seq);
/**
* Show the number of ids reserved by declare
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_prealloc_reserved_seq_show(struct seq_file *m, void *data)
+static ssize_t prealloc_reserved_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *obd = m->private;
- struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
- if (osp == NULL || osp->opd_pre == NULL)
- return 0;
+ if (!osp->opd_pre)
+ return -EINVAL;
- seq_printf(m, LPU64"\n", osp->opd_pre_reserved);
- return 0;
+ return sprintf(buf, "%llu\n", osp->opd_pre_reserved);
}
-LPROC_SEQ_FOPS_RO(osp_prealloc_reserved);
+LUSTRE_RO_ATTR(prealloc_reserved);
/**
* Show interval (in seconds) to update statfs data
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_maxage_seq_show(struct seq_file *m, void *data)
+static ssize_t maxage_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
- if (osp == NULL)
- return -EINVAL;
-
- seq_printf(m, "%u\n", osp->opd_statfs_maxage);
- return 0;
+ return sprintf(buf, "%lld\n", osp->opd_statfs_maxage);
}
/**
* \retval \a count on success
* \retval negative number on error
*/
-static ssize_t
-osp_maxage_seq_write(struct file *file, const char __user *buffer,
- size_t count, loff_t *off)
+static ssize_t maxage_store(struct kobject *kobj, struct attribute *attr,
+ const char *buffer, size_t count)
{
- struct seq_file *m = file->private_data;
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
+ unsigned int val;
int rc;
- __s64 val;
- if (osp == NULL)
- return -EINVAL;
-
- rc = lprocfs_str_to_s64(buffer, count, &val);
+ rc = kstrtouint(buffer, 0, &val);
if (rc)
return rc;
- if (val < 1 || val > INT_MAX)
+ if (val == 0)
return -ERANGE;
osp->opd_statfs_maxage = val;
return count;
}
-LPROC_SEQ_FOPS(osp_maxage);
+LUSTRE_RW_ATTR(maxage);
/**
* Show current precreation status: output 0 means success, otherwise negative
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_pre_status_seq_show(struct seq_file *m, void *data)
+static ssize_t prealloc_status_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
- if (osp == NULL || osp->opd_pre == NULL)
+ if (!osp->opd_pre)
return -EINVAL;
- seq_printf(m, "%d\n", osp->opd_pre_status);
- return 0;
+ return sprintf(buf, "%d\n", osp->opd_pre_status);
}
-LPROC_SEQ_FOPS_RO(osp_pre_status);
+LUSTRE_RO_ATTR(prealloc_status);
/**
* Show the number of RPCs in processing (including uncommitted by OST) plus
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_destroys_in_flight_seq_show(struct seq_file *m, void *data)
+static ssize_t destroys_in_flight_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
-
- if (osp == NULL)
- return -EINVAL;
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
- seq_printf(m, "%u\n",
- atomic_read(&osp->opd_syn_rpc_in_progress) +
- atomic_read(&osp->opd_syn_changes));
- return 0;
+ return sprintf(buf, "%u\n",
+ atomic_read(&osp->opd_sync_rpcs_in_progress) +
+ atomic_read(&osp->opd_sync_changes));
}
-LPROC_SEQ_FOPS_RO(osp_destroys_in_flight);
+LUSTRE_RO_ATTR(destroys_in_flight);
/**
* Show changes synced from previous mount
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_old_sync_processed_seq_show(struct seq_file *m, void *data)
+static ssize_t old_sync_processed_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *dev = m->private;
- struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct osp_device *osp = dt2osp_dev(dt);
- if (osp == NULL)
- return -EINVAL;
-
- seq_printf(m, "%d\n", osp->opd_syn_prev_done);
- return 0;
+ return sprintf(buf, "%d\n", osp->opd_sync_prev_done);
}
-LPROC_SEQ_FOPS_RO(osp_old_sync_processed);
+LUSTRE_RO_ATTR(old_sync_processed);
/**
* Show maximum number of RPCs in flight
* \retval 0 on success
* \retval negative number on error
*/
-static int
-osp_lfsck_max_rpcs_in_flight_seq_show(struct seq_file *m, void *data)
+static ssize_t lfsck_max_rpcs_in_flight_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
{
- struct obd_device *dev = m->private;
- __u32 max;
-
- max = obd_get_max_rpcs_in_flight(&dev->u.cli);
- seq_printf(m, "%u\n", max);
- return 0;
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct lu_device *lu = dt2lu_dev(dt);
+ struct obd_device *obd = lu->ld_obd;
+ u32 max;
+
+ max = obd_get_max_rpcs_in_flight(&obd->u.cli);
+ return sprintf(buf, "%u\n", max);
}
/**
* \retval \a count on success
* \retval negative number on error
*/
-static ssize_t
-osp_lfsck_max_rpcs_in_flight_seq_write(struct file *file,
- const char __user *buffer,
- size_t count, loff_t *off)
+static ssize_t lfsck_max_rpcs_in_flight_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer,
+ size_t count)
{
- struct seq_file *m = file->private_data;
- struct obd_device *dev = m->private;
- __s64 val;
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct lu_device *lu = dt2lu_dev(dt);
+ struct obd_device *obd = lu->ld_obd;
+ unsigned int val;
int rc;
- rc = lprocfs_str_to_s64(buffer, count, &val);
- if (rc == 0) {
- if (val < 0)
- return -ERANGE;
+ rc = kstrtouint(buffer, 0, &val);
+ if (rc)
+ return rc;
- rc = obd_set_max_rpcs_in_flight(&dev->u.cli, val);
- } else {
- count = rc;
- }
+ rc = obd_set_max_rpcs_in_flight(&obd->u.cli, val);
+ return rc ? rc : count;
+}
+LUSTRE_RW_ATTR(lfsck_max_rpcs_in_flight);
+
+ssize_t ping_show(struct kobject *kobj, struct attribute *attr,
+ char *buffer)
+{
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct lu_device *lu = dt2lu_dev(dt);
+ struct obd_device *obd = lu->ld_obd;
+ int rc;
+
+ LPROCFS_CLIMP_CHECK(obd);
+ rc = ptlrpc_obd_ping(obd);
+ LPROCFS_CLIMP_EXIT(obd);
+
+ return rc;
+}
+LUSTRE_RO_ATTR(ping);
+ssize_t osp_conn_uuid_show(struct kobject *kobj, struct attribute *attr,
+ char *buf)
+{
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct lu_device *lu = dt2lu_dev(dt);
+ struct obd_device *obd = lu->ld_obd;
+ struct ptlrpc_connection *conn;
+ ssize_t count;
+
+ LPROCFS_CLIMP_CHECK(obd);
+ conn = obd->u.cli.cl_import->imp_connection;
+ if (conn && obd->u.cli.cl_import)
+ count = sprintf(buf, "%s\n", conn->c_remote_uuid.uuid);
+ else
+ count = sprintf(buf, "%s\n", "<none>");
+
+ LPROCFS_CLIMP_EXIT(obd);
return count;
}
-LPROC_SEQ_FOPS(osp_lfsck_max_rpcs_in_flight);
-LPROC_SEQ_FOPS_WO_TYPE(osp, ping);
-LPROC_SEQ_FOPS_RO_TYPE(osp, uuid);
-LPROC_SEQ_FOPS_RO_TYPE(osp, connect_flags);
-LPROC_SEQ_FOPS_RO_TYPE(osp, server_uuid);
-LPROC_SEQ_FOPS_RO_TYPE(osp, conn_uuid);
+LUSTRE_ATTR(ost_conn_uuid, 0444, osp_conn_uuid_show, NULL);
+LUSTRE_ATTR(mdt_conn_uuid, 0444, osp_conn_uuid_show, NULL);
+
+LDEBUGFS_SEQ_FOPS_RO_TYPE(osp, connect_flags);
+LDEBUGFS_SEQ_FOPS_RO_TYPE(osp, server_uuid);
+LDEBUGFS_SEQ_FOPS_RO_TYPE(osp, timeouts);
+
+LPROC_SEQ_FOPS_RW_TYPE(osp, import);
+LDEBUGFS_SEQ_FOPS_RO_TYPE(osp, state);
/**
- * Show maximum pages per bulk RPC
+ * Show high watermark (in megabytes). If available free space at OST is grater
+ * than high watermark and object allocation for OST is disabled, enable it.
*
* \param[in] m seq_file handle
* \param[in] data unused for single entry
* \retval 0 on success
* \retval negative number on error
*/
-static int osp_max_pages_per_rpc_seq_show(struct seq_file *m, void *v)
+static int osp_reserved_mb_high_seq_show(struct seq_file *m, void *data)
{
- return lprocfs_obd_max_pages_per_rpc_seq_show(m, m->private);
+ struct obd_device *dev = m->private;
+ struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
+
+ if (osp == NULL)
+ return -EINVAL;
+
+ seq_printf(m, "%u\n", osp->opd_reserved_mb_high);
+ return 0;
}
-LPROC_SEQ_FOPS_RO(osp_max_pages_per_rpc);
-LPROC_SEQ_FOPS_RO_TYPE(osp, timeouts);
-LPROC_SEQ_FOPS_RW_TYPE(osp, import);
-LPROC_SEQ_FOPS_RO_TYPE(osp, state);
+/**
+ * Change high watermark
+ *
+ * \param[in] file proc file
+ * \param[in] buffer string which represents new value (in megabytes)
+ * \param[in] count \a buffer length
+ * \param[in] off unused for single entry
+ * \retval \a count on success
+ * \retval negative number on error
+ */
+static ssize_t
+osp_reserved_mb_high_seq_write(struct file *file, const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct obd_device *dev = m->private;
+ struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
+ __s64 val;
+ int rc;
+
+ if (osp == NULL || osp->opd_pre == NULL)
+ return -EINVAL;
+
+ rc = lprocfs_str_with_units_to_s64(buffer, count, &val, 'M');
+ if (rc)
+ return rc;
+ val >>= 20;
+ if (val < 1)
+ return -ERANGE;
+
+ spin_lock(&osp->opd_pre_lock);
+ osp->opd_reserved_mb_high = val;
+ if (val <= osp->opd_reserved_mb_low)
+ osp->opd_reserved_mb_low = val - 1;
+ spin_unlock(&osp->opd_pre_lock);
+
+ return count;
+}
+LDEBUGFS_SEQ_FOPS(osp_reserved_mb_high);
+
+/**
+ * Show low watermark (in megabytes). If available free space at OST is less
+ * than low watermark, object allocation for OST is disabled.
+ *
+ * \param[in] m seq_file handle
+ * \param[in] data unused for single entry
+ * \retval 0 on success
+ * \retval negative number on error
+ */
+static int osp_reserved_mb_low_seq_show(struct seq_file *m, void *data)
+{
+ struct obd_device *dev = m->private;
+ struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
+
+ if (osp == NULL)
+ return -EINVAL;
+
+ seq_printf(m, "%u\n", osp->opd_reserved_mb_low);
+ return 0;
+}
+
+/**
+ * Change low watermark
+ *
+ * \param[in] file proc file
+ * \param[in] buffer string which represents new value (in megabytes)
+ * \param[in] count \a buffer length
+ * \param[in] off unused for single entry
+ * \retval \a count on success
+ * \retval negative number on error
+ */
+static ssize_t
+osp_reserved_mb_low_seq_write(struct file *file, const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct obd_device *dev = m->private;
+ struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev);
+ __s64 val;
+ int rc;
+
+ if (osp == NULL || osp->opd_pre == NULL)
+ return -EINVAL;
+
+ rc = lprocfs_str_with_units_to_s64(buffer, count, &val, 'M');
+ if (rc)
+ return rc;
+ val >>= 20;
+
+ spin_lock(&osp->opd_pre_lock);
+ osp->opd_reserved_mb_low = val;
+ if (val >= osp->opd_reserved_mb_high)
+ osp->opd_reserved_mb_high = val + 1;
+ spin_unlock(&osp->opd_pre_lock);
+
+ return count;
+}
+LDEBUGFS_SEQ_FOPS(osp_reserved_mb_low);
+
+static ssize_t force_sync_store(struct kobject *kobj, struct attribute *attr,
+ const char *buffer, size_t count)
+{
+ struct dt_device *dt = container_of(kobj, struct dt_device,
+ dd_kobj);
+ struct lu_env env;
+ int rc;
+
+ rc = lu_env_init(&env, LCT_LOCAL);
+ if (rc)
+ return rc;
+
+ rc = dt_sync(&env, dt);
+ lu_env_fini(&env);
+
+ return rc == 0 ? count : rc;
+}
+LUSTRE_WO_ATTR(force_sync);
static struct lprocfs_vars lprocfs_osp_obd_vars[] = {
- { .name = "uuid",
- .fops = &osp_uuid_fops },
- { .name = "ping",
- .fops = &osp_ping_fops,
- .proc_mode = 0222 },
{ .name = "connect_flags",
.fops = &osp_connect_flags_fops },
{ .name = "ost_server_uuid",
.fops = &osp_server_uuid_fops },
- { .name = "ost_conn_uuid",
- .fops = &osp_conn_uuid_fops },
- { .name = "active",
- .fops = &osp_active_fops },
- { .name = "max_rpcs_in_flight",
- .fops = &osp_max_rpcs_in_flight_fops },
- { .name = "max_rpcs_in_progress",
- .fops = &osp_max_rpcs_in_prog_fops },
- { .name = "create_count",
- .fops = &osp_create_count_fops },
- { .name = "max_create_count",
- .fops = &osp_max_create_count_fops },
- { .name = "prealloc_next_id",
- .fops = &osp_prealloc_next_id_fops },
- { .name = "prealloc_next_seq",
- .fops = &osp_prealloc_next_seq_fops },
- { .name = "prealloc_last_id",
- .fops = &osp_prealloc_last_id_fops },
- { .name = "prealloc_last_seq",
- .fops = &osp_prealloc_last_seq_fops },
- { .name = "prealloc_reserved",
- .fops = &osp_prealloc_reserved_fops },
{ .name = "timeouts",
.fops = &osp_timeouts_fops },
{ .name = "import",
.fops = &osp_import_fops },
{ .name = "state",
.fops = &osp_state_fops },
- { .name = "maxage",
- .fops = &osp_maxage_fops },
- { .name = "prealloc_status",
- .fops = &osp_pre_status_fops },
- { .name = "sync_changes",
- .fops = &osp_syn_changes_fops },
- { .name = "sync_in_flight",
- .fops = &osp_syn_in_flight_fops },
- { .name = "sync_in_progress",
- .fops = &osp_syn_in_prog_fops },
- { .name = "old_sync_processed",
- .fops = &osp_old_sync_processed_fops },
-
- /* for compatibility reasons */
- { .name = "destroys_in_flight",
- .fops = &osp_destroys_in_flight_fops },
- { .name = "lfsck_max_rpcs_in_flight",
- .fops = &osp_lfsck_max_rpcs_in_flight_fops },
+ { .name = "reserved_mb_high",
+ .fops = &osp_reserved_mb_high_fops },
+ { .name = "reserved_mb_low",
+ .fops = &osp_reserved_mb_low_fops },
{ NULL }
};
static struct lprocfs_vars lprocfs_osp_md_vars[] = {
- { .name = "uuid",
- .fops = &osp_uuid_fops },
- { .name = "ping",
- .fops = &osp_ping_fops,
- .proc_mode = 0222 },
{ .name = "connect_flags",
.fops = &osp_connect_flags_fops },
{ .name = "mdt_server_uuid",
.fops = &osp_server_uuid_fops },
- { .name = "mdt_conn_uuid",
- .fops = &osp_conn_uuid_fops },
- { .name = "active",
- .fops = &osp_active_fops },
- { .name = "max_rpcs_in_flight",
- .fops = &osp_max_rpcs_in_flight_fops },
- { .name = "max_rpcs_in_progress",
- .fops = &osp_max_rpcs_in_prog_fops },
{ .name = "timeouts",
.fops = &osp_timeouts_fops },
{ .name = "import",
.fops = &osp_import_fops },
{ .name = "state",
.fops = &osp_state_fops },
- { .name = "maxage",
- .fops = &osp_maxage_fops },
- { .name = "prealloc_status",
- .fops = &osp_pre_status_fops },
-
- /* for compatibility reasons */
- { .name = "destroys_in_flight",
- .fops = &osp_destroys_in_flight_fops },
- { .name = "lfsck_max_rpcs_in_flight",
- .fops = &osp_lfsck_max_rpcs_in_flight_fops },
{ NULL }
};
-LPROC_SEQ_FOPS_RO_TYPE(osp, dt_blksize);
-LPROC_SEQ_FOPS_RO_TYPE(osp, dt_kbytestotal);
-LPROC_SEQ_FOPS_RO_TYPE(osp, dt_kbytesfree);
-LPROC_SEQ_FOPS_RO_TYPE(osp, dt_kbytesavail);
-LPROC_SEQ_FOPS_RO_TYPE(osp, dt_filestotal);
-LPROC_SEQ_FOPS_RO_TYPE(osp, dt_filesfree);
-
-static struct lprocfs_vars lprocfs_osp_osd_vars[] = {
- { .name = "blocksize",
- .fops = &osp_dt_blksize_fops },
- { .name = "kbytestotal",
- .fops = &osp_dt_kbytestotal_fops },
- { .name = "kbytesfree",
- .fops = &osp_dt_kbytesfree_fops },
- { .name = "kbytesavail",
- .fops = &osp_dt_kbytesavail_fops },
- { .name = "filestotal",
- .fops = &osp_dt_filestotal_fops },
- { .name = "filesfree",
- .fops = &osp_dt_filesfree_fops },
- { NULL }
+static struct attribute *osp_obd_attrs[] = {
+ /* First two for compatiability reasons */
+ &lustre_attr_lfsck_max_rpcs_in_flight.attr,
+ &lustre_attr_destroys_in_flight.attr,
+ &lustre_attr_active.attr,
+ &lustre_attr_max_rpcs_in_flight.attr,
+ &lustre_attr_max_rpcs_in_progress.attr,
+ &lustre_attr_maxage.attr,
+ &lustre_attr_ost_conn_uuid.attr,
+ &lustre_attr_ping.attr,
+ &lustre_attr_prealloc_status.attr,
+ &lustre_attr_prealloc_next_id.attr,
+ &lustre_attr_prealloc_last_id.attr,
+ &lustre_attr_prealloc_next_seq.attr,
+ &lustre_attr_prealloc_last_seq.attr,
+ &lustre_attr_prealloc_reserved.attr,
+ &lustre_attr_sync_in_flight.attr,
+ &lustre_attr_sync_in_progress.attr,
+ &lustre_attr_sync_changes.attr,
+ &lustre_attr_force_sync.attr,
+ &lustre_attr_old_sync_processed.attr,
+ &lustre_attr_create_count.attr,
+ &lustre_attr_max_create_count.attr,
+ NULL,
+};
+
+static struct attribute *osp_md_attrs[] = {
+ /* First two for compatiability reasons */
+ &lustre_attr_lfsck_max_rpcs_in_flight.attr,
+ &lustre_attr_destroys_in_flight.attr,
+ &lustre_attr_active.attr,
+ &lustre_attr_max_rpcs_in_flight.attr,
+ &lustre_attr_max_rpcs_in_progress.attr,
+ &lustre_attr_maxage.attr,
+ &lustre_attr_mdt_conn_uuid.attr,
+ &lustre_attr_ping.attr,
+ &lustre_attr_prealloc_status.attr,
+ NULL,
};
+void osp_tunables_fini(struct osp_device *osp)
+{
+ struct obd_device *obd = osp->opd_obd;
+ struct kobject *osc;
+
+ osc = kset_find_obj(lustre_kset, "osc");
+ if (osc) {
+ sysfs_remove_link(osc, obd->obd_name);
+ kobject_put(osc);
+ }
+
+ if (!IS_ERR_OR_NULL(osp->opd_debugfs))
+ ldebugfs_remove(&osp->opd_debugfs);
+
+ ptlrpc_lprocfs_unregister_obd(obd);
+
+ if (!IS_ERR_OR_NULL(obd->obd_debugfs_entry))
+ ldebugfs_remove(&obd->obd_debugfs_entry);
+
+ dt_tunables_fini(&osp->opd_dt_dev);
+}
+
/**
- * Initialize OSP lprocfs
+ * Initialize OSP sysfs / debugfs
*
* param[in] osp OSP device
*/
-void osp_lprocfs_init(struct osp_device *osp)
+void osp_tunables_init(struct osp_device *osp)
{
- struct obd_device *obd = osp->opd_obd;
- struct proc_dir_entry *osc_proc_dir = NULL;
- struct obd_type *type;
- int rc;
+ struct obd_device *obd = osp->opd_obd;
+ struct kobject *osc;
+ int rc;
- if (osp->opd_connect_mdt)
+ if (osp->opd_connect_mdt) {
+ osp->opd_dt_dev.dd_ktype.default_attrs = osp_md_attrs;
obd->obd_vars = lprocfs_osp_md_vars;
- else
+ } else {
+ osp->opd_dt_dev.dd_ktype.default_attrs = osp_obd_attrs;
obd->obd_vars = lprocfs_osp_obd_vars;
- if (lprocfs_obd_setup(obd) != 0)
- return;
+ }
- rc = lprocfs_add_vars(obd->obd_proc_entry, lprocfs_osp_osd_vars,
- &osp->opd_dt_dev);
+ rc = dt_tunables_init(&osp->opd_dt_dev, obd->obd_type, obd->obd_name,
+ NULL);
if (rc) {
- CERROR("%s: can't register in lprocfs, rc %d\n",
+ CERROR("%s: failed to setup DT tunables: %d\n",
+ obd->obd_name, rc);
+ return;
+ }
+
+ /* Since we register the obd device with ptlrpc / sptlrpc we
+ * have to register debugfs with obd_device
+ */
+ obd->obd_debugfs_entry = ldebugfs_register(obd->obd_name,
+ obd->obd_type->typ_debugfs_entry,
+ obd->obd_vars, obd);
+ if (IS_ERR_OR_NULL(obd->obd_debugfs_entry)) {
+ rc = obd->obd_debugfs_entry ? PTR_ERR(obd->obd_debugfs_entry)
+ : -ENOMEM;
+ CERROR("%s: error %d setting up debugfs\n",
obd->obd_name, rc);
+ obd->obd_debugfs_entry = NULL;
+ dt_tunables_fini(&osp->opd_dt_dev);
return;
}
/* If the real OSC is present which is the case for setups
* with both server and clients on the same node then use
- * the OSC's proc root */
- type = class_search_type(LUSTRE_OSC_NAME);
- if (type != NULL && type->typ_procroot != NULL)
- osc_proc_dir = type->typ_procroot;
- else
- osc_proc_dir = obd->obd_type->typ_procsym;
-
- if (osc_proc_dir == NULL)
- return;
+ * the OSC's proc root
+ */
+ osc = kset_find_obj(lustre_kset, "osc");
+ if (osc) {
+ rc = sysfs_create_link(osc, &osp->opd_dt_dev.dd_kobj,
+ obd->obd_name);
+ kobject_put(osc);
+ }
- /* for compatibility we link old procfs's OSC entries to osp ones */
- osp->opd_symlink = lprocfs_add_symlink(obd->obd_name, osc_proc_dir,
- "../osp/%s", obd->obd_name);
- if (osp->opd_symlink == NULL)
- CERROR("cannot create OSC symlink for /proc/fs/lustre/osp/%s\n",
+ osp->opd_debugfs = ldebugfs_add_symlink(obd->obd_name, "osc",
+ "../osp/%s", obd->obd_name);
+ if (!osp->opd_debugfs)
+ CERROR("%s: failed to create OSC debugfs symlink\n",
obd->obd_name);
}
-
-#endif /* CONFIG_PROC_FS */
-