Commit d3d009cb965eae7e002ea5badf603ea8f4c34915

Authored by Al Viro
1 parent 87e0aab37f

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>

Showing 2 changed files with 10 additions and 21 deletions Side-by-side Diff

... ... @@ -412,8 +412,7 @@
412 412 struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir,
413 413 struct dentry *dentry)
414 414 {
415   - struct inode *inode = NULL;
416   - int error = -ENOENT;
  415 + struct inode *inode;
417 416  
418 417 spin_lock(&proc_subdir_lock);
419 418 for (de = de->subdir; de ; de = de->next) {
420 419  
421 420  
... ... @@ -422,22 +421,16 @@
422 421 if (!memcmp(dentry->d_name.name, de->name, de->namelen)) {
423 422 pde_get(de);
424 423 spin_unlock(&proc_subdir_lock);
425   - error = -ENOMEM;
426 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 432 spin_unlock(&proc_subdir_lock);
431   -out_unlock:
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);
  433 + return ERR_PTR(-ENOENT);
441 434 }
442 435  
443 436 struct dentry *proc_lookup(struct inode *dir, struct dentry *dentry,
... ... @@ -445,12 +445,9 @@
445 445  
446 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);
451   - if (!inode)
452   - return NULL;
453   - if (inode->i_state & I_NEW) {
  450 + if (inode && (inode->i_state & I_NEW)) {
454 451 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
455 452 PROC_I(inode)->pde = de;
456 453  
... ... @@ -482,7 +479,7 @@
482 479 } else
483 480 pde_put(de);
484 481 return inode;
485   -}
  482 +}
486 483  
487 484 int proc_fill_super(struct super_block *s)
488 485 {
... ... @@ -499,7 +496,6 @@
499 496 root_inode = proc_get_inode(s, &proc_root);
500 497 if (!root_inode) {
501 498 printk(KERN_ERR "proc_fill_super: get root inode failed\n");
502   - pde_put(&proc_root);
503 499 return -ENOMEM;
504 500 }
505 501