X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fobdclass%2Flprocfs_status.c;h=a9e44779d4d19fb0492a461ed519351e80268ec2;hp=f18b4dce46eb54d40327dd7dea675497831b790c;hb=2b16de10d79f930283a1a0dc6e8c9c2a779aae5d;hpb=a145fabe132bd498343ba854d4b30044487e8e31 diff --git a/lustre/obdclass/lprocfs_status.c b/lustre/obdclass/lprocfs_status.c index f18b4dc..a9e4477 100644 --- a/lustre/obdclass/lprocfs_status.c +++ b/lustre/obdclass/lprocfs_status.c @@ -27,7 +27,7 @@ * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2013, Intel Corporation. + * Copyright (c) 2011, 2015, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -40,15 +40,11 @@ #define DEBUG_SUBSYSTEM S_CLASS -#ifndef __KERNEL__ -#include -#endif - #include #include #include -#if defined(LPROCFS) +#ifdef CONFIG_PROC_FS static int lprocfs_no_percpu_stats = 0; CFS_MODULE_PARM(lprocfs_no_percpu_stats, "i", int, 0644, @@ -70,49 +66,23 @@ EXPORT_SYMBOL(lprocfs_seq_release); struct proc_dir_entry * lprocfs_add_simple(struct proc_dir_entry *root, char *name, -#ifndef HAVE_ONLY_PROCFS_SEQ - read_proc_t *read_proc, write_proc_t *write_proc, -#endif void *data, const struct file_operations *fops) { struct proc_dir_entry *proc; mode_t mode = 0; - if (root == NULL || name == NULL) + if (root == NULL || name == NULL || fops == NULL) return ERR_PTR(-EINVAL); - if (!fops) { -#ifndef HAVE_ONLY_PROCFS_SEQ - if (read_proc) - mode = 0444; - if (write_proc) - mode |= 0200; - - LPROCFS_WRITE_ENTRY(); - proc = create_proc_entry(name, mode, root); - if (!proc) { - CERROR("LprocFS: No memory to create /proc entry %s", name); - LPROCFS_WRITE_EXIT(); - return ERR_PTR(-ENOMEM); - } - proc->read_proc = read_proc; - proc->write_proc = write_proc; - proc->data = data; - LPROCFS_WRITE_EXIT(); -#else - return ERR_PTR(-EINVAL); -#endif - } else { - if (fops->read) - mode = 0444; - if (fops->write) - mode |= 0200; - proc = proc_create_data(name, mode, root, fops, data); - if (!proc) { - CERROR("LprocFS: No memory to create /proc entry %s", - name); - return ERR_PTR(-ENOMEM); - } + if (fops->read) + mode = 0444; + if (fops->write) + mode |= 0200; + proc = proc_create_data(name, mode, root, fops, data); + if (!proc) { + CERROR("LprocFS: No memory to create /proc entry %s\n", + name); + return ERR_PTR(-ENOMEM); } return proc; } @@ -137,213 +107,16 @@ struct proc_dir_entry *lprocfs_add_symlink(const char *name, va_end(ap); entry = proc_symlink(name, parent, dest); - if (entry == NULL) - CERROR("LprocFS: Could not create symbolic link from %s to %s", - name, dest); + if (entry == NULL) + CERROR("LprocFS: Could not create symbolic link from " + "%s to %s\n", name, dest); OBD_FREE(dest, MAX_STRING_SIZE + 1); return entry; } EXPORT_SYMBOL(lprocfs_add_symlink); -#ifdef HAVE_ONLY_PROCFS_SEQ static const struct file_operations lprocfs_generic_fops = { }; -#else - -ssize_t -lprocfs_fops_read(struct file *f, char __user *buf, size_t size, loff_t *ppos) -{ - struct proc_dir_entry *dp = PDE(f->f_dentry->d_inode); - char *page, *start = NULL; - int rc = 0, eof = 1, count; - - if (*ppos >= PAGE_CACHE_SIZE) - return 0; - - page = (char *)__get_free_page(GFP_KERNEL); - if (page == NULL) - return -ENOMEM; - - if (LPROCFS_ENTRY_CHECK(dp)) { - rc = -ENOENT; - goto out; - } - - OBD_FAIL_TIMEOUT(OBD_FAIL_LPROC_REMOVE, 10); - if (dp->read_proc) - rc = dp->read_proc(page, &start, *ppos, PAGE_CACHE_SIZE, - &eof, dp->data); - if (rc <= 0) - goto out; - - /* for lustre proc read, the read count must be less than PAGE_SIZE */ - LASSERT(eof == 1); - - if (start == NULL) { - rc -= *ppos; - if (rc < 0) - rc = 0; - if (rc == 0) - goto out; - start = page + *ppos; - } else if (start < page) { - start = page; - } - - count = (rc < size) ? rc : size; - if (copy_to_user(buf, start, count)) { - rc = -EFAULT; - goto out; - } - *ppos += count; - -out: - free_page((unsigned long)page); - return rc; -} - -ssize_t -lprocfs_fops_write(struct file *f, const char __user *buf, size_t size, - loff_t *ppos) -{ - struct proc_dir_entry *dp = PDE(f->f_dentry->d_inode); - int rc = -EIO; - - if (LPROCFS_ENTRY_CHECK(dp)) - return -ENOENT; - if (dp->write_proc) - rc = dp->write_proc(f, buf, size, dp->data); - return rc; -} - -static struct file_operations lprocfs_generic_fops = { - .owner = THIS_MODULE, - .read = lprocfs_fops_read, - .write = lprocfs_fops_write, -}; - -/* for b=10866, global variable */ -DECLARE_RWSEM(_lprocfs_lock); -EXPORT_SYMBOL(_lprocfs_lock); - -static struct proc_dir_entry *__lprocfs_srch(struct proc_dir_entry *head, - const char *name) -{ - struct proc_dir_entry *temp; - - if (head == NULL) - return NULL; - - temp = head->subdir; - while (temp != NULL) { - if (strcmp(temp->name, name) == 0) - return temp; - temp = temp->next; - } - return NULL; -} - -struct proc_dir_entry *lprocfs_srch(struct proc_dir_entry *head, - const char *name) -{ - struct proc_dir_entry *temp; - - LPROCFS_SRCH_ENTRY(); - temp = __lprocfs_srch(head, name); - LPROCFS_SRCH_EXIT(); - return temp; -} -EXPORT_SYMBOL(lprocfs_srch); - -static int __lprocfs_add_vars(struct proc_dir_entry *root, - struct lprocfs_vars *list, - void *data) -{ - int rc = 0; - - if (root == NULL || list == NULL) - return -EINVAL; - - while (list->name != NULL) { - struct proc_dir_entry *cur_root, *proc; - char *pathcopy, *cur, *next, pathbuf[64]; - int pathsize = strlen(list->name) + 1; - - proc = NULL; - cur_root = root; - - /* need copy of path for strsep */ - if (strlen(list->name) > sizeof(pathbuf) - 1) { - OBD_ALLOC(pathcopy, pathsize); - if (pathcopy == NULL) - GOTO(out, rc = -ENOMEM); - } else { - pathcopy = pathbuf; - } - - next = pathcopy; - strcpy(pathcopy, list->name); - - while (cur_root != NULL && (cur = strsep(&next, "/"))) { - if (*cur =='\0') /* skip double/trailing "/" */ - continue; - - proc = __lprocfs_srch(cur_root, cur); - CDEBUG(D_OTHER, "cur_root=%s, cur=%s, next=%s, (%s)\n", - cur_root->name, cur, next, - (proc ? "exists" : "new")); - if (next != NULL) { - cur_root = (proc ? proc : - proc_mkdir(cur, cur_root)); - } else if (proc == NULL) { - mode_t mode = 0; - if (list->proc_mode != 0000) { - mode = list->proc_mode; - } else { - if (list->read_fptr) - mode = 0444; - if (list->write_fptr) - mode |= 0200; - } - proc = create_proc_entry(cur, mode, cur_root); - } - } - - if (pathcopy != pathbuf) - OBD_FREE(pathcopy, pathsize); - - if (cur_root == NULL || proc == NULL) { - CERROR("LprocFS: No memory to create /proc entry %s", - list->name); - GOTO(out, rc = -ENOMEM); - } - - if (list->fops) - proc->proc_fops = list->fops; - else - proc->proc_fops = &lprocfs_generic_fops; - proc->read_proc = list->read_fptr; - proc->write_proc = list->write_fptr; - proc->data = (list->data ? list->data : data); - list++; - } -out: - return rc; -} - -int lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list, - void *data) -{ - int rc = 0; - - LPROCFS_WRITE_ENTRY(); - rc = __lprocfs_add_vars(root, list, data); - LPROCFS_WRITE_EXIT(); - - return rc; -} -EXPORT_SYMBOL(lprocfs_add_vars); -#endif /** * Add /proc entries. @@ -357,8 +130,8 @@ EXPORT_SYMBOL(lprocfs_add_vars); * < 0 on error */ int -lprocfs_seq_add_vars(struct proc_dir_entry *root, struct lprocfs_seq_vars *list, - void *data) +lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list, + void *data) { if (root == NULL || list == NULL) return -EINVAL; @@ -384,10 +157,14 @@ lprocfs_seq_add_vars(struct proc_dir_entry *root, struct lprocfs_seq_vars *list, } return 0; } -EXPORT_SYMBOL(lprocfs_seq_add_vars); +EXPORT_SYMBOL(lprocfs_add_vars); -#ifndef HAVE_ONLY_PROCFS_SEQ -void lprocfs_remove_nolock(struct proc_dir_entry **proot) +#ifndef HAVE_REMOVE_PROC_SUBTREE +/* for b=10866, global variable */ +DECLARE_RWSEM(_lprocfs_lock); +EXPORT_SYMBOL(_lprocfs_lock); + +static void lprocfs_remove_nolock(struct proc_dir_entry **proot) { struct proc_dir_entry *root = *proot; struct proc_dir_entry *temp = root; @@ -419,31 +196,8 @@ void lprocfs_remove_nolock(struct proc_dir_entry **proot) break; } } -#endif - -void lprocfs_remove(struct proc_dir_entry **rooth) -{ -#ifndef HAVE_ONLY_PROCFS_SEQ - LPROCFS_WRITE_ENTRY(); /* search vs remove race */ - lprocfs_remove_nolock(rooth); - LPROCFS_WRITE_EXIT(); -#else - proc_remove(*rooth); - *rooth = NULL; -#endif -} -EXPORT_SYMBOL(lprocfs_remove); - -void lprocfs_remove_proc_entry(const char *name, struct proc_dir_entry *parent) -{ - LASSERT(parent != NULL); - remove_proc_entry(name, parent); -} -EXPORT_SYMBOL(lprocfs_remove_proc_entry); -#ifndef HAVE_ONLY_PROCFS_SEQ -void lprocfs_try_remove_proc_entry(const char *name, - struct proc_dir_entry *parent) +int remove_proc_subtree(const char *name, struct proc_dir_entry *parent) { struct proc_dir_entry *t = NULL; struct proc_dir_entry **p; @@ -452,8 +206,7 @@ void lprocfs_try_remove_proc_entry(const char *name, LASSERT(parent != NULL); len = strlen(name); - LPROCFS_WRITE_ENTRY(); - + down_write(&_lprocfs_lock); /* lookup target name */ for (p = &parent->subdir; *p; p = &(*p)->next) { if ((*p)->namelen != len) @@ -482,53 +235,51 @@ void lprocfs_try_remove_proc_entry(const char *name, if (busy == 0) lprocfs_remove_nolock(&t); - LPROCFS_WRITE_EXIT(); - - return; + up_write(&_lprocfs_lock); + return 0; } -EXPORT_SYMBOL(lprocfs_try_remove_proc_entry); +#endif /* !HAVE_REMOVE_PROC_SUBTREE */ -struct proc_dir_entry *lprocfs_register(const char *name, - struct proc_dir_entry *parent, - struct lprocfs_vars *list, void *data) +#ifndef HAVE_PROC_REMOVE +void proc_remove(struct proc_dir_entry *de) { - struct proc_dir_entry *entry; - int rc; - - LPROCFS_WRITE_ENTRY(); - entry = __lprocfs_srch(parent, name); - if (entry != NULL) { - CERROR("entry '%s' already registered\n", name); - GOTO(out, entry = ERR_PTR(-EALREADY)); - } +#ifndef HAVE_REMOVE_PROC_SUBTREE + down_write(&_lprocfs_lock); /* search vs remove race */ + lprocfs_remove_nolock(&de); + up_write(&_lprocfs_lock); +#else + if (de) + remove_proc_subtree(de->name, de->parent); +#endif +} +#endif - entry = proc_mkdir(name, parent); - if (entry == NULL) - GOTO(out, entry = ERR_PTR(-ENOMEM)); +void lprocfs_remove(struct proc_dir_entry **rooth) +{ + proc_remove(*rooth); + *rooth = NULL; +} +EXPORT_SYMBOL(lprocfs_remove); - if (list != NULL) { - rc = __lprocfs_add_vars(entry, list, data); - if (rc != 0) { - lprocfs_remove_nolock(&entry); - GOTO(out, entry = ERR_PTR(rc)); - } - } -out: - LPROCFS_WRITE_EXIT(); - return entry; +void lprocfs_remove_proc_entry(const char *name, struct proc_dir_entry *parent) +{ + LASSERT(parent != NULL); + remove_proc_entry(name, parent); } -EXPORT_SYMBOL(lprocfs_register); -#endif +EXPORT_SYMBOL(lprocfs_remove_proc_entry); struct proc_dir_entry * -lprocfs_seq_register(const char *name, struct proc_dir_entry *parent, - struct lprocfs_seq_vars *list, void *data) +lprocfs_register(const char *name, struct proc_dir_entry *parent, + struct lprocfs_vars *list, void *data) { struct proc_dir_entry *newchild; newchild = proc_mkdir(name, parent); - if (newchild != NULL && list != NULL) { - int rc = lprocfs_seq_add_vars(newchild, list, data); + if (newchild == NULL) + return ERR_PTR(-ENOMEM); + + if (list != NULL) { + int rc = lprocfs_add_vars(newchild, list, data); if (rc) { lprocfs_remove(&newchild); return ERR_PTR(rc); @@ -536,7 +287,7 @@ lprocfs_seq_register(const char *name, struct proc_dir_entry *parent, } return newchild; } -EXPORT_SYMBOL(lprocfs_seq_register); +EXPORT_SYMBOL(lprocfs_register); /* Generic callbacks */ int lprocfs_uint_seq_show(struct seq_file *m, void *data) @@ -545,7 +296,7 @@ int lprocfs_uint_seq_show(struct seq_file *m, void *data) } EXPORT_SYMBOL(lprocfs_uint_seq_show); -int lprocfs_wr_uint(struct file *file, const char *buffer, +int lprocfs_wr_uint(struct file *file, const char __user *buffer, unsigned long count, void *data) { unsigned *p = data; @@ -565,7 +316,7 @@ int lprocfs_wr_uint(struct file *file, const char *buffer, } EXPORT_SYMBOL(lprocfs_wr_uint); -ssize_t lprocfs_uint_seq_write(struct file *file, const char *buffer, +ssize_t lprocfs_uint_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { int *data = ((struct seq_file *)file->private_data)->private; @@ -595,7 +346,7 @@ int lprocfs_atomic_seq_show(struct seq_file *m, void *data) EXPORT_SYMBOL(lprocfs_atomic_seq_show); ssize_t -lprocfs_atomic_seq_write(struct file *file, const char *buffer, +lprocfs_atomic_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { atomic_t *atm = ((struct seq_file *)file->private_data)->private; @@ -807,19 +558,18 @@ void lprocfs_stats_collect(struct lprocfs_stats *stats, int idx, lprocfs_stats_unlock(stats, LPROCFS_GET_NUM_CPU, &flags); } -EXPORT_SYMBOL(lprocfs_stats_collect); /** * Append a space separated list of current set flags to str. */ -#define flag2seqstr(flag) \ +#define flag2str(flag) \ do { \ if (imp->imp_##flag) { \ seq_printf(m, "%s" #flag, first ? "" : ", "); \ first = false; \ } \ } while (0) -static void obd_import_flags2seqstr(struct obd_import *imp, struct seq_file *m) +static void obd_import_flags2str(struct obd_import *imp, struct seq_file *m) { bool first = true; @@ -828,19 +578,19 @@ static void obd_import_flags2seqstr(struct obd_import *imp, struct seq_file *m) first = false; } - flag2seqstr(invalid); - flag2seqstr(deactive); - flag2seqstr(replayable); - flag2seqstr(delayed_recovery); - flag2seqstr(no_lock_replay); - flag2seqstr(vbr_failed); - flag2seqstr(pingable); - flag2seqstr(resend_replay); - flag2seqstr(no_pinger_recover); - flag2seqstr(need_mne_swab); - flag2seqstr(connect_tried); + flag2str(invalid); + flag2str(deactive); + flag2str(replayable); + flag2str(delayed_recovery); + flag2str(no_lock_replay); + flag2str(vbr_failed); + flag2str(pingable); + flag2str(resend_replay); + flag2str(no_pinger_recover); + flag2str(need_mne_swab); + flag2str(connect_tried); } -#undef flag2seqstr +#undef flag2str static const char *obd_connect_names[] = { "read_only", @@ -900,8 +650,10 @@ static const char *obd_connect_names[] = { "lfsck", "unknown", "unlink_close", - "unknown", + "multi_mod_rpcs", "dir_stripe", + "fileset_mount", + "bulk_mbits", "unknown", NULL }; @@ -945,7 +697,7 @@ EXPORT_SYMBOL(obd_connect_flags2str); static void obd_connect_data_seqprint(struct seq_file *m, struct obd_connect_data *ocd) { - int flags; + __u64 flags; LASSERT(ocd != NULL); flags = ocd->ocd_connect_flags; @@ -990,10 +742,14 @@ static void obd_connect_data_seqprint(struct seq_file *m, if (flags & OBD_CONNECT_MAXBYTES) seq_printf(m, " max_object_bytes: "LPU64"\n", ocd->ocd_maxbytes); + if (flags & OBD_CONNECT_MULTIMODRPCS) + seq_printf(m, " max_mod_rpcs: %hu\n", + ocd->ocd_maxmodrpcs); } int lprocfs_import_seq_show(struct seq_file *m, void *data) { + char nidstr[LNET_NIDSTR_SIZE]; struct lprocfs_counter ret; struct lprocfs_counter_header *header; struct obd_device *obd = (struct obd_device *)data; @@ -1022,7 +778,7 @@ int lprocfs_import_seq_show(struct seq_file *m, void *data) seq_printf(m, " ]\n"); obd_connect_data_seqprint(m, ocd); seq_printf(m, " import_flags: [ "); - obd_import_flags2seqstr(imp, m); + obd_import_flags2str(imp, m); seq_printf(m, " ]\n" " connection:\n" @@ -1030,17 +786,22 @@ int lprocfs_import_seq_show(struct seq_file *m, void *data) spin_lock(&imp->imp_lock); j = 0; list_for_each_entry(conn, &imp->imp_conn_list, oic_item) { - seq_printf(m, "%s%s", j ? ", " : "", - libcfs_nid2str(conn->oic_conn->c_peer.nid)); + libcfs_nid2str_r(conn->oic_conn->c_peer.nid, + nidstr, sizeof(nidstr)); + seq_printf(m, "%s%s", j ? ", " : "", nidstr); j++; } + if (imp->imp_connection != NULL) + libcfs_nid2str_r(imp->imp_connection->c_peer.nid, + nidstr, sizeof(nidstr)); + else + strncpy(nidstr, "", sizeof(nidstr)); seq_printf(m, " ]\n" " current_connection: %s\n" " connection_attempts: %u\n" " generation: %u\n" " in-progress_invalidations: %u\n", - imp->imp_connection == NULL ? "" : - libcfs_nid2str(imp->imp_connection->c_peer.nid), + nidstr, imp->imp_conn_cnt, imp->imp_generation, atomic_read(&imp->imp_inval_count)); @@ -1157,7 +918,7 @@ int lprocfs_state_seq_show(struct seq_file *m, void *data) } EXPORT_SYMBOL(lprocfs_state_seq_show); -int lprocfs_seq_at_hist_helper(struct seq_file *m, struct adaptive_timeout *at) +int lprocfs_at_hist_helper(struct seq_file *m, struct adaptive_timeout *at) { int i; for (i = 0; i < AT_BINS; i++) @@ -1165,7 +926,7 @@ int lprocfs_seq_at_hist_helper(struct seq_file *m, struct adaptive_timeout *at) seq_printf(m, "\n"); return 0; } -EXPORT_SYMBOL(lprocfs_seq_at_hist_helper); +EXPORT_SYMBOL(lprocfs_at_hist_helper); /* See also ptlrpc_lprocfs_timeouts_show_seq */ int lprocfs_timeouts_seq_show(struct seq_file *m, void *data) @@ -1194,7 +955,7 @@ int lprocfs_timeouts_seq_show(struct seq_file *m, void *data) s2dhms(&ts, now - worstt); seq_printf(m, "%-10s : cur %3u worst %3u (at %ld, "DHMS_FMT" ago) ", "network", cur, worst, worstt, DHMS_VARS(&ts)); - lprocfs_seq_at_hist_helper(m, &imp->imp_at.iat_net_latency); + lprocfs_at_hist_helper(m, &imp->imp_at.iat_net_latency); for(i = 0; i < IMP_AT_MAX_PORTALS; i++) { if (imp->imp_at.iat_portal[i] == 0) @@ -1206,7 +967,7 @@ int lprocfs_timeouts_seq_show(struct seq_file *m, void *data) seq_printf(m, "portal %-2d : cur %3u worst %3u (at %ld, " DHMS_FMT" ago) ", imp->imp_at.iat_portal[i], cur, worst, worstt, DHMS_VARS(&ts)); - lprocfs_seq_at_hist_helper(m, &imp->imp_at.iat_service_estimate[i]); + lprocfs_at_hist_helper(m, &imp->imp_at.iat_service_estimate[i]); } LPROCFS_CLIMP_EXIT(obd); @@ -1229,533 +990,8 @@ int lprocfs_connect_flags_seq_show(struct seq_file *m, void *data) } EXPORT_SYMBOL(lprocfs_connect_flags_seq_show); -#ifndef HAVE_ONLY_PROCFS_SEQ - -int lprocfs_rd_uint(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - unsigned int *temp = data; - return snprintf(page, count, "%u\n", *temp); -} -EXPORT_SYMBOL(lprocfs_rd_uint); - -int lprocfs_rd_u64(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - LASSERT(data != NULL); - *eof = 1; - return snprintf(page, count, LPU64"\n", *(__u64 *)data); -} -EXPORT_SYMBOL(lprocfs_rd_u64); - -int lprocfs_rd_atomic(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - atomic_t *atom = data; - LASSERT(atom != NULL); - *eof = 1; - return snprintf(page, count, "%d\n", atomic_read(atom)); -} -EXPORT_SYMBOL(lprocfs_rd_atomic); - -int lprocfs_wr_atomic(struct file *file, const char *buffer, - unsigned long count, void *data) -{ - atomic_t *atm = data; - int val = 0; - int rc; - - rc = lprocfs_write_helper(buffer, count, &val); - if (rc < 0) - return rc; - - if (val <= 0) - return -ERANGE; - - atomic_set(atm, val); - return count; -} -EXPORT_SYMBOL(lprocfs_wr_atomic); - -int lprocfs_rd_uuid(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *obd = data; - - LASSERT(obd != NULL); - *eof = 1; - return snprintf(page, count, "%s\n", obd->obd_uuid.uuid); -} -EXPORT_SYMBOL(lprocfs_rd_uuid); - -int lprocfs_rd_name(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *dev = data; - - LASSERT(dev != NULL); - *eof = 1; - return snprintf(page, count, "%s\n", dev->obd_name); -} -EXPORT_SYMBOL(lprocfs_rd_name); - -int lprocfs_rd_blksize(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *obd = data; - struct obd_statfs osfs; - int rc = obd_statfs(NULL, obd->obd_self_export, &osfs, - cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS), - OBD_STATFS_NODELAY); - if (!rc) { - *eof = 1; - rc = snprintf(page, count, "%u\n", osfs.os_bsize); - } - return rc; -} -EXPORT_SYMBOL(lprocfs_rd_blksize); - -int lprocfs_rd_kbytestotal(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *obd = data; - struct obd_statfs osfs; - int rc = obd_statfs(NULL, obd->obd_self_export, &osfs, - cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS), - OBD_STATFS_NODELAY); - if (!rc) { - __u32 blk_size = osfs.os_bsize >> 10; - __u64 result = osfs.os_blocks; - - while (blk_size >>= 1) - result <<= 1; - - *eof = 1; - rc = snprintf(page, count, LPU64"\n", result); - } - return rc; -} -EXPORT_SYMBOL(lprocfs_rd_kbytestotal); - -int lprocfs_rd_kbytesfree(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *obd = data; - struct obd_statfs osfs; - int rc = obd_statfs(NULL, obd->obd_self_export, &osfs, - cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS), - OBD_STATFS_NODELAY); - if (!rc) { - __u32 blk_size = osfs.os_bsize >> 10; - __u64 result = osfs.os_bfree; - - while (blk_size >>= 1) - result <<= 1; - - *eof = 1; - rc = snprintf(page, count, LPU64"\n", result); - } - return rc; -} -EXPORT_SYMBOL(lprocfs_rd_kbytesfree); - -int lprocfs_rd_kbytesavail(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *obd = data; - struct obd_statfs osfs; - int rc = obd_statfs(NULL, obd->obd_self_export, &osfs, - cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS), - OBD_STATFS_NODELAY); - if (!rc) { - __u32 blk_size = osfs.os_bsize >> 10; - __u64 result = osfs.os_bavail; - - while (blk_size >>= 1) - result <<= 1; - - *eof = 1; - rc = snprintf(page, count, LPU64"\n", result); - } - return rc; -} -EXPORT_SYMBOL(lprocfs_rd_kbytesavail); - -int lprocfs_rd_filestotal(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *obd = data; - struct obd_statfs osfs; - int rc = obd_statfs(NULL, obd->obd_self_export, &osfs, - cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS), - OBD_STATFS_NODELAY); - if (!rc) { - *eof = 1; - rc = snprintf(page, count, LPU64"\n", osfs.os_files); - } - - return rc; -} -EXPORT_SYMBOL(lprocfs_rd_filestotal); - -int lprocfs_rd_filesfree(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *obd = data; - struct obd_statfs osfs; - int rc = obd_statfs(NULL, obd->obd_self_export, &osfs, - cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS), - OBD_STATFS_NODELAY); - if (!rc) { - *eof = 1; - rc = snprintf(page, count, LPU64"\n", osfs.os_ffree); - } - return rc; -} -EXPORT_SYMBOL(lprocfs_rd_filesfree); - -int lprocfs_rd_server_uuid(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *obd = data; - struct obd_import *imp; - char *imp_state_name = NULL; - int rc = 0; - - LASSERT(obd != NULL); - LPROCFS_CLIMP_CHECK(obd); - imp = obd->u.cli.cl_import; - imp_state_name = ptlrpc_import_state_name(imp->imp_state); - *eof = 1; - rc = snprintf(page, count, "%s\t%s%s\n", - obd2cli_tgt(obd), imp_state_name, - imp->imp_deactive ? "\tDEACTIVATED" : ""); - - LPROCFS_CLIMP_EXIT(obd); - return rc; -} -EXPORT_SYMBOL(lprocfs_rd_server_uuid); - -int lprocfs_rd_conn_uuid(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *obd = data; - struct ptlrpc_connection *conn; - int rc = 0; - - LASSERT(obd != NULL); - - LPROCFS_CLIMP_CHECK(obd); - conn = obd->u.cli.cl_import->imp_connection; - *eof = 1; - if (conn && obd->u.cli.cl_import) { - rc = snprintf(page, count, "%s\n", - conn->c_remote_uuid.uuid); - } else { - rc = snprintf(page, count, "%s\n", ""); - } - - LPROCFS_CLIMP_EXIT(obd); - return rc; -} -EXPORT_SYMBOL(lprocfs_rd_conn_uuid); - -/** - * Append a space separated list of current set flags to str. - */ -#define flag2str(flag) \ - if (imp->imp_##flag && max - len > 0) \ - len += snprintf(str + len, max - len, "%s" #flag, len ? ", " : ""); -static int obd_import_flags2str(struct obd_import *imp, char *str, int max) -{ - int len = 0; - - if (imp->imp_obd->obd_no_recov) - len += snprintf(str, max - len, "no_recov"); - - flag2str(invalid); - flag2str(deactive); - flag2str(replayable); - flag2str(pingable); - return len; -} -#undef flags2str - -int lprocfs_rd_import(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct lprocfs_counter ret; - struct lprocfs_counter_header *header; - struct obd_device *obd = (struct obd_device *)data; - struct obd_import *imp; - struct obd_import_conn *conn; - int i; - int j; - int k; - int rw = 0; - - LASSERT(obd != NULL); - LPROCFS_CLIMP_CHECK(obd); - imp = obd->u.cli.cl_import; - *eof = 1; - - i = snprintf(page, count, - "import:\n" - " name: %s\n" - " target: %s\n" - " state: %s\n" - " instance: %u\n" - " connect_flags: [", - obd->obd_name, - obd2cli_tgt(obd), - ptlrpc_import_state_name(imp->imp_state), - imp->imp_connect_data.ocd_instance); - i += obd_connect_flags2str(page + i, count - i, - imp->imp_connect_data.ocd_connect_flags, - ", "); - i += snprintf(page + i, count - i, - "]\n" - " import_flags: ["); - i += obd_import_flags2str(imp, page + i, count - i); - - i += snprintf(page + i, count - i, - "]\n" - " connection:\n" - " failover_nids: ["); - spin_lock(&imp->imp_lock); - j = 0; - list_for_each_entry(conn, &imp->imp_conn_list, oic_item) { - i += snprintf(page + i, count - i, "%s%s", j ? ", " : "", - libcfs_nid2str(conn->oic_conn->c_peer.nid)); - j++; - } - i += snprintf(page + i, count - i, - "]\n" - " current_connection: %s\n" - " connection_attempts: %u\n" - " generation: %u\n" - " in-progress_invalidations: %u\n", - imp->imp_connection == NULL ? "" : - libcfs_nid2str(imp->imp_connection->c_peer.nid), - imp->imp_conn_cnt, - imp->imp_generation, - atomic_read(&imp->imp_inval_count)); - spin_unlock(&imp->imp_lock); - - if (obd->obd_svc_stats == NULL) - goto out_climp; - - header = &obd->obd_svc_stats->ls_cnt_header[PTLRPC_REQWAIT_CNTR]; - lprocfs_stats_collect(obd->obd_svc_stats, PTLRPC_REQWAIT_CNTR, &ret); - if (ret.lc_count != 0) { - /* first argument to do_div MUST be __u64 */ - __u64 sum = ret.lc_sum; - do_div(sum, ret.lc_count); - ret.lc_sum = sum; - } else - ret.lc_sum = 0; - i += snprintf(page + i, count - i, - " rpcs:\n" - " inflight: %u\n" - " unregistering: %u\n" - " timeouts: %u\n" - " avg_waittime: "LPU64" %s\n", - atomic_read(&imp->imp_inflight), - atomic_read(&imp->imp_unregistering), - atomic_read(&imp->imp_timeouts), - ret.lc_sum, header->lc_units); - - k = 0; - for(j = 0; j < IMP_AT_MAX_PORTALS; j++) { - if (imp->imp_at.iat_portal[j] == 0) - break; - k = max_t(unsigned int, k, - at_get(&imp->imp_at.iat_service_estimate[j])); - } - i += snprintf(page + i, count - i, - " service_estimates:\n" - " services: %u sec\n" - " network: %u sec\n", - k, - at_get(&imp->imp_at.iat_net_latency)); - - i += snprintf(page + i, count - i, - " transactions:\n" - " last_replay: "LPU64"\n" - " peer_committed: "LPU64"\n" - " last_checked: "LPU64"\n", - imp->imp_last_replay_transno, - imp->imp_peer_committed_transno, - imp->imp_last_transno_checked); - - /* avg data rates */ - for (rw = 0; rw <= 1; rw++) { - lprocfs_stats_collect(obd->obd_svc_stats, - PTLRPC_LAST_CNTR + BRW_READ_BYTES + rw, - &ret); - if (ret.lc_sum > 0 && ret.lc_count > 0) { - /* first argument to do_div MUST be __u64 */ - __u64 sum = ret.lc_sum; - do_div(sum, ret.lc_count); - ret.lc_sum = sum; - i += snprintf(page + i, count - i, - " %s_data_averages:\n" - " bytes_per_rpc: "LPU64"\n", - rw ? "write" : "read", - ret.lc_sum); - } - k = (int)ret.lc_sum; - j = opcode_offset(OST_READ + rw) + EXTRA_MAX_OPCODES; - header = &obd->obd_svc_stats->ls_cnt_header[j]; - lprocfs_stats_collect(obd->obd_svc_stats, j, &ret); - if (ret.lc_sum > 0 && ret.lc_count != 0) { - /* first argument to do_div MUST be __u64 */ - __u64 sum = ret.lc_sum; - do_div(sum, ret.lc_count); - ret.lc_sum = sum; - i += snprintf(page + i, count - i, - " %s_per_rpc: "LPU64"\n", - header->lc_units, ret.lc_sum); - j = (int)ret.lc_sum; - if (j > 0) - i += snprintf(page + i, count - i, - " MB_per_sec: %u.%.02u\n", - k / j, (100 * k / j) % 100); - } - } - -out_climp: - LPROCFS_CLIMP_EXIT(obd); - return i; -} -EXPORT_SYMBOL(lprocfs_rd_import); - -int lprocfs_rd_state(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *obd = (struct obd_device *)data; - struct obd_import *imp; - int i, j, k; - - LASSERT(obd != NULL); - LPROCFS_CLIMP_CHECK(obd); - imp = obd->u.cli.cl_import; - *eof = 1; - - i = snprintf(page, count, "current_state: %s\n", - ptlrpc_import_state_name(imp->imp_state)); - i += snprintf(page + i, count - i, - "state_history:\n"); - k = imp->imp_state_hist_idx; - for (j = 0; j < IMP_STATE_HIST_LEN; j++) { - struct import_state_hist *ish = - &imp->imp_state_hist[(k + j) % IMP_STATE_HIST_LEN]; - if (ish->ish_state == 0) - continue; - i += snprintf(page + i, count - i, " - ["CFS_TIME_T", %s]\n", - ish->ish_time, - ptlrpc_import_state_name(ish->ish_state)); - } - - LPROCFS_CLIMP_EXIT(obd); - return i; -} -EXPORT_SYMBOL(lprocfs_rd_state); - -int lprocfs_at_hist_helper(char *page, int count, int rc, - struct adaptive_timeout *at) -{ - int i; - for (i = 0; i < AT_BINS; i++) - rc += snprintf(page + rc, count - rc, "%3u ", at->at_hist[i]); - rc += snprintf(page + rc, count - rc, "\n"); - return rc; -} -EXPORT_SYMBOL(lprocfs_at_hist_helper); - -/* See also ptlrpc_lprocfs_rd_timeouts */ -int lprocfs_rd_timeouts(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *obd = (struct obd_device *)data; - struct obd_import *imp; - unsigned int cur, worst; - time_t now, worstt; - struct dhms ts; - int i, rc = 0; - - LASSERT(obd != NULL); - LPROCFS_CLIMP_CHECK(obd); - imp = obd->u.cli.cl_import; - *eof = 1; - - now = cfs_time_current_sec(); - - /* Some network health info for kicks */ - s2dhms(&ts, now - imp->imp_last_reply_time); - rc += snprintf(page + rc, count - rc, - "%-10s : %ld, "DHMS_FMT" ago\n", - "last reply", imp->imp_last_reply_time, DHMS_VARS(&ts)); - - cur = at_get(&imp->imp_at.iat_net_latency); - worst = imp->imp_at.iat_net_latency.at_worst_ever; - worstt = imp->imp_at.iat_net_latency.at_worst_time; - s2dhms(&ts, now - worstt); - rc += snprintf(page + rc, count - rc, - "%-10s : cur %3u worst %3u (at %ld, "DHMS_FMT" ago) ", - "network", cur, worst, worstt, DHMS_VARS(&ts)); - rc = lprocfs_at_hist_helper(page, count, rc, - &imp->imp_at.iat_net_latency); - - for(i = 0; i < IMP_AT_MAX_PORTALS; i++) { - if (imp->imp_at.iat_portal[i] == 0) - break; - cur = at_get(&imp->imp_at.iat_service_estimate[i]); - worst = imp->imp_at.iat_service_estimate[i].at_worst_ever; - worstt = imp->imp_at.iat_service_estimate[i].at_worst_time; - s2dhms(&ts, now - worstt); - rc += snprintf(page + rc, count - rc, - "portal %-2d : cur %3u worst %3u (at %ld, " - DHMS_FMT" ago) ", imp->imp_at.iat_portal[i], - cur, worst, worstt, DHMS_VARS(&ts)); - rc = lprocfs_at_hist_helper(page, count, rc, - &imp->imp_at.iat_service_estimate[i]); - } - - LPROCFS_CLIMP_EXIT(obd); - return rc; -} -EXPORT_SYMBOL(lprocfs_rd_timeouts); - -int lprocfs_rd_connect_flags(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - struct obd_device *obd = data; - __u64 flags; - int ret = 0; - - LPROCFS_CLIMP_CHECK(obd); - flags = obd->u.cli.cl_import->imp_connect_data.ocd_connect_flags; - ret = snprintf(page, count, "flags="LPX64"\n", flags); - ret += obd_connect_flags2str(page + ret, count - ret, flags, "\n"); - ret += snprintf(page + ret, count - ret, "\n"); - LPROCFS_CLIMP_EXIT(obd); - return ret; -} -EXPORT_SYMBOL(lprocfs_rd_connect_flags); - -int lprocfs_rd_numrefs(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_type *class = (struct obd_type*) data; - - LASSERT(class != NULL); - *eof = 1; - return snprintf(page, count, "%d\n", class->typ_refcnt); -} -EXPORT_SYMBOL(lprocfs_rd_numrefs); - -int lprocfs_obd_setup(struct obd_device *obd, struct lprocfs_vars *list) +int +lprocfs_obd_setup(struct obd_device *obd) { int rc = 0; @@ -1765,7 +1001,7 @@ int lprocfs_obd_setup(struct obd_device *obd, struct lprocfs_vars *list) obd->obd_proc_entry = lprocfs_register(obd->obd_name, obd->obd_type->typ_procroot, - list, obd); + obd->obd_vars, obd); if (IS_ERR(obd->obd_proc_entry)) { rc = PTR_ERR(obd->obd_proc_entry); CERROR("error %d setting up lprocfs for %s\n",rc,obd->obd_name); @@ -1774,28 +1010,6 @@ int lprocfs_obd_setup(struct obd_device *obd, struct lprocfs_vars *list) return rc; } EXPORT_SYMBOL(lprocfs_obd_setup); -#endif - -int -lprocfs_seq_obd_setup(struct obd_device *obd) -{ - int rc = 0; - - LASSERT(obd != NULL); - LASSERT(obd->obd_magic == OBD_DEVICE_MAGIC); - LASSERT(obd->obd_type->typ_procroot != NULL); - - obd->obd_proc_entry = lprocfs_seq_register(obd->obd_name, - obd->obd_type->typ_procroot, - obd->obd_vars, obd); - if (IS_ERR(obd->obd_proc_entry)) { - rc = PTR_ERR(obd->obd_proc_entry); - CERROR("error %d setting up lprocfs for %s\n",rc,obd->obd_name); - obd->obd_proc_entry = NULL; - } - return rc; -} -EXPORT_SYMBOL(lprocfs_seq_obd_setup); int lprocfs_obd_cleanup(struct obd_device *obd) { @@ -1964,8 +1178,9 @@ void lprocfs_clear_stats(struct lprocfs_stats *stats) } EXPORT_SYMBOL(lprocfs_clear_stats); -static ssize_t lprocfs_stats_seq_write(struct file *file, const char *buf, - size_t len, loff_t *off) +static ssize_t lprocfs_stats_seq_write(struct file *file, + const char __user *buf, + size_t len, loff_t *off) { struct seq_file *seq = file->private_data; struct lprocfs_stats *stats = seq->private; @@ -2038,7 +1253,7 @@ out: return (rc < 0) ? rc : 0; } -struct seq_operations lprocfs_stats_seq_sops = { +static const struct seq_operations lprocfs_stats_seq_sops = { .start = lprocfs_stats_seq_start, .stop = lprocfs_stats_seq_stop, .next = lprocfs_stats_seq_next, @@ -2050,10 +1265,10 @@ static int lprocfs_stats_seq_open(struct inode *inode, struct file *file) struct seq_file *seq; int rc; -#ifndef HAVE_ONLY_PROCFS_SEQ - if (LPROCFS_ENTRY_CHECK(PDE(inode))) - return -ENOENT; -#endif + rc = LPROCFS_ENTRY_CHECK(inode); + if (rc < 0) + return rc; + rc = seq_open(file, &lprocfs_stats_seq_sops); if (rc) return rc; @@ -2062,7 +1277,7 @@ static int lprocfs_stats_seq_open(struct inode *inode, struct file *file) return 0; } -struct file_operations lprocfs_stats_seq_fops = { +static const struct file_operations lprocfs_stats_seq_fops = { .owner = THIS_MODULE, .open = lprocfs_stats_seq_open, .read = seq_read, @@ -2141,7 +1356,6 @@ void lprocfs_init_mps_stats(int num_private_stats, struct lprocfs_stats *stats) LPROCFS_MD_OP_INIT(num_private_stats, stats, find_cbdata); LPROCFS_MD_OP_INIT(num_private_stats, stats, close); LPROCFS_MD_OP_INIT(num_private_stats, stats, create); - LPROCFS_MD_OP_INIT(num_private_stats, stats, done_writing); LPROCFS_MD_OP_INIT(num_private_stats, stats, enqueue); LPROCFS_MD_OP_INIT(num_private_stats, stats, getattr); LPROCFS_MD_OP_INIT(num_private_stats, stats, getattr_name); @@ -2157,20 +1371,16 @@ void lprocfs_init_mps_stats(int num_private_stats, struct lprocfs_stats *stats) LPROCFS_MD_OP_INIT(num_private_stats, stats, init_ea_size); LPROCFS_MD_OP_INIT(num_private_stats, stats, get_lustre_md); LPROCFS_MD_OP_INIT(num_private_stats, stats, free_lustre_md); - LPROCFS_MD_OP_INIT(num_private_stats, stats, update_lsm_md); LPROCFS_MD_OP_INIT(num_private_stats, stats, merge_attr); LPROCFS_MD_OP_INIT(num_private_stats, stats, set_open_replay_data); LPROCFS_MD_OP_INIT(num_private_stats, stats, clear_open_replay_data); LPROCFS_MD_OP_INIT(num_private_stats, stats, set_lock_data); LPROCFS_MD_OP_INIT(num_private_stats, stats, lock_match); LPROCFS_MD_OP_INIT(num_private_stats, stats, cancel_unused); - LPROCFS_MD_OP_INIT(num_private_stats, stats, renew_capa); - LPROCFS_MD_OP_INIT(num_private_stats, stats, unpack_capa); LPROCFS_MD_OP_INIT(num_private_stats, stats, get_remote_perm); LPROCFS_MD_OP_INIT(num_private_stats, stats, intent_getattr_async); LPROCFS_MD_OP_INIT(num_private_stats, stats, revalidate_lock); } -EXPORT_SYMBOL(lprocfs_init_mps_stats); int lprocfs_alloc_md_stats(struct obd_device *obd, unsigned int num_private_stats) @@ -2299,14 +1509,14 @@ __s64 lprocfs_read_helper(struct lprocfs_counter *lc, } EXPORT_SYMBOL(lprocfs_read_helper); -int lprocfs_write_helper(const char *buffer, unsigned long count, +int lprocfs_write_helper(const char __user *buffer, unsigned long count, int *val) { return lprocfs_write_frac_helper(buffer, count, val, 1); } EXPORT_SYMBOL(lprocfs_write_helper); -int lprocfs_write_frac_helper(const char *buffer, unsigned long count, +int lprocfs_write_frac_helper(const char __user *buffer, unsigned long count, int *val, int mult) { char kernbuf[20], *end, *pbuf; @@ -2402,7 +1612,6 @@ int lprocfs_read_frac_helper(char *buffer, unsigned long count, long val, buffer[prtn++] ='\n'; return prtn; } -EXPORT_SYMBOL(lprocfs_read_frac_helper); int lprocfs_seq_read_frac_helper(struct seq_file *m, long val, int mult) { @@ -2429,14 +1638,16 @@ int lprocfs_seq_read_frac_helper(struct seq_file *m, long val, int mult) } EXPORT_SYMBOL(lprocfs_seq_read_frac_helper); -int lprocfs_write_u64_helper(const char *buffer, unsigned long count,__u64 *val) +int lprocfs_write_u64_helper(const char __user *buffer, unsigned long count, + __u64 *val) { return lprocfs_write_frac_u64_helper(buffer, count, val, 1); } EXPORT_SYMBOL(lprocfs_write_u64_helper); -int lprocfs_write_frac_u64_helper(const char *buffer, unsigned long count, - __u64 *val, int mult) +int lprocfs_write_frac_u64_helper(const char __user *buffer, + unsigned long count, + __u64 *val, int mult) { char kernbuf[22], *end, *pbuf; __u64 whole, frac = 0, units; @@ -2619,18 +1830,18 @@ void lprocfs_oh_clear(struct obd_histogram *oh) EXPORT_SYMBOL(lprocfs_oh_clear); int lprocfs_obd_rd_max_pages_per_rpc(char *page, char **start, off_t off, - int count, int *eof, void *data) + int count, int *eof, void *data) { - struct obd_device *dev = data; - struct client_obd *cli = &dev->u.cli; - int rc; + struct obd_device *dev = data; + struct client_obd *cli = &dev->u.cli; + int rc; - client_obd_list_lock(&cli->cl_loi_list_lock); - rc = snprintf(page, count, "%d\n", cli->cl_max_pages_per_rpc); - client_obd_list_unlock(&cli->cl_loi_list_lock); - return rc; + spin_lock(&cli->cl_loi_list_lock); + rc = snprintf(page, count, "%d\n", cli->cl_max_pages_per_rpc); + spin_unlock(&cli->cl_loi_list_lock); + + return rc; } -EXPORT_SYMBOL(lprocfs_obd_rd_max_pages_per_rpc); int lprocfs_obd_max_pages_per_rpc_seq_show(struct seq_file *m, void *data) { @@ -2638,9 +1849,9 @@ int lprocfs_obd_max_pages_per_rpc_seq_show(struct seq_file *m, void *data) struct client_obd *cli = &dev->u.cli; int rc; - client_obd_list_lock(&cli->cl_loi_list_lock); + spin_lock(&cli->cl_loi_list_lock); rc = seq_printf(m, "%d\n", cli->cl_max_pages_per_rpc); - client_obd_list_unlock(&cli->cl_loi_list_lock); + spin_unlock(&cli->cl_loi_list_lock); return rc; } EXPORT_SYMBOL(lprocfs_obd_max_pages_per_rpc_seq_show); @@ -2714,6 +1925,7 @@ int lprocfs_wr_nosquash_nids(const char __user *buffer, unsigned long count, char *kernbuf = NULL; char *errmsg; struct list_head tmp; + int len = count; ENTRY; if (count > 4096) { @@ -2733,9 +1945,10 @@ int lprocfs_wr_nosquash_nids(const char __user *buffer, unsigned long count, kernbuf[count] = '\0'; if (count > 0 && kernbuf[count - 1] == '\n') - kernbuf[count - 1] = '\0'; + len = count - 1; - if (strcmp(kernbuf, "NONE") == 0 || strcmp(kernbuf, "clear") == 0) { + if ((len == 4 && strncmp(kernbuf, "NONE", len) == 0) || + (len == 5 && strncmp(kernbuf, "clear", len) == 0)) { /* empty string is special case */ down_write(&squash->rsi_sem); if (!list_empty(&squash->rsi_nosquash_nids)) @@ -2777,4 +1990,4 @@ failed: } EXPORT_SYMBOL(lprocfs_wr_nosquash_nids); -#endif /* LPROCFS*/ +#endif /* CONFIG_PROC_FS*/