X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fllite%2Flproc_llite.c;h=66d0f11e61996b22927fbf8630373dd14d322d0e;hp=91f003cbdd41f78b733d2c526945d099276c7b74;hb=e31285e62f146398c18e419290ecf0cc1b932616;hpb=817a8e6ee03324ca230a2b1b5e02c9d9021e7f9f diff --git a/lustre/llite/lproc_llite.c b/lustre/llite/lproc_llite.c index 91f003c..66d0f11 100644 --- a/lustre/llite/lproc_llite.c +++ b/lustre/llite/lproc_llite.c @@ -84,19 +84,21 @@ static const struct file_operations ll_rw_extents_stats_pp_fops; static const struct file_operations ll_rw_offset_stats_fops; static __s64 ll_stats_pid_write(const char __user *buf, size_t len); -static int ll_blksize_seq_show(struct seq_file *m, void *v) +static ssize_t blocksize_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct super_block *sb = m->private; + struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info, + ll_kset.kobj); struct obd_statfs osfs; int rc; - LASSERT(sb != NULL); - rc = ll_statfs_internal(ll_s2sbi(sb), &osfs, OBD_STATFS_NODELAY); - if (!rc) - seq_printf(m, "%u\n", osfs.os_bsize); - return rc; + rc = ll_statfs_internal(sbi, &osfs, OBD_STATFS_NODELAY); + if (rc) + return rc; + + return sprintf(buf, "%u\n", osfs.os_bsize); } -LPROC_SEQ_FOPS_RO(ll_blksize); +LUSTRE_RO_ATTR(blocksize); static int ll_stat_blksize_seq_show(struct seq_file *m, void *v) { @@ -129,128 +131,133 @@ static ssize_t ll_stat_blksize_seq_write(struct file *file, } LPROC_SEQ_FOPS(ll_stat_blksize); -static int ll_kbytestotal_seq_show(struct seq_file *m, void *v) +static ssize_t kbytestotal_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct super_block *sb = m->private; + struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info, + ll_kset.kobj); struct obd_statfs osfs; + u32 blk_size; + u64 result; int rc; - LASSERT(sb != NULL); - rc = ll_statfs_internal(ll_s2sbi(sb), &osfs, OBD_STATFS_NODELAY); - if (!rc) { - __u32 blk_size = osfs.os_bsize >> 10; - __u64 result = osfs.os_blocks; + rc = ll_statfs_internal(sbi, &osfs, OBD_STATFS_NODELAY); + if (rc) + return rc; - while (blk_size >>= 1) - result <<= 1; + blk_size = osfs.os_bsize >> 10; + result = osfs.os_blocks; - seq_printf(m, "%llu\n", result); - } - return rc; + while (blk_size >>= 1) + result <<= 1; + + return sprintf(buf, "%llu\n", result); } -LPROC_SEQ_FOPS_RO(ll_kbytestotal); +LUSTRE_RO_ATTR(kbytestotal); -static int ll_kbytesfree_seq_show(struct seq_file *m, void *v) +static ssize_t kbytesfree_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct super_block *sb = m->private; + struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info, + ll_kset.kobj); struct obd_statfs osfs; + u32 blk_size; + u64 result; int rc; - LASSERT(sb != NULL); - rc = ll_statfs_internal(ll_s2sbi(sb), &osfs, OBD_STATFS_NODELAY); - if (!rc) { - __u32 blk_size = osfs.os_bsize >> 10; - __u64 result = osfs.os_bfree; + rc = ll_statfs_internal(sbi, &osfs, OBD_STATFS_NODELAY); + if (rc) + return rc; - while (blk_size >>= 1) - result <<= 1; + blk_size = osfs.os_bsize >> 10; + result = osfs.os_bfree; - seq_printf(m, "%llu\n", result); - } - return rc; + while (blk_size >>= 1) + result <<= 1; + + return sprintf(buf, "%llu\n", result); } -LPROC_SEQ_FOPS_RO(ll_kbytesfree); +LUSTRE_RO_ATTR(kbytesfree); -static int ll_kbytesavail_seq_show(struct seq_file *m, void *v) +static ssize_t kbytesavail_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct super_block *sb = m->private; + struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info, + ll_kset.kobj); struct obd_statfs osfs; + u32 blk_size; + u64 result; int rc; - LASSERT(sb != NULL); - rc = ll_statfs_internal(ll_s2sbi(sb), &osfs, OBD_STATFS_NODELAY); - if (!rc) { - __u32 blk_size = osfs.os_bsize >> 10; - __u64 result = osfs.os_bavail; + rc = ll_statfs_internal(sbi, &osfs, OBD_STATFS_NODELAY); + if (rc) + return rc; - while (blk_size >>= 1) - result <<= 1; + blk_size = osfs.os_bsize >> 10; + result = osfs.os_bavail; - seq_printf(m, "%llu\n", result); - } - return rc; + while (blk_size >>= 1) + result <<= 1; + + return sprintf(buf, "%llu\n", result); } -LPROC_SEQ_FOPS_RO(ll_kbytesavail); +LUSTRE_RO_ATTR(kbytesavail); -static int ll_filestotal_seq_show(struct seq_file *m, void *v) +static ssize_t filestotal_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct super_block *sb = m->private; + struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info, + ll_kset.kobj); struct obd_statfs osfs; int rc; - LASSERT(sb != NULL); - rc = ll_statfs_internal(ll_s2sbi(sb), &osfs, OBD_STATFS_NODELAY); - if (!rc) - seq_printf(m, "%llu\n", osfs.os_files); - return rc; + rc = ll_statfs_internal(sbi, &osfs, OBD_STATFS_NODELAY); + if (rc) + return rc; + + return sprintf(buf, "%llu\n", osfs.os_files); } -LPROC_SEQ_FOPS_RO(ll_filestotal); +LUSTRE_RO_ATTR(filestotal); -static int ll_filesfree_seq_show(struct seq_file *m, void *v) +static ssize_t filesfree_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct super_block *sb = m->private; + struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info, + ll_kset.kobj); struct obd_statfs osfs; int rc; - LASSERT(sb != NULL); - rc = ll_statfs_internal(ll_s2sbi(sb), &osfs, OBD_STATFS_NODELAY); - if (!rc) - seq_printf(m, "%llu\n", osfs.os_ffree); - return rc; + rc = ll_statfs_internal(sbi, &osfs, OBD_STATFS_NODELAY); + if (rc) + return rc; + + return sprintf(buf, "%llu\n", osfs.os_ffree); } -LPROC_SEQ_FOPS_RO(ll_filesfree); +LUSTRE_RO_ATTR(filesfree); -static int ll_client_type_seq_show(struct seq_file *m, void *v) +static ssize_t client_type_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct ll_sb_info *sbi = ll_s2sbi((struct super_block *)m->private); - - LASSERT(sbi != NULL); - - seq_puts(m, "local client\n"); - return 0; + return sprintf(buf, "local client\n"); } -LPROC_SEQ_FOPS_RO(ll_client_type); +LUSTRE_RO_ATTR(client_type); -static int ll_fstype_seq_show(struct seq_file *m, void *v) +static ssize_t fstype_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct super_block *sb = m->private; - struct ll_sb_info *sbi = ll_s2sbi(sb); - - LASSERT(sb != NULL); - seq_printf(m, "%s\n", sbi->ll_mnt.mnt->mnt_sb->s_type->name); - return 0; + return sprintf(buf, "lustre\n"); } -LPROC_SEQ_FOPS_RO(ll_fstype); +LUSTRE_RO_ATTR(fstype); -static int ll_sb_uuid_seq_show(struct seq_file *m, void *v) +static ssize_t uuid_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct super_block *sb = m->private; + struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info, + ll_kset.kobj); - LASSERT(sb != NULL); - seq_printf(m, "%s\n", ll_s2sbi(sb)->ll_sb_uuid.uuid); - return 0; + return sprintf(buf, "%s\n", sbi->ll_sb_uuid.uuid); } -LPROC_SEQ_FOPS_RO(ll_sb_uuid); +LUSTRE_RO_ATTR(uuid); static int ll_xattr_cache_seq_show(struct seq_file *m, void *v) { @@ -573,21 +580,22 @@ out: } LPROC_SEQ_FOPS(ll_max_cached_mb); -static int ll_checksum_seq_show(struct seq_file *m, void *v) +static ssize_t checksum_pages_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct super_block *sb = m->private; - struct ll_sb_info *sbi = ll_s2sbi(sb); + struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info, + ll_kset.kobj); - seq_printf(m, "%u\n", (sbi->ll_flags & LL_SBI_CHECKSUM) ? 1 : 0); - return 0; + return sprintf(buf, "%u\n", (sbi->ll_flags & LL_SBI_CHECKSUM) ? 1 : 0); } -static ssize_t ll_checksum_seq_write(struct file *file, - const char __user *buffer, - size_t count, loff_t *off) +static ssize_t checksum_pages_store(struct kobject *kobj, + struct attribute *attr, + const char *buffer, + size_t count) { - struct seq_file *m = file->private_data; - struct ll_sb_info *sbi = ll_s2sbi((struct super_block *)m->private); + struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info, + ll_kset.kobj); bool val; int tmp; int rc; @@ -596,7 +604,7 @@ static ssize_t ll_checksum_seq_write(struct file *file, /* Not set up yet */ return -EAGAIN; - rc = kstrtobool_from_user(buffer, count, &val); + rc = kstrtobool(buffer, &val); if (rc) return rc; if (val) @@ -612,7 +620,7 @@ static ssize_t ll_checksum_seq_write(struct file *file, return count; } -LPROC_SEQ_FOPS(ll_checksum); +LUSTRE_RW_ATTR(checksum_pages); static int ll_rd_track_id(struct seq_file *m, enum stats_track_type type) { @@ -691,6 +699,42 @@ static ssize_t ll_track_gid_seq_write(struct file *file, } LPROC_SEQ_FOPS(ll_track_gid); +static ssize_t statahead_running_max_show(struct kobject *kobj, + struct attribute *attr, + char *buf) +{ + struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info, + ll_kset.kobj); + + return snprintf(buf, 16, "%u\n", sbi->ll_sa_running_max); +} + +static ssize_t statahead_running_max_store(struct kobject *kobj, + struct attribute *attr, + const char *buffer, + size_t count) +{ + struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info, + ll_kset.kobj); + unsigned long val; + int rc; + + rc = kstrtoul(buffer, 0, &val); + if (rc) + return rc; + + if (val <= LL_SA_RUNNING_MAX) { + sbi->ll_sa_running_max = val; + return count; + } + + CERROR("Bad statahead_running_max value %lu. Valid values " + "are in the range [0, %d]\n", val, LL_SA_RUNNING_MAX); + + return -ERANGE; +} +LUSTRE_RW_ATTR(statahead_running_max); + static int ll_statahead_max_seq_show(struct seq_file *m, void *v) { struct super_block *sb = m->private; @@ -1128,28 +1172,10 @@ static ssize_t ll_nosquash_nids_seq_write(struct file *file, LPROC_SEQ_FOPS(ll_nosquash_nids); struct lprocfs_vars lprocfs_llite_obd_vars[] = { - { .name = "uuid", - .fops = &ll_sb_uuid_fops }, - { .name = "fstype", - .fops = &ll_fstype_fops }, { .name = "site", .fops = &ll_site_stats_fops }, - { .name = "blocksize", - .fops = &ll_blksize_fops }, { .name = "stat_blocksize", .fops = &ll_stat_blksize_fops }, - { .name = "kbytestotal", - .fops = &ll_kbytestotal_fops }, - { .name = "kbytesfree", - .fops = &ll_kbytesfree_fops }, - { .name = "kbytesavail", - .fops = &ll_kbytesavail_fops }, - { .name = "filestotal", - .fops = &ll_filestotal_fops }, - { .name = "filesfree", - .fops = &ll_filesfree_fops }, - { .name = "client_type", - .fops = &ll_client_type_fops }, { .name = "max_read_ahead_mb", .fops = &ll_max_readahead_mb_fops }, { .name = "max_read_ahead_per_file_mb", @@ -1158,8 +1184,6 @@ struct lprocfs_vars lprocfs_llite_obd_vars[] = { .fops = &ll_max_read_ahead_whole_mb_fops }, { .name = "max_cached_mb", .fops = &ll_max_cached_mb_fops }, - { .name = "checksum_pages", - .fops = &ll_checksum_fops }, { .name = "stats_track_pid", .fops = &ll_track_pid_fops }, { .name = "stats_track_ppid", @@ -1200,6 +1224,17 @@ struct lprocfs_vars lprocfs_llite_obd_vars[] = { #define MAX_STRING_SIZE 128 static struct attribute *llite_attrs[] = { + &lustre_attr_blocksize.attr, + &lustre_attr_kbytestotal.attr, + &lustre_attr_kbytesfree.attr, + &lustre_attr_kbytesavail.attr, + &lustre_attr_filestotal.attr, + &lustre_attr_filesfree.attr, + &lustre_attr_client_type.attr, + &lustre_attr_fstype.attr, + &lustre_attr_uuid.attr, + &lustre_attr_checksum_pages.attr, + &lustre_attr_statahead_running_max.attr, NULL, }; @@ -1306,6 +1341,7 @@ LPROC_SEQ_FOPS_RO_TYPE(llite, uuid); int ll_debugfs_register_super(struct super_block *sb, const char *name) { + struct lustre_sb_info *lsi = s2lsi(sb); struct ll_sb_info *sbi = ll_s2sbi(sb); struct lprocfs_vars lvars[2]; int err, id, rc; @@ -1398,6 +1434,9 @@ int ll_debugfs_register_super(struct super_block *sb, const char *name) err = kset_register(&sbi->ll_kset); if (err) GOTO(out_ra_stats, err); + + lsi->lsi_kobj = kobject_get(&sbi->ll_kset.kobj); + RETURN(0); out_ra_stats: lprocfs_free_stats(&sbi->ll_ra_stats); @@ -1460,8 +1499,11 @@ out: void ll_debugfs_unregister_super(struct super_block *sb) { + struct lustre_sb_info *lsi = s2lsi(sb); struct ll_sb_info *sbi = ll_s2sbi(sb); + kobject_put(lsi->lsi_kobj); + kset_unregister(&sbi->ll_kset); wait_for_completion(&sbi->ll_kobj_unregister); @@ -1766,7 +1808,7 @@ static int ll_rw_offset_stats_seq_show(struct seq_file *seq, void *v) for (i = 0; i < LL_OFFSET_HIST_MAX; i++) { if (offset[i].rw_pid != 0) seq_printf(seq, - "%3c %10d %14Lu %14Lu %17lu %17lu %14Lu", + "%3c %10d %14llu %14llu %17lu %17lu %14llu\n", offset[i].rw_op == READ ? 'R' : 'W', offset[i].rw_pid, offset[i].rw_range_start, @@ -1780,7 +1822,7 @@ static int ll_rw_offset_stats_seq_show(struct seq_file *seq, void *v) for (i = 0; i < LL_PROCESS_HIST_MAX; i++) { if (process[i].rw_pid != 0) seq_printf(seq, - "%3c %10d %14Lu %14Lu %17lu %17lu %14Lu", + "%3c %10d %14llu %14llu %17lu %17lu %14llu\n", process[i].rw_op == READ ? 'R' : 'W', process[i].rw_pid, process[i].rw_range_start,