4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.gnu.org/licenses/gpl-2.0.html
23 * Copyright (C) 2013, Trustees of Indiana University
25 * Copyright (c) 2014, Intel Corporation.
27 * Author: Joshua Walgenbach <jjw@iu.edu>
30 #define NODEMAP_LPROC_ID_LEN 16
31 #define NODEMAP_LPROC_FLAG_LEN 2
33 #include <lprocfs_status.h>
34 #include <lustre_net.h>
35 #include <lustre_export.h>
36 #include <obd_class.h>
37 #include <interval_tree.h>
38 #include "nodemap_internal.h"
40 /* Turn on proc debug interface to allow OSS and
41 * MDS nodes to configure nodemap independently of
42 * MGS (since the nodemap distribution is not written
44 #define NODEMAP_PROC_DEBUG 1
47 * Reads and prints the idmap for the given nodemap.
49 * \param m seq file in proc fs
53 static int nodemap_idmap_show(struct seq_file *m, void *data)
55 struct lu_nodemap *nodemap = m->private;
56 struct lu_idmap *idmap;
61 read_lock(&nodemap->nm_idmap_lock);
62 for (node = rb_first(&nodemap->nm_client_to_fs_uidmap); node;
63 node = rb_next(node)) {
67 idmap = rb_entry(node, struct lu_idmap, id_client_to_fs);
69 seq_printf(m, " { idtype: uid, client_id: %u, "
70 "fs_id: %u }", idmap->id_client,
73 for (node = rb_first(&nodemap->nm_client_to_fs_gidmap);
74 node; node = rb_next(node)) {
77 idmap = rb_entry(node, struct lu_idmap, id_client_to_fs);
79 seq_printf(m, " { idtype: gid, client_id: %u, "
80 "fs_id: %u }", idmap->id_client,
83 read_unlock(&nodemap->nm_idmap_lock);
91 * Attaches nodemap_idmap_show to proc file.
93 * \param inode inode of seq file in proc fs
94 * \param file seq file
97 static int nodemap_idmap_open(struct inode *inode, struct file *file)
99 struct lu_nodemap *nodemap = PDE_DATA(inode);
101 return single_open(file, nodemap_idmap_show, nodemap);
105 * Reads and prints the NID ranges for the given nodemap.
107 * \param m seq file in proc fs
111 static int nodemap_ranges_show(struct seq_file *m, void *data)
113 struct lu_nodemap *nodemap = m->private;
114 struct lu_nid_range *range;
115 struct interval_node_extent ext;
116 char start_nidstr[LNET_NIDSTR_SIZE];
117 char end_nidstr[LNET_NIDSTR_SIZE];
120 seq_printf(m, "[\n");
121 read_lock(&nm_range_tree_lock);
122 list_for_each_entry(range, &nodemap->nm_ranges, rn_list) {
124 seq_printf(m, ",\n");
126 ext = range->rn_node.in_extent;
127 libcfs_nid2str_r(ext.start, start_nidstr, sizeof(start_nidstr));
128 libcfs_nid2str_r(ext.end, end_nidstr, sizeof(end_nidstr));
129 seq_printf(m, " { id: %u, start_nid: %s, end_nid: %s }",
130 range->rn_id, start_nidstr, end_nidstr);
132 read_unlock(&nm_range_tree_lock);
134 seq_printf(m, "]\n");
140 * Connects nodemap_idmap_show to proc file.
142 * \param inode inode of seq file in proc fs
143 * \param file seq file
146 static int nodemap_ranges_open(struct inode *inode, struct file *file)
148 struct lu_nodemap *nodemap = PDE_DATA(inode);
150 return single_open(file, nodemap_ranges_show, nodemap);
154 * Reads and prints the exports attached to the given nodemap.
156 * \param m seq file in proc fs, stores nodemap
160 static int nodemap_exports_show(struct seq_file *m, void *data)
162 struct lu_nodemap *nodemap = m->private;
163 struct obd_export *exp;
164 char nidstr[LNET_NIDSTR_SIZE] = "<unknown>";
166 seq_printf(m, "[\n");
168 mutex_lock(&nodemap->nm_member_list_lock);
169 list_for_each_entry(exp, &nodemap->nm_member_list,
170 exp_target_data.ted_nodemap_member) {
171 if (exp->exp_connection != NULL)
172 libcfs_nid2str_r(exp->exp_connection->c_peer.nid,
173 nidstr, sizeof(nidstr));
175 seq_printf(m, " { nid: %s, uuid: %s },",
176 nidstr, exp->exp_client_uuid.uuid);
178 mutex_unlock(&nodemap->nm_member_list_lock);
181 seq_printf(m, "]\n");
187 * Attaches nodemap_idmap_show to proc file.
189 * \param inode inode of seq file in proc fs
190 * \param file seq file
193 static int nodemap_exports_open(struct inode *inode, struct file *file)
195 struct lu_nodemap *nodemap = PDE_DATA(inode);
197 return single_open(file, nodemap_exports_show, nodemap);
201 * Reads and prints the active flag for the given nodemap.
203 * \param m seq file in proc fs
207 static int nodemap_active_seq_show(struct seq_file *m, void *data)
209 return seq_printf(m, "%u\n", (unsigned int)nodemap_active);
213 * Activate/deactivate nodemap.
215 * \param[in] file proc file
216 * \param[in] buffer string, "1" or "0" to activate/deactivate nodemap
217 * \param[in] count \a buffer length
218 * \param[in] off unused
219 * \retval \a count on success
220 * \retval negative number on error
223 nodemap_active_seq_write(struct file *file, const char __user *buffer,
224 size_t count, loff_t *off)
226 char active_string[NODEMAP_LPROC_FLAG_LEN + 1];
227 long unsigned int active;
233 if (count >= sizeof(active_string))
236 if (copy_from_user(active_string, buffer, count))
239 active_string[count] = '\0';
240 rc = kstrtoul(active_string, 10, &active);
244 nodemap_active = active;
248 LPROC_SEQ_FOPS(nodemap_active);
251 * Reads and prints the nodemap ID for the given nodemap.
253 * \param m seq file in proc fs
257 static int nodemap_id_seq_show(struct seq_file *m, void *data)
259 struct lu_nodemap *nodemap = m->private;
261 return seq_printf(m, "%u\n", nodemap->nm_id);
263 LPROC_SEQ_FOPS_RO(nodemap_id);
266 * Reads and prints the root squash UID for the given nodemap.
268 * \param m seq file in proc fs
272 static int nodemap_squash_uid_seq_show(struct seq_file *m, void *data)
274 struct lu_nodemap *nodemap = m->private;
276 return seq_printf(m, "%u\n", nodemap->nm_squash_uid);
280 * Reads and prints the root squash GID for the given nodemap.
282 * \param m seq file in proc fs
286 static int nodemap_squash_gid_seq_show(struct seq_file *m, void *data)
288 struct lu_nodemap *nodemap = m->private;
290 return seq_printf(m, "%u\n", nodemap->nm_squash_gid);
294 * Reads and prints the trusted flag for the given nodemap.
296 * \param m seq file in proc fs
300 static int nodemap_trusted_seq_show(struct seq_file *m, void *data)
302 struct lu_nodemap *nodemap = m->private;
304 return seq_printf(m, "%d\n", (int)nodemap->nmf_trust_client_ids);
308 * Reads and prints the admin flag for the given nodemap.
310 * \param m seq file in proc fs
314 static int nodemap_admin_seq_show(struct seq_file *m, void *data)
316 struct lu_nodemap *nodemap = m->private;
318 return seq_printf(m, "%d\n", (int)nodemap->nmf_allow_root_access);
321 #ifdef NODEMAP_PROC_DEBUG
323 * Helper functions to set nodemap flags.
325 * \param[in] buffer string, which is "1" or "0" to set/unset flag
326 * \param[in] count \a buffer length
327 * \param[out] flag_p where to store flag value
328 * \retval \a count on success
329 * \retval negative number on error
331 static int nodemap_proc_read_flag(const char __user *buffer,
332 unsigned long count, unsigned int *flag_p)
334 char scratch[NODEMAP_LPROC_FLAG_LEN + 1];
335 long unsigned int flag_buf;
341 if (count >= sizeof(scratch))
344 if (copy_from_user(scratch, buffer, count))
347 scratch[count] = '\0';
348 rc = kstrtoul(scratch, 10, &flag_buf);
358 * Set the squash UID.
360 * \param[in] file proc file
361 * \param[in] buffer string representing squash UID to set
362 * \param[in] count \a buffer length
363 * \param[in] off unused
364 * \retval \a count on success
365 * \retval negative number on error
368 nodemap_squash_uid_seq_write(struct file *file, const char __user *buffer,
369 size_t count, loff_t *off)
371 char squash[NODEMAP_LPROC_ID_LEN + 1];
372 struct seq_file *m = file->private_data;
373 struct lu_nodemap *nodemap = m->private;
374 long unsigned int squash_uid;
380 if (count >= sizeof(squash))
383 if (copy_from_user(squash, buffer, count))
386 squash[count] = '\0';
387 rc = kstrtoul(squash, 10, &squash_uid);
391 nodemap->nm_squash_uid = squash_uid;
397 * Set the squash GID.
399 * \param[in] file proc file
400 * \param[in] buffer string representing squash GID to set
401 * \param[in] count \a buffer length
402 * \param[in] off unused
403 * \retval \a count on success
404 * \retval negative number on error
407 nodemap_squash_gid_seq_write(struct file *file, const char __user *buffer,
408 size_t count, loff_t *off)
410 char squash[NODEMAP_LPROC_ID_LEN + 1];
411 struct seq_file *m = file->private_data;
412 struct lu_nodemap *nodemap = m->private;
413 long unsigned int squash_gid;
419 if (count >= sizeof(squash))
422 if (copy_from_user(squash, buffer, count))
425 squash[count] = '\0';
426 rc = kstrtoul(squash, 10, &squash_gid);
430 nodemap->nm_squash_gid = squash_gid;
436 * Set/unset the trusted flag.
438 * \param[in] file proc file
439 * \param[in] buffer string, "1" or "0"
440 * \param[in] count \a buffer length
441 * \param[in] off unused
442 * \retval \a count on success
443 * \retval negative number on error
446 nodemap_trusted_seq_write(struct file *file, const char __user *buffer,
447 size_t count, loff_t *off)
449 struct seq_file *m = file->private_data;
450 struct lu_nodemap *nodemap = m->private;
454 rc = nodemap_proc_read_flag(buffer, count, &flags);
456 nodemap->nmf_trust_client_ids = !!flags;
457 nm_member_revoke_locks(nodemap);
464 * Set/unset the admin flag.
466 * \param[in] file proc file
467 * \param[in] buffer string, "1" or "0"
468 * \param[in] count \a buffer length
469 * \param[in] off unused
470 * \retval \a count on success
471 * \retval negative number on error
474 nodemap_admin_seq_write(struct file *file, const char __user *buffer,
475 size_t count, loff_t *off)
477 struct seq_file *m = file->private_data;
478 struct lu_nodemap *nodemap = m->private;
482 rc = nodemap_proc_read_flag(buffer, count, &flags);
484 nodemap->nmf_allow_root_access = !!flags;
485 nm_member_revoke_locks(nodemap);
494 * \param[in] file proc file
495 * \param[in] buffer string, name of the nodemap to add
496 * \param[in] count \a buffer length
497 * \param[in] off unused
498 * \retval \a count on success
499 * \retval negative number on error
502 lprocfs_add_nodemap_seq_write(struct file *file, const char __user *buffer,
503 size_t count, loff_t *off)
505 char nodemap_name[LUSTRE_NODEMAP_NAME_LENGTH + 1];
513 if (count >= sizeof(nodemap_name))
516 if (copy_from_user(nodemap_name, buffer, count))
519 nodemap_name[count] = '\0';
521 cpybuf = nodemap_name;
522 pos = strsep(&cpybuf, " \n");
526 rc = nodemap_add(nodemap_name);
532 LPROC_SEQ_FOPS_WO_TYPE(nodemap, add_nodemap);
537 * \param[in] file proc file
538 * \param[in] buffer string, name of the nodemap to delete
539 * \param[in] count \a buffer length
540 * \param[in] off unused
541 * \retval \a count on success
542 * \retval negative number on error
545 lprocfs_del_nodemap_seq_write(struct file *file, const char __user *buffer,
546 size_t count, loff_t *off)
548 char nodemap_name[LUSTRE_NODEMAP_NAME_LENGTH + 1];
556 if (count >= sizeof(nodemap_name))
559 if (copy_from_user(nodemap_name, buffer, count))
562 nodemap_name[count] = '\0';
564 cpybuf = nodemap_name;
565 pos = strsep(&cpybuf, " \n");
569 rc = nodemap_del(nodemap_name);
576 LPROC_SEQ_FOPS_WO_TYPE(nodemap, del_nodemap);
579 * Helper function to parse a NID string.
581 * \param[in] rangestr string representation of NIDs, see libcfs_str2nid()
582 * \param[out] nids array of two nids
583 * \retval 0 on success
584 * \retval negative number on error
586 static int parse_nids(char *rangestr, lnet_nid_t nids[2])
588 struct list_head nidlist;
589 char nidstr[2][LNET_NIDSTR_SIZE];
590 char nidrange_str[2 * LNET_NIDSTR_SIZE + 2];
593 INIT_LIST_HEAD(&nidlist);
595 if (cfs_parse_nidlist(rangestr, strlen(rangestr),
599 if (!cfs_nidrange_is_contiguous(&nidlist))
602 cfs_nidrange_find_min_max(&nidlist, nidstr[0], nidstr[1],
604 snprintf(nidrange_str, sizeof(nidrange_str), "%s:%s",
605 nidstr[0], nidstr[1]);
607 rc = nodemap_parse_range(nidrange_str, nids);
611 cfs_free_nidlist(&nidlist);
617 * Add a NID range to nodemap.
619 * \param[in] file proc file
620 * \param[in] buffer string, "<nodemap name> <nid range>"
621 * \param[in] count \a buffer length
622 * \param[in] off unused
623 * \retval \a count on success
624 * \retval negative number on error
627 lprocfs_add_nodemap_range_seq_write(struct file *file,
628 const char __user *buffer,
629 size_t count, loff_t *off)
631 char name_range[LUSTRE_NODEMAP_NAME_LENGTH +
632 LNET_NIDSTR_SIZE * 2 + 2];
635 char *rangestr = NULL;
642 if (count >= sizeof(name_range))
643 GOTO(out, rc = -EINVAL);
645 if (copy_from_user(name_range, buffer, count))
646 GOTO(out, rc = -EFAULT);
648 name_range[count] = '\0';
651 name = strsep(&cpybuf, " ");
653 GOTO(out, rc = -EINVAL);
655 rangestr = strsep(&cpybuf, " \n");
656 if (rangestr == NULL)
657 GOTO(out, rc = -EINVAL);
659 rc = parse_nids(rangestr, nids);
663 rc = nodemap_add_range(name, nids);
665 GOTO(out, rc = -EINVAL);
673 LPROC_SEQ_FOPS_WO_TYPE(nodemap, add_nodemap_range);
676 * Delete a NID range from nodemap.
678 * \param[in] file proc file
679 * \param[in] buffer string, "<nodemap name> <nid range>"
680 * \param[in] count \a buffer length
681 * \param[in] off unused
682 * \retval \a count on success
683 * \retval negative number on error
686 lprocfs_del_nodemap_range_seq_write(struct file *file,
687 const char __user *buffer,
688 size_t count, loff_t *off)
690 char name_range[LUSTRE_NODEMAP_NAME_LENGTH +
691 LNET_NIDSTR_SIZE * 2 + 2];
694 char *rangestr = NULL;
701 if (count >= sizeof(name_range))
702 GOTO(out, rc = -EINVAL);
704 if (copy_from_user(name_range, buffer, count))
705 GOTO(out, rc = -EFAULT);
707 name_range[count] = '\0';
710 name = strsep(&cpybuf, " ");
712 GOTO(out, rc = -EINVAL);
714 rangestr = strsep(&cpybuf, " \n");
715 if (rangestr == NULL)
716 GOTO(out, rc = -EINVAL);
718 rc = parse_nids(rangestr, nids);
722 rc = nodemap_del_range(name, nids);
724 GOTO(out, rc = -EINVAL);
732 LPROC_SEQ_FOPS_WO_TYPE(nodemap, del_nodemap_range);
735 * Add an idmap to nodemap.
737 * \param[in] file proc file
738 * \param[in] buffer string, "<nodemap name> <uid|gid> <idmap>"
739 * \param[in] count \a buffer length
740 * \param[in] off unused
741 * \retval \a count on success
742 * \retval negative number on error
745 lprocfs_add_nodemap_idmap_seq_write(struct file *file,
746 const char __user *buffer,
747 size_t count, loff_t *off)
749 char name_idmapstr[LUSTRE_NODEMAP_NAME_LENGTH + 16];
752 char *idtypestr = NULL;
753 char *idmapstr = NULL;
760 if (count >= sizeof(name_idmapstr))
761 GOTO(out, rc = -EINVAL);
763 if (copy_from_user(name_idmapstr, buffer, count))
764 GOTO(out, rc = -EFAULT);
766 name_idmapstr[count] = '\0';
768 cpybuf = name_idmapstr;
769 name = strsep(&cpybuf, " ");
771 GOTO(out, rc = -EINVAL);
773 idtypestr = strsep(&cpybuf, " ");
774 if (idtypestr == NULL)
775 GOTO(out, rc = -EINVAL);
777 idmapstr = strsep(&cpybuf, " \n");
778 if (idmapstr == NULL)
779 GOTO(out, rc = -EINVAL);
781 rc = nodemap_parse_idmap(idmapstr, idmap);
783 GOTO(out, rc = -EINVAL);
785 if (strcmp(idtypestr, "uid") == 0)
786 rc = nodemap_add_idmap(name, NODEMAP_UID, idmap);
787 else if (strcmp(idtypestr, "gid") == 0)
788 rc = nodemap_add_idmap(name, NODEMAP_GID, idmap);
790 GOTO(out, rc = -EINVAL);
793 GOTO(out, rc = -EINVAL);
801 LPROC_SEQ_FOPS_WO_TYPE(nodemap, add_nodemap_idmap);
804 * Delete an idmap from nodemap.
806 * \param[in] file proc file
807 * \param[in] buffer string, "<nodemap name> <uid|gid> <idmap>"
808 * \param[in] count \a buffer length
809 * \param[in] off unused
810 * \retval \a count on success
811 * \retval negative number on error
814 lprocfs_del_nodemap_idmap_seq_write(struct file *file,
815 const char __user *buffer,
816 size_t count, loff_t *off)
818 char name_idmapstr[LUSTRE_NODEMAP_NAME_LENGTH + 16];
821 char *idtypestr = NULL;
822 char *idmapstr = NULL;
829 if (count >= sizeof(name_idmapstr))
830 GOTO(out, rc = -EINVAL);
832 if (copy_from_user(name_idmapstr, buffer, count))
833 GOTO(out, rc = -EFAULT);
835 name_idmapstr[count] = '\0';
837 cpybuf = name_idmapstr;
838 name = strsep(&cpybuf, " ");
840 GOTO(out, rc = -EINVAL);
842 idtypestr = strsep(&cpybuf, " ");
843 if (idtypestr == NULL)
844 GOTO(out, rc = -EINVAL);
846 idmapstr = strsep(&cpybuf, " \n");
847 if (idmapstr == NULL)
848 GOTO(out, rc = -EINVAL);
850 rc = nodemap_parse_idmap(idmapstr, idmap);
852 GOTO(out, rc = -EINVAL);
854 if (strcmp(idtypestr, "uid") == 0)
855 rc = nodemap_del_idmap(name, NODEMAP_UID, idmap);
856 else if (strcmp(idtypestr, "gid") == 0)
857 rc = nodemap_del_idmap(name, NODEMAP_GID, idmap);
859 GOTO(out, rc = -EINVAL);
862 GOTO(out, rc = -EINVAL);
870 LPROC_SEQ_FOPS_WO_TYPE(nodemap, del_nodemap_idmap);
871 #endif /* NODEMAP_PROC_DEBUG */
873 static struct lprocfs_vars lprocfs_nm_module_vars[] = {
876 .fops = &nodemap_active_fops,
878 #ifdef NODEMAP_PROC_DEBUG
880 .name = "add_nodemap",
881 .fops = &nodemap_add_nodemap_fops,
884 .name = "remove_nodemap",
885 .fops = &nodemap_del_nodemap_fops,
888 .name = "add_nodemap_range",
889 .fops = &nodemap_add_nodemap_range_fops,
892 .name = "del_nodemap_range",
893 .fops = &nodemap_del_nodemap_range_fops,
896 .name = "add_nodemap_idmap",
897 .fops = &nodemap_add_nodemap_idmap_fops,
900 .name = "del_nodemap_idmap",
901 .fops = &nodemap_del_nodemap_idmap_fops,
903 #endif /* NODEMAP_PROC_DEBUG */
909 #ifdef NODEMAP_PROC_DEBUG
910 LPROC_SEQ_FOPS(nodemap_trusted);
911 LPROC_SEQ_FOPS(nodemap_admin);
912 LPROC_SEQ_FOPS(nodemap_squash_uid);
913 LPROC_SEQ_FOPS(nodemap_squash_gid);
915 LPROC_SEQ_FOPS_RO(nodemap_trusted);
916 LPROC_SEQ_FOPS_RO(nodemap_admin);
917 LPROC_SEQ_FOPS_RO(nodemap_squash_uid);
918 LPROC_SEQ_FOPS_RO(nodemap_squash_gid);
921 const struct file_operations nodemap_ranges_fops = {
922 .open = nodemap_ranges_open,
925 .release = single_release
928 const struct file_operations nodemap_idmap_fops = {
929 .open = nodemap_idmap_open,
932 .release = single_release
935 const struct file_operations nodemap_exports_fops = {
936 .open = nodemap_exports_open,
939 .release = single_release
942 static struct lprocfs_vars lprocfs_nodemap_vars[] = {
945 .fops = &nodemap_id_fops,
948 .name = "trusted_nodemap",
949 .fops = &nodemap_trusted_fops,
952 .name = "admin_nodemap",
953 .fops = &nodemap_admin_fops,
956 .name = "squash_uid",
957 .fops = &nodemap_squash_uid_fops,
960 .name = "squash_gid",
961 .fops = &nodemap_squash_gid_fops,
965 .fops = &nodemap_ranges_fops,
969 .fops = &nodemap_exports_fops,
973 .fops = &nodemap_idmap_fops,
980 static struct lprocfs_vars lprocfs_default_nodemap_vars[] = {
983 .fops = &nodemap_id_fops,
986 .name = "trusted_nodemap",
987 .fops = &nodemap_trusted_fops,
990 .name = "admin_nodemap",
991 .fops = &nodemap_admin_fops,
994 .name = "squash_uid",
995 .fops = &nodemap_squash_uid_fops,
998 .name = "squash_gid",
999 .fops = &nodemap_squash_gid_fops,
1003 .fops = &nodemap_exports_fops,
1011 * Initialize the nodemap procfs directory.
1015 int nodemap_procfs_init(void)
1019 proc_lustre_nodemap_root = lprocfs_register(LUSTRE_NODEMAP_NAME,
1021 lprocfs_nm_module_vars,
1023 if (IS_ERR(proc_lustre_nodemap_root)) {
1024 rc = PTR_ERR(proc_lustre_nodemap_root);
1025 CERROR("cannot create 'nodemap' directory: rc = %d\n",
1027 proc_lustre_nodemap_root = NULL;
1033 * Register the proc directory for a nodemap
1035 * \param name name of nodemap
1036 * \param is_default: 1 if default nodemap
1039 int lprocfs_nodemap_register(const char *name,
1041 struct lu_nodemap *nodemap)
1043 struct proc_dir_entry *nodemap_proc_entry;
1047 nodemap_proc_entry =
1048 lprocfs_register(name, proc_lustre_nodemap_root,
1049 lprocfs_default_nodemap_vars,
1052 nodemap_proc_entry =
1053 lprocfs_register(name, proc_lustre_nodemap_root,
1054 lprocfs_nodemap_vars,
1057 if (IS_ERR(nodemap_proc_entry)) {
1058 rc = PTR_ERR(nodemap_proc_entry);
1059 CERROR("cannot create 'nodemap/%s': rc = %d\n", name, rc);
1060 nodemap_proc_entry = NULL;
1063 nodemap->nm_proc_entry = nodemap_proc_entry;