-static struct lprocfs_vars lprocfs_llite_obd_vars[] = {
- { "uuid", ll_rd_sb_uuid, 0, 0 },
- //{ "mntpt_path", ll_rd_path, 0, 0 },
- { "fstype", ll_rd_fstype, 0, 0 },
- { "site", ll_rd_site_stats, 0, 0 },
- { "blocksize", ll_rd_blksize, 0, 0 },
- { "kbytestotal", ll_rd_kbytestotal, 0, 0 },
- { "kbytesfree", ll_rd_kbytesfree, 0, 0 },
- { "kbytesavail", ll_rd_kbytesavail, 0, 0 },
- { "filestotal", ll_rd_filestotal, 0, 0 },
- { "filesfree", ll_rd_filesfree, 0, 0 },
- { "client_type", ll_rd_client_type, 0, 0 },
- //{ "filegroups", lprocfs_rd_filegroups, 0, 0 },
- { "max_read_ahead_mb", ll_rd_max_readahead_mb,
- ll_wr_max_readahead_mb, 0 },
- { "max_read_ahead_whole_mb", ll_rd_max_read_ahead_whole_mb,
- ll_wr_max_read_ahead_whole_mb, 0 },
- { "max_cached_mb", ll_rd_max_cached_mb, ll_wr_max_cached_mb, 0 },
- { "checksum_pages", ll_rd_checksum, ll_wr_checksum, 0 },
- { "max_rw_chunk", ll_rd_max_rw_chunk, ll_wr_max_rw_chunk, 0 },
- { "stats_track_pid", ll_rd_track_pid, ll_wr_track_pid, 0 },
- { "stats_track_ppid", ll_rd_track_ppid, ll_wr_track_ppid, 0 },
- { "stats_track_gid", ll_rd_track_gid, ll_wr_track_gid, 0 },
- { "statahead_max", ll_rd_statahead_max, ll_wr_statahead_max, 0 },
- { "statahead_stats", ll_rd_statahead_stats, 0, 0 },
- { 0 }
+static ssize_t ll_lazystatfs_seq_write(struct file *file,
+ const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct ll_sb_info *sbi = ll_s2sbi((struct super_block *)m->private);
+ int val, rc;
+
+ rc = lprocfs_write_helper(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ if (val)
+ sbi->ll_flags |= LL_SBI_LAZYSTATFS;
+ else
+ sbi->ll_flags &= ~LL_SBI_LAZYSTATFS;
+
+ return count;
+}
+LPROC_SEQ_FOPS(ll_lazystatfs);
+
+static int ll_max_easize_seq_show(struct seq_file *m, void *v)
+{
+ struct super_block *sb = m->private;
+ struct ll_sb_info *sbi = ll_s2sbi(sb);
+ unsigned int ealen;
+ int rc;
+
+ rc = ll_get_max_mdsize(sbi, &ealen);
+ if (rc)
+ return rc;
+
+ return seq_printf(m, "%u\n", ealen);
+}
+LPROC_SEQ_FOPS_RO(ll_max_easize);
+
+/**
+ * Get default_easize.
+ *
+ * \see client_obd::cl_default_mds_easize
+ *
+ * \param[in] m seq_file handle
+ * \param[in] v unused for single entry
+ *
+ * \retval 0 on success
+ * \retval negative negated errno on failure
+ */
+static int ll_default_easize_seq_show(struct seq_file *m, void *v)
+{
+ struct super_block *sb = m->private;
+ struct ll_sb_info *sbi = ll_s2sbi(sb);
+ unsigned int ealen;
+ int rc;
+
+ rc = ll_get_default_mdsize(sbi, &ealen);
+ if (rc)
+ return rc;
+
+ return seq_printf(m, "%u\n", ealen);
+}
+
+/**
+ * Set default_easize.
+ *
+ * Range checking on the passed value is handled by
+ * ll_set_default_mdsize().
+ *
+ * \see client_obd::cl_default_mds_easize
+ *
+ * \param[in] file proc file
+ * \param[in] buffer string passed from user space
+ * \param[in] count \a buffer length
+ * \param[in] off unused for single entry
+ *
+ * \retval positive \a count on success
+ * \retval negative negated errno on failure
+ */
+static ssize_t ll_default_easize_seq_write(struct file *file,
+ const char __user *buffer,
+ size_t count, loff_t *unused)
+{
+ struct seq_file *seq = file->private_data;
+ struct super_block *sb = (struct super_block *)seq->private;
+ struct ll_sb_info *sbi = ll_s2sbi(sb);
+ int val;
+ int rc;
+
+ if (count == 0)
+ return 0;
+
+ rc = lprocfs_write_helper(buffer, count, &val);
+ if (rc < 0)
+ return rc;
+
+ rc = ll_set_default_mdsize(sbi, val);
+ if (rc)
+ return rc;
+
+ return count;
+}
+LPROC_SEQ_FOPS(ll_default_easize);
+
+static int ll_sbi_flags_seq_show(struct seq_file *m, void *v)
+{
+ const char *str[] = LL_SBI_FLAGS;
+ struct super_block *sb = m->private;
+ int flags = ll_s2sbi(sb)->ll_flags;
+ int i = 0;
+
+ while (flags != 0) {
+ if (ARRAY_SIZE(str) <= i) {
+ CERROR("%s: Revise array LL_SBI_FLAGS to match sbi "
+ "flags please.\n", ll_get_fsname(sb, NULL, 0));
+ return -EINVAL;
+ }
+
+ if (flags & 0x1)
+ seq_printf(m, "%s ", str[i]);
+ flags >>= 1;
+ ++i;
+ }
+ seq_printf(m, "\b\n");
+ return 0;
+}
+LPROC_SEQ_FOPS_RO(ll_sbi_flags);
+
+static int ll_unstable_stats_seq_show(struct seq_file *m, void *v)
+{
+ struct super_block *sb = m->private;
+ struct ll_sb_info *sbi = ll_s2sbi(sb);
+ struct cl_client_cache *cache = sbi->ll_cache;
+ long pages;
+ int mb;
+
+ pages = atomic_long_read(&cache->ccc_unstable_nr);
+ mb = (pages * PAGE_CACHE_SIZE) >> 20;
+
+ return seq_printf(m, "unstable_check: %8d\n"
+ "unstable_pages: %12ld\n"
+ "unstable_mb: %8d\n",
+ cache->ccc_unstable_check, pages, mb);
+}
+
+static ssize_t ll_unstable_stats_seq_write(struct file *file,
+ const char __user *buffer,
+ size_t count, loff_t *unused)
+{
+ struct seq_file *seq = file->private_data;
+ struct ll_sb_info *sbi = ll_s2sbi((struct super_block *)seq->private);
+ char kernbuf[128];
+ int val, rc;
+
+ if (count == 0)
+ return 0;
+ if (count >= sizeof(kernbuf))
+ return -EINVAL;
+
+ if (copy_from_user(kernbuf, buffer, count))
+ return -EFAULT;
+ kernbuf[count] = 0;
+
+ buffer += lprocfs_find_named_value(kernbuf, "unstable_check:", &count) -
+ kernbuf;
+ rc = lprocfs_write_helper(buffer, count, &val);
+ if (rc < 0)
+ return rc;
+
+ /* borrow lru lock to set the value */
+ spin_lock(&sbi->ll_cache->ccc_lru_lock);
+ sbi->ll_cache->ccc_unstable_check = !!val;
+ spin_unlock(&sbi->ll_cache->ccc_lru_lock);
+
+ return count;
+}
+LPROC_SEQ_FOPS(ll_unstable_stats);
+
+static int ll_root_squash_seq_show(struct seq_file *m, void *v)
+{
+ struct super_block *sb = m->private;
+ struct ll_sb_info *sbi = ll_s2sbi(sb);
+ struct root_squash_info *squash = &sbi->ll_squash;
+
+ return seq_printf(m, "%u:%u\n", squash->rsi_uid, squash->rsi_gid);
+}
+
+static ssize_t ll_root_squash_seq_write(struct file *file,
+ const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct super_block *sb = m->private;
+ struct ll_sb_info *sbi = ll_s2sbi(sb);
+ struct root_squash_info *squash = &sbi->ll_squash;
+
+ return lprocfs_wr_root_squash(buffer, count, squash,
+ ll_get_fsname(sb, NULL, 0));
+}
+LPROC_SEQ_FOPS(ll_root_squash);
+
+static int ll_nosquash_nids_seq_show(struct seq_file *m, void *v)
+{
+ struct super_block *sb = m->private;
+ struct ll_sb_info *sbi = ll_s2sbi(sb);
+ struct root_squash_info *squash = &sbi->ll_squash;
+ int len, rc;
+
+ down_read(&squash->rsi_sem);
+ if (!list_empty(&squash->rsi_nosquash_nids)) {
+ len = cfs_print_nidlist(m->buf + m->count, m->size - m->count,
+ &squash->rsi_nosquash_nids);
+ m->count += len;
+ rc = seq_printf(m, "\n");
+ } else {
+ rc = seq_printf(m, "NONE\n");
+ }
+ up_read(&squash->rsi_sem);
+
+ return rc;
+}
+
+static ssize_t ll_nosquash_nids_seq_write(struct file *file,
+ const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct super_block *sb = m->private;
+ struct ll_sb_info *sbi = ll_s2sbi(sb);
+ struct root_squash_info *squash = &sbi->ll_squash;
+ int rc;
+
+ rc = lprocfs_wr_nosquash_nids(buffer, count, squash,
+ ll_get_fsname(sb, NULL, 0));
+ if (rc < 0)
+ return rc;
+
+ ll_compute_rootsquash_state(sbi);
+
+ return rc;
+}
+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 = "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",
+ .fops = &ll_max_readahead_per_file_mb_fops },
+ { .name = "max_read_ahead_whole_mb",
+ .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",
+ .fops = &ll_track_ppid_fops },
+ { .name = "stats_track_gid",
+ .fops = &ll_track_gid_fops },
+ { .name = "statahead_max",
+ .fops = &ll_statahead_max_fops },
+ { .name = "statahead_agl",
+ .fops = &ll_statahead_agl_fops },
+ { .name = "statahead_stats",
+ .fops = &ll_statahead_stats_fops },
+ { .name = "lazystatfs",
+ .fops = &ll_lazystatfs_fops },
+ { .name = "max_easize",
+ .fops = &ll_max_easize_fops },
+ { .name = "default_easize",
+ .fops = &ll_default_easize_fops },
+ { .name = "sbi_flags",
+ .fops = &ll_sbi_flags_fops },
+ { .name = "xattr_cache",
+ .fops = &ll_xattr_cache_fops },
+ { .name = "unstable_stats",
+ .fops = &ll_unstable_stats_fops },
+ { .name = "root_squash",
+ .fops = &ll_root_squash_fops },
+ { .name = "nosquash_nids",
+ .fops = &ll_nosquash_nids_fops },
+ { NULL }