diff options
author | Denis V. Lunev <den@openvz.org> | 2008-04-29 04:02:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-29 11:06:20 -0400 |
commit | 21ac295b42b8bdc3d677aba6bd7308a38de28a9b (patch) | |
tree | 61aa04e715d16f490b073b8271c0a5906ceab857 /fs | |
parent | 34b37235c60fd23e4075da475c7bb22e6c7a466e (diff) |
afs: use non-racy method for proc entries creation
Use proc_create()/proc_create_data() to make sure that ->proc_fops and ->data
be setup before gluing PDE to main tree.
Signed-off-by: Denis V. Lunev <den@openvz.org>
Acked-by: David Howells <dhowells@redhat.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/afs/proc.c | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/fs/afs/proc.c b/fs/afs/proc.c index 846c7615ac9e..9f7d1ae70269 100644 --- a/fs/afs/proc.c +++ b/fs/afs/proc.c | |||
@@ -41,6 +41,7 @@ static const struct file_operations afs_proc_cells_fops = { | |||
41 | .write = afs_proc_cells_write, | 41 | .write = afs_proc_cells_write, |
42 | .llseek = seq_lseek, | 42 | .llseek = seq_lseek, |
43 | .release = seq_release, | 43 | .release = seq_release, |
44 | .owner = THIS_MODULE, | ||
44 | }; | 45 | }; |
45 | 46 | ||
46 | static int afs_proc_rootcell_open(struct inode *inode, struct file *file); | 47 | static int afs_proc_rootcell_open(struct inode *inode, struct file *file); |
@@ -56,7 +57,8 @@ static const struct file_operations afs_proc_rootcell_fops = { | |||
56 | .read = afs_proc_rootcell_read, | 57 | .read = afs_proc_rootcell_read, |
57 | .write = afs_proc_rootcell_write, | 58 | .write = afs_proc_rootcell_write, |
58 | .llseek = no_llseek, | 59 | .llseek = no_llseek, |
59 | .release = afs_proc_rootcell_release | 60 | .release = afs_proc_rootcell_release, |
61 | .owner = THIS_MODULE, | ||
60 | }; | 62 | }; |
61 | 63 | ||
62 | static int afs_proc_cell_volumes_open(struct inode *inode, struct file *file); | 64 | static int afs_proc_cell_volumes_open(struct inode *inode, struct file *file); |
@@ -80,6 +82,7 @@ static const struct file_operations afs_proc_cell_volumes_fops = { | |||
80 | .read = seq_read, | 82 | .read = seq_read, |
81 | .llseek = seq_lseek, | 83 | .llseek = seq_lseek, |
82 | .release = afs_proc_cell_volumes_release, | 84 | .release = afs_proc_cell_volumes_release, |
85 | .owner = THIS_MODULE, | ||
83 | }; | 86 | }; |
84 | 87 | ||
85 | static int afs_proc_cell_vlservers_open(struct inode *inode, | 88 | static int afs_proc_cell_vlservers_open(struct inode *inode, |
@@ -104,6 +107,7 @@ static const struct file_operations afs_proc_cell_vlservers_fops = { | |||
104 | .read = seq_read, | 107 | .read = seq_read, |
105 | .llseek = seq_lseek, | 108 | .llseek = seq_lseek, |
106 | .release = afs_proc_cell_vlservers_release, | 109 | .release = afs_proc_cell_vlservers_release, |
110 | .owner = THIS_MODULE, | ||
107 | }; | 111 | }; |
108 | 112 | ||
109 | static int afs_proc_cell_servers_open(struct inode *inode, struct file *file); | 113 | static int afs_proc_cell_servers_open(struct inode *inode, struct file *file); |
@@ -127,6 +131,7 @@ static const struct file_operations afs_proc_cell_servers_fops = { | |||
127 | .read = seq_read, | 131 | .read = seq_read, |
128 | .llseek = seq_lseek, | 132 | .llseek = seq_lseek, |
129 | .release = afs_proc_cell_servers_release, | 133 | .release = afs_proc_cell_servers_release, |
134 | .owner = THIS_MODULE, | ||
130 | }; | 135 | }; |
131 | 136 | ||
132 | /* | 137 | /* |
@@ -143,17 +148,13 @@ int afs_proc_init(void) | |||
143 | goto error_dir; | 148 | goto error_dir; |
144 | proc_afs->owner = THIS_MODULE; | 149 | proc_afs->owner = THIS_MODULE; |
145 | 150 | ||
146 | p = create_proc_entry("cells", 0, proc_afs); | 151 | p = proc_create("cells", 0, proc_afs, &afs_proc_cells_fops); |
147 | if (!p) | 152 | if (!p) |
148 | goto error_cells; | 153 | goto error_cells; |
149 | p->proc_fops = &afs_proc_cells_fops; | ||
150 | p->owner = THIS_MODULE; | ||
151 | 154 | ||
152 | p = create_proc_entry("rootcell", 0, proc_afs); | 155 | p = proc_create("rootcell", 0, proc_afs, &afs_proc_rootcell_fops); |
153 | if (!p) | 156 | if (!p) |
154 | goto error_rootcell; | 157 | goto error_rootcell; |
155 | p->proc_fops = &afs_proc_rootcell_fops; | ||
156 | p->owner = THIS_MODULE; | ||
157 | 158 | ||
158 | _leave(" = 0"); | 159 | _leave(" = 0"); |
159 | return 0; | 160 | return 0; |
@@ -395,26 +396,20 @@ int afs_proc_cell_setup(struct afs_cell *cell) | |||
395 | if (!cell->proc_dir) | 396 | if (!cell->proc_dir) |
396 | goto error_dir; | 397 | goto error_dir; |
397 | 398 | ||
398 | p = create_proc_entry("servers", 0, cell->proc_dir); | 399 | p = proc_create_data("servers", 0, cell->proc_dir, |
400 | &afs_proc_cell_servers_fops, cell); | ||
399 | if (!p) | 401 | if (!p) |
400 | goto error_servers; | 402 | goto error_servers; |
401 | p->proc_fops = &afs_proc_cell_servers_fops; | ||
402 | p->owner = THIS_MODULE; | ||
403 | p->data = cell; | ||
404 | 403 | ||
405 | p = create_proc_entry("vlservers", 0, cell->proc_dir); | 404 | p = proc_create_data("vlservers", 0, cell->proc_dir, |
405 | &afs_proc_cell_vlservers_fops, cell); | ||
406 | if (!p) | 406 | if (!p) |
407 | goto error_vlservers; | 407 | goto error_vlservers; |
408 | p->proc_fops = &afs_proc_cell_vlservers_fops; | ||
409 | p->owner = THIS_MODULE; | ||
410 | p->data = cell; | ||
411 | 408 | ||
412 | p = create_proc_entry("volumes", 0, cell->proc_dir); | 409 | p = proc_create_data("volumes", 0, cell->proc_dir, |
410 | &afs_proc_cell_volumes_fops, cell); | ||
413 | if (!p) | 411 | if (!p) |
414 | goto error_volumes; | 412 | goto error_volumes; |
415 | p->proc_fops = &afs_proc_cell_volumes_fops; | ||
416 | p->owner = THIS_MODULE; | ||
417 | p->data = cell; | ||
418 | 413 | ||
419 | _leave(" = 0"); | 414 | _leave(" = 0"); |
420 | return 0; | 415 | return 0; |