diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-01-25 20:11:22 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-02-26 02:46:14 -0500 |
commit | d3d009cb965eae7e002ea5badf603ea8f4c34915 (patch) | |
tree | 624a97e06717507d4246da2369b684d4ebd6e0a9 | |
parent | 87e0aab37ff6c4284810a48d6034314fbf4eb319 (diff) |
saner proc_get_inode() calling conventions
Make it drop the pde in *all* cases when no new reference to it is
put into an inode - both when an inode had already been set up
(as we were already doing) and when inode allocation has failed.
Makes for simpler logics in callers...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/proc/generic.c | 21 | ||||
-rw-r--r-- | fs/proc/inode.c | 10 |
2 files changed, 10 insertions, 21 deletions
diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 7dfe548a28e8..2983dc52ca25 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c | |||
@@ -412,8 +412,7 @@ static const struct dentry_operations proc_dentry_operations = | |||
412 | struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir, | 412 | struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir, |
413 | struct dentry *dentry) | 413 | struct dentry *dentry) |
414 | { | 414 | { |
415 | struct inode *inode = NULL; | 415 | struct inode *inode; |
416 | int error = -ENOENT; | ||
417 | 416 | ||
418 | spin_lock(&proc_subdir_lock); | 417 | spin_lock(&proc_subdir_lock); |
419 | for (de = de->subdir; de ; de = de->next) { | 418 | for (de = de->subdir; de ; de = de->next) { |
@@ -422,22 +421,16 @@ struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir, | |||
422 | if (!memcmp(dentry->d_name.name, de->name, de->namelen)) { | 421 | if (!memcmp(dentry->d_name.name, de->name, de->namelen)) { |
423 | pde_get(de); | 422 | pde_get(de); |
424 | spin_unlock(&proc_subdir_lock); | 423 | spin_unlock(&proc_subdir_lock); |
425 | error = -ENOMEM; | ||
426 | inode = proc_get_inode(dir->i_sb, de); | 424 | inode = proc_get_inode(dir->i_sb, de); |
427 | goto out_unlock; | 425 | if (!inode) |
426 | return ERR_PTR(-ENOMEM); | ||
427 | d_set_d_op(dentry, &proc_dentry_operations); | ||
428 | d_add(dentry, inode); | ||
429 | return NULL; | ||
428 | } | 430 | } |
429 | } | 431 | } |
430 | spin_unlock(&proc_subdir_lock); | 432 | spin_unlock(&proc_subdir_lock); |
431 | out_unlock: | 433 | return ERR_PTR(-ENOENT); |
432 | |||
433 | if (inode) { | ||
434 | d_set_d_op(dentry, &proc_dentry_operations); | ||
435 | d_add(dentry, inode); | ||
436 | return NULL; | ||
437 | } | ||
438 | if (de) | ||
439 | pde_put(de); | ||
440 | return ERR_PTR(error); | ||
441 | } | 434 | } |
442 | 435 | ||
443 | struct dentry *proc_lookup(struct inode *dir, struct dentry *dentry, | 436 | struct dentry *proc_lookup(struct inode *dir, struct dentry *dentry, |
diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 98a7d2870bef..70322e1a4f0f 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c | |||
@@ -445,12 +445,9 @@ static const struct file_operations proc_reg_file_ops_no_compat = { | |||
445 | 445 | ||
446 | struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de) | 446 | struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de) |
447 | { | 447 | { |
448 | struct inode * inode; | 448 | struct inode *inode = iget_locked(sb, de->low_ino); |
449 | 449 | ||
450 | inode = iget_locked(sb, de->low_ino); | 450 | if (inode && (inode->i_state & I_NEW)) { |
451 | if (!inode) | ||
452 | return NULL; | ||
453 | if (inode->i_state & I_NEW) { | ||
454 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 451 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
455 | PROC_I(inode)->pde = de; | 452 | PROC_I(inode)->pde = de; |
456 | 453 | ||
@@ -482,7 +479,7 @@ struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de) | |||
482 | } else | 479 | } else |
483 | pde_put(de); | 480 | pde_put(de); |
484 | return inode; | 481 | return inode; |
485 | } | 482 | } |
486 | 483 | ||
487 | int proc_fill_super(struct super_block *s) | 484 | int proc_fill_super(struct super_block *s) |
488 | { | 485 | { |
@@ -499,7 +496,6 @@ int proc_fill_super(struct super_block *s) | |||
499 | root_inode = proc_get_inode(s, &proc_root); | 496 | root_inode = proc_get_inode(s, &proc_root); |
500 | if (!root_inode) { | 497 | if (!root_inode) { |
501 | printk(KERN_ERR "proc_fill_super: get root inode failed\n"); | 498 | printk(KERN_ERR "proc_fill_super: get root inode failed\n"); |
502 | pde_put(&proc_root); | ||
503 | return -ENOMEM; | 499 | return -ENOMEM; |
504 | } | 500 | } |
505 | 501 | ||