X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosp%2Flproc_osp.c;h=565afd9bd739852c20059c52a069eb3031b8d9a9;hb=cffd726304667ea3d84b4b3c1a9b66565e5a5566;hp=1dd26b78a6c9f0222dc92e02b4f575d8219c25a0;hpb=b1e595c09e1b07a6840142b3ae015b8a5a8affeb;p=fs%2Flustre-release.git diff --git a/lustre/osp/lproc_osp.c b/lustre/osp/lproc_osp.c index 1dd26b7..565afd9 100644 --- a/lustre/osp/lproc_osp.c +++ b/lustre/osp/lproc_osp.c @@ -23,7 +23,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, 2013, 2014 Intel Corporation. + * Copyright (c) 2012, 2016, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -40,7 +40,7 @@ #include "osp_internal.h" -#ifdef LPROCFS +#ifdef CONFIG_PROC_FS /** * Show OSP active status * @@ -52,12 +52,11 @@ static int osp_active_seq_show(struct seq_file *m, void *data) { struct obd_device *dev = m->private; - int rc; LPROCFS_CLIMP_CHECK(dev); - rc = seq_printf(m, "%d\n", !dev->u.cli.cl_import->imp_deactive); + seq_printf(m, "%d\n", !dev->u.cli.cl_import->imp_deactive); LPROCFS_CLIMP_EXIT(dev); - return rc; + return 0; } /** @@ -71,14 +70,15 @@ static int osp_active_seq_show(struct seq_file *m, void *data) * \retval negative number on error */ static ssize_t -osp_active_seq_write(struct file *file, const char *buffer, +osp_active_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { - struct seq_file *m = file->private_data; + struct seq_file *m = file->private_data; struct obd_device *dev = m->private; - int val, rc; + int rc; + __s64 val; - rc = lprocfs_write_helper(buffer, count, &val); + rc = lprocfs_str_to_s64(buffer, count, &val); if (rc) return rc; if (val < 0 || val > 1) @@ -89,7 +89,7 @@ osp_active_seq_write(struct file *file, const char *buffer, if (dev->u.cli.cl_import->imp_deactive == val) rc = ptlrpc_set_import_active(dev->u.cli.cl_import, val); else - CDEBUG(D_CONFIG, "activate %d: ignoring repeat request\n", + CDEBUG(D_CONFIG, "activate %lld: ignoring repeat request\n", val); LPROCFS_CLIMP_EXIT(dev); @@ -113,7 +113,8 @@ static int osp_syn_in_flight_seq_show(struct seq_file *m, void *data) if (osp == NULL) return -EINVAL; - return seq_printf(m, "%u\n", osp->opd_syn_rpc_in_flight); + seq_printf(m, "%u\n", atomic_read(&osp->opd_syn_rpc_in_flight)); + return 0; } LPROC_SEQ_FOPS_RO(osp_syn_in_flight); @@ -133,7 +134,8 @@ static int osp_syn_in_prog_seq_show(struct seq_file *m, void *data) if (osp == NULL) return -EINVAL; - return seq_printf(m, "%u\n", osp->opd_syn_rpc_in_progress); + seq_printf(m, "%u\n", atomic_read(&osp->opd_syn_rpc_in_progress)); + return 0; } LPROC_SEQ_FOPS_RO(osp_syn_in_prog); @@ -153,7 +155,8 @@ static int osp_syn_changes_seq_show(struct seq_file *m, void *data) if (osp == NULL) return -EINVAL; - return seq_printf(m, "%lu\n", osp->opd_syn_changes); + seq_printf(m, "%u\n", atomic_read(&osp->opd_syn_changes)); + return 0; } /** @@ -166,7 +169,8 @@ static int osp_syn_changes_seq_show(struct seq_file *m, void *data) * \retval \a count on success * \retval negative number on error */ -static ssize_t osp_syn_changes_seq_write(struct file *file, const char *buffer, +static ssize_t osp_syn_changes_seq_write(struct file *file, + const char __user *buffer, size_t count, loff_t *off) { struct seq_file *m = file->private_data; @@ -202,7 +206,8 @@ static int osp_max_rpcs_in_flight_seq_show(struct seq_file *m, void *data) if (osp == NULL) return -EINVAL; - return seq_printf(m, "%u\n", osp->opd_syn_max_rpc_in_flight); + seq_printf(m, "%u\n", osp->opd_syn_max_rpc_in_flight); + return 0; } /** @@ -216,22 +221,23 @@ static int osp_max_rpcs_in_flight_seq_show(struct seq_file *m, void *data) * \retval negative number on error */ static ssize_t -osp_max_rpcs_in_flight_seq_write(struct file *file, const char *buffer, +osp_max_rpcs_in_flight_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); - int val, rc; + struct seq_file *m = file->private_data; + struct obd_device *dev = m->private; + struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev); + int rc; + __s64 val; if (osp == NULL) return -EINVAL; - rc = lprocfs_write_helper(buffer, count, &val); + rc = lprocfs_str_to_s64(buffer, count, &val); if (rc) return rc; - if (val < 1) + if (val < 1 || val > INT_MAX) return -ERANGE; osp->opd_syn_max_rpc_in_flight = val; @@ -255,7 +261,8 @@ static int osp_max_rpcs_in_prog_seq_show(struct seq_file *m, void *data) if (osp == NULL) return -EINVAL; - return seq_printf(m, "%u\n", osp->opd_syn_max_rpc_in_progress); + seq_printf(m, "%u\n", osp->opd_syn_max_rpc_in_progress); + return 0; } /** @@ -269,22 +276,23 @@ static int osp_max_rpcs_in_prog_seq_show(struct seq_file *m, void *data) * \retval negative number on error */ static ssize_t -osp_max_rpcs_in_prog_seq_write(struct file *file, const char *buffer, +osp_max_rpcs_in_prog_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); - int val, rc; + struct seq_file *m = file->private_data; + struct obd_device *dev = m->private; + struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev); + int rc; + __s64 val; if (osp == NULL) return -EINVAL; - rc = lprocfs_write_helper(buffer, count, &val); + rc = lprocfs_str_to_s64(buffer, count, &val); if (rc) return rc; - if (val < 1) + if (val < 1 || val > INT_MAX) return -ERANGE; osp->opd_syn_max_rpc_in_progress = val; @@ -309,7 +317,8 @@ static int osp_create_count_seq_show(struct seq_file *m, void *data) if (osp == NULL || osp->opd_pre == NULL) return 0; - return seq_printf(m, "%d\n", osp->opd_pre_grow_count); + seq_printf(m, "%d\n", osp->opd_pre_create_count); + return 0; } /** @@ -323,18 +332,19 @@ static int osp_create_count_seq_show(struct seq_file *m, void *data) * \retval negative number on error */ static ssize_t -osp_create_count_seq_write(struct file *file, const char *buffer, +osp_create_count_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 *obd = m->private; - struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev); - int val, rc, i; + struct seq_file *m = file->private_data; + struct obd_device *obd = m->private; + struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev); + int rc, i; + __s64 val; if (osp == NULL || osp->opd_pre == NULL) return 0; - rc = lprocfs_write_helper(buffer, count, &val); + rc = lprocfs_str_to_s64(buffer, count, &val); if (rc) return rc; @@ -350,12 +360,12 @@ osp_create_count_seq_write(struct file *file, const char *buffer, * filesystem as a safety measure. */ if (val < OST_MIN_PRECREATE || val > OST_MAX_PRECREATE) return -ERANGE; - if (val > osp->opd_pre_max_grow_count) + if (val > osp->opd_pre_max_create_count) return -ERANGE; for (i = 1; (i << 1) <= val; i <<= 1) ; - osp->opd_pre_grow_count = i; + osp->opd_pre_create_count = i; return count; } @@ -377,7 +387,8 @@ static int osp_max_create_count_seq_show(struct seq_file *m, void *data) if (osp == NULL || osp->opd_pre == NULL) return 0; - return seq_printf(m, "%d\n", osp->opd_pre_max_grow_count); + seq_printf(m, "%d\n", osp->opd_pre_max_create_count); + return 0; } /** @@ -391,30 +402,31 @@ static int osp_max_create_count_seq_show(struct seq_file *m, void *data) * \retval negative number on error */ static ssize_t -osp_max_create_count_seq_write(struct file *file, const char *buffer, +osp_max_create_count_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 *obd = m->private; - struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev); - int val, rc; + struct seq_file *m = file->private_data; + struct obd_device *obd = m->private; + struct osp_device *osp = lu2osp_dev(obd->obd_lu_dev); + int rc; + __s64 val; if (osp == NULL || osp->opd_pre == NULL) return 0; - rc = lprocfs_write_helper(buffer, count, &val); + rc = lprocfs_str_to_s64(buffer, count, &val); if (rc) return rc; - if (val < 0) + if (val < 0 || val > INT_MAX) return -ERANGE; if (val > OST_MAX_PRECREATE) return -ERANGE; - if (osp->opd_pre_grow_count > val) - osp->opd_pre_grow_count = val; + if (osp->opd_pre_create_count > val) + osp->opd_pre_create_count = val; - osp->opd_pre_max_grow_count = val; + osp->opd_pre_max_create_count = val; return count; } @@ -436,7 +448,8 @@ static int osp_prealloc_next_id_seq_show(struct seq_file *m, void *data) if (osp == NULL || osp->opd_pre == NULL) return 0; - return seq_printf(m, "%u\n", fid_oid(&osp->opd_pre_used_fid) + 1); + seq_printf(m, "%u\n", fid_oid(&osp->opd_pre_used_fid) + 1); + return 0; } LPROC_SEQ_FOPS_RO(osp_prealloc_next_id); @@ -456,7 +469,8 @@ static int osp_prealloc_last_id_seq_show(struct seq_file *m, void *data) if (osp == NULL || osp->opd_pre == NULL) return 0; - return seq_printf(m, "%u\n", fid_oid(&osp->opd_pre_last_created_fid)); + seq_printf(m, "%u\n", fid_oid(&osp->opd_pre_last_created_fid)); + return 0; } LPROC_SEQ_FOPS_RO(osp_prealloc_last_id); @@ -476,7 +490,8 @@ static int osp_prealloc_next_seq_seq_show(struct seq_file *m, void *data) if (osp == NULL || osp->opd_pre == NULL) return 0; - return seq_printf(m, LPX64"\n", fid_seq(&osp->opd_pre_used_fid)); + seq_printf(m, "%#llx\n", fid_seq(&osp->opd_pre_used_fid)); + return 0; } LPROC_SEQ_FOPS_RO(osp_prealloc_next_seq); @@ -496,8 +511,9 @@ static int osp_prealloc_last_seq_seq_show(struct seq_file *m, void *data) if (osp == NULL || osp->opd_pre == NULL) return 0; - return seq_printf(m, LPX64"\n", - fid_seq(&osp->opd_pre_last_created_fid)); + seq_printf(m, "%#llx\n", + fid_seq(&osp->opd_pre_last_created_fid)); + return 0; } LPROC_SEQ_FOPS_RO(osp_prealloc_last_seq); @@ -517,7 +533,8 @@ static int osp_prealloc_reserved_seq_show(struct seq_file *m, void *data) if (osp == NULL || osp->opd_pre == NULL) return 0; - return seq_printf(m, LPU64"\n", osp->opd_pre_reserved); + seq_printf(m, "%llu\n", osp->opd_pre_reserved); + return 0; } LPROC_SEQ_FOPS_RO(osp_prealloc_reserved); @@ -537,7 +554,8 @@ static int osp_maxage_seq_show(struct seq_file *m, void *data) if (osp == NULL) return -EINVAL; - return seq_printf(m, "%u\n", osp->opd_statfs_maxage); + seq_printf(m, "%u\n", osp->opd_statfs_maxage); + return 0; } /** @@ -551,22 +569,23 @@ static int osp_maxage_seq_show(struct seq_file *m, void *data) * \retval negative number on error */ static ssize_t -osp_maxage_seq_write(struct file *file, const char *buffer, +osp_maxage_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); - int val, rc; + struct seq_file *m = file->private_data; + struct obd_device *dev = m->private; + struct osp_device *osp = lu2osp_dev(dev->obd_lu_dev); + int rc; + __s64 val; if (osp == NULL) return -EINVAL; - rc = lprocfs_write_helper(buffer, count, &val); + rc = lprocfs_str_to_s64(buffer, count, &val); if (rc) return rc; - if (val < 1) + if (val < 1 || val > INT_MAX) return -ERANGE; osp->opd_statfs_maxage = val; @@ -592,7 +611,8 @@ static int osp_pre_status_seq_show(struct seq_file *m, void *data) if (osp == NULL || osp->opd_pre == NULL) return -EINVAL; - return seq_printf(m, "%d\n", osp->opd_pre_status); + seq_printf(m, "%d\n", osp->opd_pre_status); + return 0; } LPROC_SEQ_FOPS_RO(osp_pre_status); @@ -619,8 +639,10 @@ static int osp_destroys_in_flight_seq_show(struct seq_file *m, void *data) if (osp == NULL) return -EINVAL; - return seq_printf(m, "%lu\n", - osp->opd_syn_rpc_in_progress + osp->opd_syn_changes); + seq_printf(m, "%u\n", + atomic_read(&osp->opd_syn_rpc_in_progress) + + atomic_read(&osp->opd_syn_changes)); + return 0; } LPROC_SEQ_FOPS_RO(osp_destroys_in_flight); @@ -640,7 +662,8 @@ static int osp_old_sync_processed_seq_show(struct seq_file *m, void *data) if (osp == NULL) return -EINVAL; - return seq_printf(m, "%d\n", osp->opd_syn_prev_done); + seq_printf(m, "%d\n", osp->opd_syn_prev_done); + return 0; } LPROC_SEQ_FOPS_RO(osp_old_sync_processed); @@ -659,7 +682,8 @@ osp_lfsck_max_rpcs_in_flight_seq_show(struct seq_file *m, void *data) __u32 max; max = obd_get_max_rpcs_in_flight(&dev->u.cli); - return seq_printf(m, "%u\n", max); + seq_printf(m, "%u\n", max); + return 0; } /** @@ -679,15 +703,18 @@ osp_lfsck_max_rpcs_in_flight_seq_write(struct file *file, { struct seq_file *m = file->private_data; struct obd_device *dev = m->private; - int val; + __s64 val; int rc; - rc = lprocfs_write_helper(buffer, count, &val); - if (rc == 0) - rc = obd_set_max_rpcs_in_flight(&dev->u.cli, val); + rc = lprocfs_str_to_s64(buffer, count, &val); + if (rc == 0) { + if (val < 0) + return -ERANGE; - if (rc != 0) + rc = obd_set_max_rpcs_in_flight(&dev->u.cli, val); + } else { count = rc; + } return count; } @@ -717,7 +744,127 @@ LPROC_SEQ_FOPS_RO_TYPE(osp, timeouts); LPROC_SEQ_FOPS_RW_TYPE(osp, import); LPROC_SEQ_FOPS_RO_TYPE(osp, state); -static struct lprocfs_seq_vars lprocfs_osp_obd_vars[] = { +/** + * 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_reserved_mb_high_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_high); + return 0; +} + +/** + * 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) + 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; +} +LPROC_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) + 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; +} +LPROC_SEQ_FOPS(osp_reserved_mb_low); + +static struct lprocfs_vars lprocfs_osp_obd_vars[] = { { .name = "uuid", .fops = &osp_uuid_fops }, { .name = "ping", @@ -767,13 +914,54 @@ static struct lprocfs_seq_vars lprocfs_osp_obd_vars[] = { .fops = &osp_syn_in_prog_fops }, { .name = "old_sync_processed", .fops = &osp_old_sync_processed_fops }, + { .name = "reserved_mb_high", + .fops = &osp_reserved_mb_high_fops }, + { .name = "reserved_mb_low", + .fops = &osp_reserved_mb_low_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 } +}; + +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 }, - { 0 } + { NULL } }; LPROC_SEQ_FOPS_RO_TYPE(osp, dt_blksize); @@ -783,7 +971,7 @@ 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_seq_vars lprocfs_osp_osd_vars[] = { +static struct lprocfs_vars lprocfs_osp_osd_vars[] = { { .name = "blocksize", .fops = &osp_dt_blksize_fops }, { .name = "kbytestotal", @@ -796,7 +984,7 @@ static struct lprocfs_seq_vars lprocfs_osp_osd_vars[] = { .fops = &osp_dt_filestotal_fops }, { .name = "filesfree", .fops = &osp_dt_filesfree_fops }, - { 0 } + { NULL } }; /** @@ -811,18 +999,22 @@ void osp_lprocfs_init(struct osp_device *osp) struct obd_type *type; int rc; - obd->obd_vars = lprocfs_osp_obd_vars; + if (osp->opd_connect_mdt) + obd->obd_vars = lprocfs_osp_md_vars; + else + obd->obd_vars = lprocfs_osp_obd_vars; if (lprocfs_obd_setup(obd) != 0) return; - rc = lprocfs_seq_add_vars(obd->obd_proc_entry, lprocfs_osp_osd_vars, - &osp->opd_dt_dev); + rc = lprocfs_add_vars(obd->obd_proc_entry, lprocfs_osp_osd_vars, + &osp->opd_dt_dev); if (rc) { CERROR("%s: can't register in lprocfs, rc %d\n", obd->obd_name, rc); return; } + sptlrpc_lprocfs_cliobd_attach(obd); ptlrpc_lprocfs_register_obd(obd); if (osp->opd_connect_mdt || !strstr(obd->obd_name, "osc")) @@ -848,5 +1040,5 @@ void osp_lprocfs_init(struct osp_device *osp) obd->obd_name); } -#endif /* LPROCFS */ +#endif /* CONFIG_PROC_FS */