diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-16 23:54:47 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-17 12:25:58 -0400 |
| commit | c0ef65d2928249e822b813beb41b6c1478c556ab (patch) | |
| tree | 5b828baa9a46874707281fab5f78f7d159f41d66 | |
| parent | 23ac7cba73bb2c6e80f9cdebeb39dc3dad34ebb3 (diff) | |
ufs_iget(): fail with -ESTALE on deleted inode
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| -rw-r--r-- | fs/ufs/inode.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 7b1b810a8ab1..f36d6a53687d 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
| @@ -566,10 +566,8 @@ static int ufs1_read_inode(struct inode *inode, struct ufs_inode *ufs_inode) | |||
| 566 | */ | 566 | */ |
| 567 | inode->i_mode = mode = fs16_to_cpu(sb, ufs_inode->ui_mode); | 567 | inode->i_mode = mode = fs16_to_cpu(sb, ufs_inode->ui_mode); |
| 568 | set_nlink(inode, fs16_to_cpu(sb, ufs_inode->ui_nlink)); | 568 | set_nlink(inode, fs16_to_cpu(sb, ufs_inode->ui_nlink)); |
| 569 | if (inode->i_nlink == 0) { | 569 | if (inode->i_nlink == 0) |
| 570 | ufs_error (sb, "ufs_read_inode", "inode %lu has zero nlink\n", inode->i_ino); | 570 | return -ESTALE; |
| 571 | return -1; | ||
| 572 | } | ||
| 573 | 571 | ||
| 574 | /* | 572 | /* |
| 575 | * Linux now has 32-bit uid and gid, so we can support EFT. | 573 | * Linux now has 32-bit uid and gid, so we can support EFT. |
| @@ -614,10 +612,8 @@ static int ufs2_read_inode(struct inode *inode, struct ufs2_inode *ufs2_inode) | |||
| 614 | */ | 612 | */ |
| 615 | inode->i_mode = mode = fs16_to_cpu(sb, ufs2_inode->ui_mode); | 613 | inode->i_mode = mode = fs16_to_cpu(sb, ufs2_inode->ui_mode); |
| 616 | set_nlink(inode, fs16_to_cpu(sb, ufs2_inode->ui_nlink)); | 614 | set_nlink(inode, fs16_to_cpu(sb, ufs2_inode->ui_nlink)); |
| 617 | if (inode->i_nlink == 0) { | 615 | if (inode->i_nlink == 0) |
| 618 | ufs_error (sb, "ufs_read_inode", "inode %lu has zero nlink\n", inode->i_ino); | 616 | return -ESTALE; |
| 619 | return -1; | ||
| 620 | } | ||
| 621 | 617 | ||
| 622 | /* | 618 | /* |
| 623 | * Linux now has 32-bit uid and gid, so we can support EFT. | 619 | * Linux now has 32-bit uid and gid, so we can support EFT. |
| @@ -657,7 +653,7 @@ struct inode *ufs_iget(struct super_block *sb, unsigned long ino) | |||
| 657 | struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; | 653 | struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; |
| 658 | struct buffer_head * bh; | 654 | struct buffer_head * bh; |
| 659 | struct inode *inode; | 655 | struct inode *inode; |
| 660 | int err; | 656 | int err = -EIO; |
| 661 | 657 | ||
| 662 | UFSD("ENTER, ino %lu\n", ino); | 658 | UFSD("ENTER, ino %lu\n", ino); |
| 663 | 659 | ||
| @@ -692,9 +688,10 @@ struct inode *ufs_iget(struct super_block *sb, unsigned long ino) | |||
| 692 | err = ufs1_read_inode(inode, | 688 | err = ufs1_read_inode(inode, |
| 693 | ufs_inode + ufs_inotofsbo(inode->i_ino)); | 689 | ufs_inode + ufs_inotofsbo(inode->i_ino)); |
| 694 | } | 690 | } |
| 695 | 691 | brelse(bh); | |
| 696 | if (err) | 692 | if (err) |
| 697 | goto bad_inode; | 693 | goto bad_inode; |
| 694 | |||
| 698 | inode->i_version++; | 695 | inode->i_version++; |
| 699 | ufsi->i_lastfrag = | 696 | ufsi->i_lastfrag = |
| 700 | (inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift; | 697 | (inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift; |
| @@ -703,15 +700,13 @@ struct inode *ufs_iget(struct super_block *sb, unsigned long ino) | |||
| 703 | 700 | ||
| 704 | ufs_set_inode_ops(inode); | 701 | ufs_set_inode_ops(inode); |
| 705 | 702 | ||
| 706 | brelse(bh); | ||
| 707 | |||
| 708 | UFSD("EXIT\n"); | 703 | UFSD("EXIT\n"); |
| 709 | unlock_new_inode(inode); | 704 | unlock_new_inode(inode); |
| 710 | return inode; | 705 | return inode; |
| 711 | 706 | ||
| 712 | bad_inode: | 707 | bad_inode: |
| 713 | iget_failed(inode); | 708 | iget_failed(inode); |
| 714 | return ERR_PTR(-EIO); | 709 | return ERR_PTR(err); |
| 715 | } | 710 | } |
| 716 | 711 | ||
| 717 | static void ufs1_update_inode(struct inode *inode, struct ufs_inode *ufs_inode) | 712 | static void ufs1_update_inode(struct inode *inode, struct ufs_inode *ufs_inode) |
