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>
This commit is contained in:
parent
34b37235c6
commit
21ac295b42
|
@ -41,6 +41,7 @@ static const struct file_operations afs_proc_cells_fops = {
|
||||||
.write = afs_proc_cells_write,
|
.write = afs_proc_cells_write,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = seq_release,
|
.release = seq_release,
|
||||||
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int afs_proc_rootcell_open(struct inode *inode, struct file *file);
|
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 = {
|
||||||
.read = afs_proc_rootcell_read,
|
.read = afs_proc_rootcell_read,
|
||||||
.write = afs_proc_rootcell_write,
|
.write = afs_proc_rootcell_write,
|
||||||
.llseek = no_llseek,
|
.llseek = no_llseek,
|
||||||
.release = afs_proc_rootcell_release
|
.release = afs_proc_rootcell_release,
|
||||||
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int afs_proc_cell_volumes_open(struct inode *inode, struct file *file);
|
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 = {
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = afs_proc_cell_volumes_release,
|
.release = afs_proc_cell_volumes_release,
|
||||||
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int afs_proc_cell_vlservers_open(struct inode *inode,
|
static int afs_proc_cell_vlservers_open(struct inode *inode,
|
||||||
|
@ -104,6 +107,7 @@ static const struct file_operations afs_proc_cell_vlservers_fops = {
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = afs_proc_cell_vlservers_release,
|
.release = afs_proc_cell_vlservers_release,
|
||||||
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int afs_proc_cell_servers_open(struct inode *inode, struct file *file);
|
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 = {
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = afs_proc_cell_servers_release,
|
.release = afs_proc_cell_servers_release,
|
||||||
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -143,17 +148,13 @@ int afs_proc_init(void)
|
||||||
goto error_dir;
|
goto error_dir;
|
||||||
proc_afs->owner = THIS_MODULE;
|
proc_afs->owner = THIS_MODULE;
|
||||||
|
|
||||||
p = create_proc_entry("cells", 0, proc_afs);
|
p = proc_create("cells", 0, proc_afs, &afs_proc_cells_fops);
|
||||||
if (!p)
|
if (!p)
|
||||||
goto error_cells;
|
goto error_cells;
|
||||||
p->proc_fops = &afs_proc_cells_fops;
|
|
||||||
p->owner = THIS_MODULE;
|
|
||||||
|
|
||||||
p = create_proc_entry("rootcell", 0, proc_afs);
|
p = proc_create("rootcell", 0, proc_afs, &afs_proc_rootcell_fops);
|
||||||
if (!p)
|
if (!p)
|
||||||
goto error_rootcell;
|
goto error_rootcell;
|
||||||
p->proc_fops = &afs_proc_rootcell_fops;
|
|
||||||
p->owner = THIS_MODULE;
|
|
||||||
|
|
||||||
_leave(" = 0");
|
_leave(" = 0");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -395,26 +396,20 @@ int afs_proc_cell_setup(struct afs_cell *cell)
|
||||||
if (!cell->proc_dir)
|
if (!cell->proc_dir)
|
||||||
goto error_dir;
|
goto error_dir;
|
||||||
|
|
||||||
p = create_proc_entry("servers", 0, cell->proc_dir);
|
p = proc_create_data("servers", 0, cell->proc_dir,
|
||||||
|
&afs_proc_cell_servers_fops, cell);
|
||||||
if (!p)
|
if (!p)
|
||||||
goto error_servers;
|
goto error_servers;
|
||||||
p->proc_fops = &afs_proc_cell_servers_fops;
|
|
||||||
p->owner = THIS_MODULE;
|
|
||||||
p->data = cell;
|
|
||||||
|
|
||||||
p = create_proc_entry("vlservers", 0, cell->proc_dir);
|
p = proc_create_data("vlservers", 0, cell->proc_dir,
|
||||||
|
&afs_proc_cell_vlservers_fops, cell);
|
||||||
if (!p)
|
if (!p)
|
||||||
goto error_vlservers;
|
goto error_vlservers;
|
||||||
p->proc_fops = &afs_proc_cell_vlservers_fops;
|
|
||||||
p->owner = THIS_MODULE;
|
|
||||||
p->data = cell;
|
|
||||||
|
|
||||||
p = create_proc_entry("volumes", 0, cell->proc_dir);
|
p = proc_create_data("volumes", 0, cell->proc_dir,
|
||||||
|
&afs_proc_cell_volumes_fops, cell);
|
||||||
if (!p)
|
if (!p)
|
||||||
goto error_volumes;
|
goto error_volumes;
|
||||||
p->proc_fops = &afs_proc_cell_volumes_fops;
|
|
||||||
p->owner = THIS_MODULE;
|
|
||||||
p->data = cell;
|
|
||||||
|
|
||||||
_leave(" = 0");
|
_leave(" = 0");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue