1 // SPDX-License-Identifier: GPL-2.0 1 // SPDX-License-Identifier: GPL-2.0 2 /* 2 /* 3 * Procfs support for lockd 3 * Procfs support for lockd 4 * 4 * 5 * Copyright (c) 2014 Jeff Layton <jlayton@pri 5 * Copyright (c) 2014 Jeff Layton <jlayton@primarydata.com> 6 */ 6 */ 7 7 8 #include <linux/fs.h> 8 #include <linux/fs.h> 9 #include <linux/proc_fs.h> 9 #include <linux/proc_fs.h> 10 #include <linux/module.h> 10 #include <linux/module.h> 11 #include <linux/nsproxy.h> 11 #include <linux/nsproxy.h> 12 #include <net/net_namespace.h> 12 #include <net/net_namespace.h> 13 13 14 #include "netns.h" 14 #include "netns.h" 15 #include "procfs.h" 15 #include "procfs.h" 16 16 17 /* 17 /* 18 * We only allow strings that start with 'Y', 18 * We only allow strings that start with 'Y', 'y', or '1'. 19 */ 19 */ 20 static ssize_t 20 static ssize_t 21 nlm_end_grace_write(struct file *file, const c 21 nlm_end_grace_write(struct file *file, const char __user *buf, size_t size, 22 loff_t *pos) 22 loff_t *pos) 23 { 23 { 24 char *data; 24 char *data; 25 struct lockd_net *ln = net_generic(cur 25 struct lockd_net *ln = net_generic(current->nsproxy->net_ns, 26 loc 26 lockd_net_id); 27 27 28 if (size < 1) 28 if (size < 1) 29 return -EINVAL; 29 return -EINVAL; 30 30 31 data = simple_transaction_get(file, bu 31 data = simple_transaction_get(file, buf, size); 32 if (IS_ERR(data)) 32 if (IS_ERR(data)) 33 return PTR_ERR(data); 33 return PTR_ERR(data); 34 34 35 switch(data[0]) { 35 switch(data[0]) { 36 case 'Y': 36 case 'Y': 37 case 'y': 37 case 'y': 38 case '1': 38 case '1': 39 locks_end_grace(&ln->lockd_man 39 locks_end_grace(&ln->lockd_manager); 40 break; 40 break; 41 default: 41 default: 42 return -EINVAL; 42 return -EINVAL; 43 } 43 } 44 44 45 return size; 45 return size; 46 } 46 } 47 47 48 static ssize_t 48 static ssize_t 49 nlm_end_grace_read(struct file *file, char __u 49 nlm_end_grace_read(struct file *file, char __user *buf, size_t size, 50 loff_t *pos) 50 loff_t *pos) 51 { 51 { 52 struct lockd_net *ln = net_generic(cur 52 struct lockd_net *ln = net_generic(current->nsproxy->net_ns, 53 loc 53 lockd_net_id); 54 char resp[3]; 54 char resp[3]; 55 55 56 resp[0] = list_empty(&ln->lockd_manage 56 resp[0] = list_empty(&ln->lockd_manager.list) ? 'Y' : 'N'; 57 resp[1] = '\n'; 57 resp[1] = '\n'; 58 resp[2] = '\0'; 58 resp[2] = '\0'; 59 59 60 return simple_read_from_buffer(buf, si 60 return simple_read_from_buffer(buf, size, pos, resp, sizeof(resp)); 61 } 61 } 62 62 63 static const struct proc_ops lockd_end_grace_p !! 63 static const struct file_operations lockd_end_grace_operations = { 64 .proc_write = nlm_end_grace_write, !! 64 .write = nlm_end_grace_write, 65 .proc_read = nlm_end_grace_read, !! 65 .read = nlm_end_grace_read, 66 .proc_lseek = default_llseek, !! 66 .llseek = default_llseek, 67 .proc_release = simple_transaction_r !! 67 .release = simple_transaction_release, 68 }; 68 }; 69 69 70 int __init 70 int __init 71 lockd_create_procfs(void) 71 lockd_create_procfs(void) 72 { 72 { 73 struct proc_dir_entry *entry; 73 struct proc_dir_entry *entry; 74 74 75 entry = proc_mkdir("fs/lockd", NULL); 75 entry = proc_mkdir("fs/lockd", NULL); 76 if (!entry) 76 if (!entry) 77 return -ENOMEM; 77 return -ENOMEM; 78 entry = proc_create("nlm_end_grace", S 78 entry = proc_create("nlm_end_grace", S_IRUGO|S_IWUSR, entry, 79 &lockd_end_grace_p !! 79 &lockd_end_grace_operations); 80 if (!entry) { 80 if (!entry) { 81 remove_proc_entry("fs/lockd", 81 remove_proc_entry("fs/lockd", NULL); 82 return -ENOMEM; 82 return -ENOMEM; 83 } 83 } 84 return 0; 84 return 0; 85 } 85 } 86 86 87 void __exit 87 void __exit 88 lockd_remove_procfs(void) 88 lockd_remove_procfs(void) 89 { 89 { 90 remove_proc_entry("fs/lockd/nlm_end_gr 90 remove_proc_entry("fs/lockd/nlm_end_grace", NULL); 91 remove_proc_entry("fs/lockd", NULL); 91 remove_proc_entry("fs/lockd", NULL); 92 } 92 } 93 93
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.