Re: [PATCH 1/3] proc: return -ENOMEM when inode allocation failed

From: Cong Wang
Date: Wed Sep 05 2012 - 03:15:56 EST


On 09/04/2012 05:22 PM, yan yan wrote:
2012/9/4 Cong Wang <xiyou.wangcong@xxxxxxxxx>:
On 09/03/2012 10:14 PM, yan wrote:

Signed-off-by: yan <clouds.yan@xxxxxxxxx>


Please provide a changelog to explain why we need this patch.

I think the title is self explained.


---
fs/proc/generic.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/proc/generic.c b/fs/proc/generic.c
index b3647fe..9e8f631 100644
--- a/fs/proc/generic.c
+++ b/fs/proc/generic.c
@@ -427,7 +427,7 @@ struct dentry *proc_lookup_de(struct proc_dir_entry
*de, struct inode *dir,
if (!memcmp(dentry->d_name.name, de->name, de->namelen)) {
pde_get(de);
spin_unlock(&proc_subdir_lock);
- error = -EINVAL;
+ error = -ENOMEM;


Why the !memcmp() case is related with ENOMEM ??

We are presetting 'error' here. The following proc_get_inode() will try
to get an inode, either from inode cache or allocate a new one (and fill it).

If we get a NULL inode, that means allocation failed. That's how
ENOMEM involved.

Then the following patch is probably better than yours:


diff --git a/fs/proc/generic.c b/fs/proc/generic.c
index b3647fe..6b22913 100644
--- a/fs/proc/generic.c
+++ b/fs/proc/generic.c
@@ -427,12 +427,16 @@ struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir,
if (!memcmp(dentry->d_name.name, de->name, de->namelen)) {
pde_get(de);
spin_unlock(&proc_subdir_lock);
- error = -EINVAL;
inode = proc_get_inode(dir->i_sb, de);
+ if (!inode) {
+ error = -ENOMEM;
+ goto out_put;
+ }
goto out_unlock;
}
}
spin_unlock(&proc_subdir_lock);
+
out_unlock:

if (inode) {
@@ -440,6 +444,8 @@ out_unlock:
d_add(dentry, inode);
return NULL;
}
+out_put:
+
if (de)
pde_put(de);
return ERR_PTR(error);


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/