Commit d3d009cb965eae7e002ea5badf603ea8f4c34915
1 parent
87e0aab37f
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
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
fs/proc/generic.c
... | ... | @@ -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, |
fs/proc/inode.c
... | ... | @@ -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 |