: Use proc_create() to setup ->proc_fops first
Subsystems (4)
PATCH 3/15 : Use proc_create() to setup ->proc_fops first
Use proc_create() to make sure that ->proc_fops be setup before gluing PDE to main tree.
--- net/sunrpc/cache.c | 14 ++++++-------- net/sunrpc/stats.c | 3 +-- 2 files changed, 7 insertions(+), 10 deletions(-)
net/sunrpc/cache.c +6 -8
@@ -316,31 +316,29 @@ static int create_cache_proc_entries(struct cache_detail *cd) cd->proc_ent->owner = cd->owner; cd->channel_ent = cd->content_ent =NULL ; - p =create_proc_entry ("flush" ,S_IFREG |S_IRUSR |S_IWUSR , cd->proc_ent); + p =proc_create ("flush" ,S_IFREG |S_IRUSR |S_IWUSR , + cd->proc_ent, &cache_flush_operations); cd->flush_ent = p;if (p ==NULL ) goto out_nomem; - p->proc_fops = &cache_flush_operations; p->owner = cd->owner; p->data = cd;if (cd->cache_request || cd->cache_parse) { - p =create_proc_entry ("channel" ,S_IFREG |S_IRUSR |S_IWUSR , - cd->proc_ent); + p =proc_create ("channel" ,S_IFREG |S_IRUSR |S_IWUSR , + cd->proc_ent, &cache_file_operations); cd->channel_ent = p;if (p ==NULL ) goto out_nomem; - p->proc_fops = &cache_file_operations; p->owner = cd->owner; p->data = cd; }if (cd->cache_show) { - p =create_proc_entry ("content" ,S_IFREG |S_IRUSR |S_IWUSR , - cd->proc_ent); + p =proc_create ("content" ,S_IFREG |S_IRUSR |S_IWUSR , + cd->proc_ent, &content_file_operations); cd->content_ent = p;if (p ==NULL ) goto out_nomem; - p->proc_fops = &content_file_operations; p->owner = cd->owner; p->data = cd; }
net/sunrpc/stats.c +1 -2
@@ -229,9 +229,8 @@ do_register(const char *name, void *data, const struct file_operations *fops)rpc_proc_init ();dprintk ("RPC: registering /proc/net/rpc/%s\n" , name); - ent =create_proc_entry (name,0 , proc_net_rpc); + ent =proc_create (name,0 , proc_net_rpc, fops);if (ent) { - ent->proc_fops = fops; ent->data = data; }return ent;
Signature · 1 line
WCN
From: Wang Chen <[email protected]>
Date: Thu, 28 Feb 2008 18:55:40 +0800
Quoted 4 lines
Use
proc_create()to make sure that ->proc_fops be setup before gluing PDE to main tree.Signed-off-by Wang Chen <[email protected]>
Applied.
net/sunrpc/stats.c do_register(const char *name, void *data, const struct file_operations *fops) · line 236
Quoted 11 lines
net/sunrpc/stats.c +1
-2@@ -229,9 +229,8 @@ do_register(const char *name, void *data, const struct file_operations *fops)rpc_proc_init ();dprintk ("RPC: registering /proc/net/rpc/%s\n" , name); - ent =create_proc_entry (name,0 , proc_net_rpc); + ent =proc_create (name,0 , proc_net_rpc, fops);if (ent) { - ent->proc_fops = fops; ent->data = data; }return ent;
For this case it appears that ent->data has the same kind of visibility problem that ent->proc_fops does.
David Miller said the following on 2008-2-29 6:02:
Quoted 14 lines
From: Wang Chen <[email protected]>
Date: Thu, 28 Feb 2008 18:55:40 +0800Quoted 4 lines
Use
proc_create()to make sure that ->proc_fops be setup before gluing PDE to main tree.Signed-off-by Wang Chen <[email protected]>Applied.
Quoted 4 lines
net/sunrpc/stats.c +0
-0@@ -229,9 +229,8 @@ do_register(const char *name, void *data, const struct file_operations *fops)rpc_proc_init ();dprintk ("RPC: registering /proc/net/rpc/%s\n" , name);
Quoted 11 lines
net/sunrpc/stats.c do_register(const char *name, void *data, const struct file_operations *fops) · line 236
Quoted 7 lines
net/sunrpc/stats.c +1
-2- ent =create_proc_entry (name,0 , proc_net_rpc); + ent =proc_create (name,0 , proc_net_rpc, fops);if (ent) { - ent->proc_fops = fops; ent->data = data; }return ent;For this case it appears that
ent->datahas the same kind of visibility problem thatent->proc_fopsdoes.
Thanks Dave, I will check whether ->data also has the visibility problem.
Wang Chen said the following on 2008-2-29 13:26:
Quoted 25 lines
David Miller said the following on 2008-2-29 6:02:
Quoted 13 lines
From: Wang Chen <[email protected]>
Date: Thu, 28 Feb 2008 18:55:40 +0800Quoted 4 lines
Use
proc_create()to make sure that ->proc_fops be setup before gluing PDE to main tree.Signed-off-by Wang Chen <[email protected]>Applied.
Quoted 4 lines
net/sunrpc/stats.c +0
-0@@ -229,9 +229,8 @@ do_register(const char *name, void *data, const struct file_operations *fops)rpc_proc_init ();dprintk ("RPC: registering /proc/net/rpc/%s\n" , name);Quoted 10 lines
net/sunrpc/stats.c do_register(const char *name, void *data, const struct file_operations *fops) · line 236
Quoted 7 lines
net/sunrpc/stats.c +1
-2- ent =create_proc_entry (name,0 , proc_net_rpc); + ent =proc_create (name,0 , proc_net_rpc, fops);if (ent) { - ent->proc_fops = fops; ent->data = data; }return ent;For this case it appears that
ent->datahas the same kind of visibility problem thatent->proc_fopsdoes.
Quoted 2 lines
Thanks Dave, I will check whether ->data also has the visibility problem.
I have looked at the proc_create().
The reason for why we need to setup pde->proc_fops in proc_create() before the pde be visible, is that proc_fops will be setuped in proc_register() and and NULL of proc_fops will make proc_register() give pde an improper fops.
But, ->data and ->owner will not be affected by this instance. So, it's safe to setup ->data and ->owner after visibility of pde.
Quoted 29 lines · Wang Chen
Wang Chen said the following on 2008-2-29 13:26:
Quoted 25 lines
David Miller said the following on 2008-2-29 6:02:
Quoted 13 lines
From: Wang Chen <[email protected]>
Date: Thu, 28 Feb 2008 18:55:40 +0800Quoted 4 lines
Use
proc_create()to make sure that ->proc_fops be setup before gluing PDE to main tree.Signed-off-by Wang Chen <[email protected]>Applied.
Quoted 4 lines
net/sunrpc/stats.c +0
-0@@ -229,9 +229,8 @@ do_register(const char *name, void *data, const struct file_operations *fops)rpc_proc_init ();dprintk ("RPC: registering /proc/net/rpc/%s\n" , name);Quoted 10 lines
net/sunrpc/stats.c do_register(const char *name, void *data, const struct file_operations *fops) · line 236
Quoted 7 lines
net/sunrpc/stats.c +1
-2- ent =create_proc_entry (name,0 , proc_net_rpc); + ent =proc_create (name,0 , proc_net_rpc, fops);if (ent) { - ent->proc_fops = fops; ent->data = data; }return ent;For this case it appears that
ent->datahas the same kind of visibility problem thatent->proc_fopsdoes.Quoted 2 lines
Thanks Dave, I will check whether ->data also has the visibility problem.
Quoted 7 lines
I have looked at the
proc_create().
The reason for why we need to setuppde->proc_fopsinproc_create()before the pde be visible, is thatproc_fopswill be setuped inproc_register()and and NULL ofproc_fopswill makeproc_register()give pde an improper fops.But, ->data and ->owner will not be affected by this instance. So, it's safe to setup ->data and ->owner after visibility of pde.
->owner is buggy, believed to be unnecessary and will thus die so don't bother with it. ;-)
->data looks safe to setup separately while module is loading:
before ->data will be used by code which is unprepared to it being NULL, VFS will pin module, which can't be done during module load.
I think the existence of proc_create_data() depends entirely on cases which do all the above from code that is not module_init hook. Does anyone know some?