diff options
| -rw-r--r-- | fs/ufs/inode.c | 111 |
1 files changed, 57 insertions, 54 deletions
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index f2dbdf5a8769..259bd196099d 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
| @@ -605,39 +605,12 @@ static void ufs_set_inode_ops(struct inode *inode) | |||
| 605 | ufs_get_inode_dev(inode->i_sb, UFS_I(inode))); | 605 | ufs_get_inode_dev(inode->i_sb, UFS_I(inode))); |
| 606 | } | 606 | } |
| 607 | 607 | ||
| 608 | void ufs_read_inode (struct inode * inode) | 608 | static void ufs1_read_inode(struct inode *inode, struct ufs_inode *ufs_inode) |
| 609 | { | 609 | { |
| 610 | struct ufs_inode_info *ufsi = UFS_I(inode); | 610 | struct ufs_inode_info *ufsi = UFS_I(inode); |
| 611 | struct super_block * sb; | 611 | struct super_block *sb = inode->i_sb; |
| 612 | struct ufs_sb_private_info * uspi; | ||
| 613 | struct ufs_inode * ufs_inode; | ||
| 614 | struct ufs2_inode *ufs2_inode; | ||
| 615 | struct buffer_head * bh; | ||
| 616 | mode_t mode; | 612 | mode_t mode; |
| 617 | unsigned i; | 613 | unsigned i; |
| 618 | unsigned flags; | ||
| 619 | |||
| 620 | UFSD("ENTER, ino %lu\n", inode->i_ino); | ||
| 621 | |||
| 622 | sb = inode->i_sb; | ||
| 623 | uspi = UFS_SB(sb)->s_uspi; | ||
| 624 | flags = UFS_SB(sb)->s_flags; | ||
| 625 | |||
| 626 | if (inode->i_ino < UFS_ROOTINO || | ||
| 627 | inode->i_ino > (uspi->s_ncg * uspi->s_ipg)) { | ||
| 628 | ufs_warning (sb, "ufs_read_inode", "bad inode number (%lu)\n", inode->i_ino); | ||
| 629 | goto bad_inode; | ||
| 630 | } | ||
| 631 | |||
| 632 | bh = sb_bread(sb, uspi->s_sbbase + ufs_inotofsba(inode->i_ino)); | ||
| 633 | if (!bh) { | ||
| 634 | ufs_warning (sb, "ufs_read_inode", "unable to read inode %lu\n", inode->i_ino); | ||
| 635 | goto bad_inode; | ||
| 636 | } | ||
| 637 | if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) | ||
| 638 | goto ufs2_inode; | ||
| 639 | |||
| 640 | ufs_inode = (struct ufs_inode *) (bh->b_data + sizeof(struct ufs_inode) * ufs_inotofsbo(inode->i_ino)); | ||
| 641 | 614 | ||
| 642 | /* | 615 | /* |
| 643 | * Copy data to the in-core inode. | 616 | * Copy data to the in-core inode. |
| @@ -661,14 +634,11 @@ void ufs_read_inode (struct inode * inode) | |||
| 661 | inode->i_atime.tv_nsec = 0; | 634 | inode->i_atime.tv_nsec = 0; |
| 662 | inode->i_ctime.tv_nsec = 0; | 635 | inode->i_ctime.tv_nsec = 0; |
| 663 | inode->i_blocks = fs32_to_cpu(sb, ufs_inode->ui_blocks); | 636 | inode->i_blocks = fs32_to_cpu(sb, ufs_inode->ui_blocks); |
| 664 | inode->i_blksize = PAGE_SIZE; /* This is the optimal IO size (for stat) */ | ||
| 665 | inode->i_version++; | ||
| 666 | ufsi->i_flags = fs32_to_cpu(sb, ufs_inode->ui_flags); | 637 | ufsi->i_flags = fs32_to_cpu(sb, ufs_inode->ui_flags); |
| 667 | ufsi->i_gen = fs32_to_cpu(sb, ufs_inode->ui_gen); | 638 | ufsi->i_gen = fs32_to_cpu(sb, ufs_inode->ui_gen); |
| 668 | ufsi->i_shadow = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_shadow); | 639 | ufsi->i_shadow = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_shadow); |
| 669 | ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag); | 640 | ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag); |
| 670 | ufsi->i_lastfrag = (inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift; | 641 | |
| 671 | ufsi->i_dir_start_lookup = 0; | ||
| 672 | 642 | ||
| 673 | if (S_ISCHR(mode) || S_ISBLK(mode) || inode->i_blocks) { | 643 | if (S_ISCHR(mode) || S_ISBLK(mode) || inode->i_blocks) { |
| 674 | for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++) | 644 | for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++) |
| @@ -677,24 +647,16 @@ void ufs_read_inode (struct inode * inode) | |||
| 677 | for (i = 0; i < (UFS_NDADDR + UFS_NINDIR) * 4; i++) | 647 | for (i = 0; i < (UFS_NDADDR + UFS_NINDIR) * 4; i++) |
| 678 | ufsi->i_u1.i_symlink[i] = ufs_inode->ui_u2.ui_symlink[i]; | 648 | ufsi->i_u1.i_symlink[i] = ufs_inode->ui_u2.ui_symlink[i]; |
| 679 | } | 649 | } |
| 680 | ufsi->i_osync = 0; | 650 | } |
| 681 | |||
| 682 | ufs_set_inode_ops(inode); | ||
| 683 | |||
| 684 | brelse (bh); | ||
| 685 | |||
| 686 | UFSD("EXIT\n"); | ||
| 687 | return; | ||
| 688 | 651 | ||
| 689 | bad_inode: | 652 | static void ufs2_read_inode(struct inode *inode, struct ufs2_inode *ufs2_inode) |
| 690 | make_bad_inode(inode); | 653 | { |
| 691 | return; | 654 | struct ufs_inode_info *ufsi = UFS_I(inode); |
| 655 | struct super_block *sb = inode->i_sb; | ||
| 656 | mode_t mode; | ||
| 657 | unsigned i; | ||
| 692 | 658 | ||
| 693 | ufs2_inode : | ||
| 694 | UFSD("Reading ufs2 inode, ino %lu\n", inode->i_ino); | 659 | UFSD("Reading ufs2 inode, ino %lu\n", inode->i_ino); |
| 695 | |||
| 696 | ufs2_inode = (struct ufs2_inode *)(bh->b_data + sizeof(struct ufs2_inode) * ufs_inotofsbo(inode->i_ino)); | ||
| 697 | |||
| 698 | /* | 660 | /* |
| 699 | * Copy data to the in-core inode. | 661 | * Copy data to the in-core inode. |
| 700 | */ | 662 | */ |
| @@ -717,26 +679,64 @@ ufs2_inode : | |||
| 717 | inode->i_atime.tv_nsec = 0; | 679 | inode->i_atime.tv_nsec = 0; |
| 718 | inode->i_ctime.tv_nsec = 0; | 680 | inode->i_ctime.tv_nsec = 0; |
| 719 | inode->i_blocks = fs64_to_cpu(sb, ufs2_inode->ui_blocks); | 681 | inode->i_blocks = fs64_to_cpu(sb, ufs2_inode->ui_blocks); |
| 720 | inode->i_blksize = PAGE_SIZE; /*This is the optimal IO size(for stat)*/ | ||
| 721 | |||
| 722 | inode->i_version++; | ||
| 723 | ufsi->i_flags = fs32_to_cpu(sb, ufs2_inode->ui_flags); | 682 | ufsi->i_flags = fs32_to_cpu(sb, ufs2_inode->ui_flags); |
| 724 | ufsi->i_gen = fs32_to_cpu(sb, ufs2_inode->ui_gen); | 683 | ufsi->i_gen = fs32_to_cpu(sb, ufs2_inode->ui_gen); |
| 725 | /* | 684 | /* |
| 726 | ufsi->i_shadow = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_shadow); | 685 | ufsi->i_shadow = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_shadow); |
| 727 | ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag); | 686 | ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag); |
| 728 | */ | 687 | */ |
| 729 | ufsi->i_lastfrag= (inode->i_size + uspi->s_fsize- 1) >> uspi->s_fshift; | ||
| 730 | 688 | ||
| 731 | if (S_ISCHR(mode) || S_ISBLK(mode) || inode->i_blocks) { | 689 | if (S_ISCHR(mode) || S_ISBLK(mode) || inode->i_blocks) { |
| 732 | for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++) | 690 | for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++) |
| 733 | ufsi->i_u1.u2_i_data[i] = | 691 | ufsi->i_u1.u2_i_data[i] = |
| 734 | ufs2_inode->ui_u2.ui_addr.ui_db[i]; | 692 | ufs2_inode->ui_u2.ui_addr.ui_db[i]; |
| 735 | } | 693 | } else { |
| 736 | else { | ||
| 737 | for (i = 0; i < (UFS_NDADDR + UFS_NINDIR) * 4; i++) | 694 | for (i = 0; i < (UFS_NDADDR + UFS_NINDIR) * 4; i++) |
| 738 | ufsi->i_u1.i_symlink[i] = ufs2_inode->ui_u2.ui_symlink[i]; | 695 | ufsi->i_u1.i_symlink[i] = ufs2_inode->ui_u2.ui_symlink[i]; |
| 739 | } | 696 | } |
| 697 | } | ||
| 698 | |||
| 699 | void ufs_read_inode(struct inode * inode) | ||
| 700 | { | ||
| 701 | struct ufs_inode_info *ufsi = UFS_I(inode); | ||
| 702 | struct super_block * sb; | ||
| 703 | struct ufs_sb_private_info * uspi; | ||
| 704 | struct buffer_head * bh; | ||
| 705 | |||
| 706 | UFSD("ENTER, ino %lu\n", inode->i_ino); | ||
| 707 | |||
| 708 | sb = inode->i_sb; | ||
| 709 | uspi = UFS_SB(sb)->s_uspi; | ||
| 710 | |||
| 711 | if (inode->i_ino < UFS_ROOTINO || | ||
| 712 | inode->i_ino > (uspi->s_ncg * uspi->s_ipg)) { | ||
| 713 | ufs_warning(sb, "ufs_read_inode", "bad inode number (%lu)\n", | ||
| 714 | inode->i_ino); | ||
| 715 | goto bad_inode; | ||
| 716 | } | ||
| 717 | |||
| 718 | bh = sb_bread(sb, uspi->s_sbbase + ufs_inotofsba(inode->i_ino)); | ||
| 719 | if (!bh) { | ||
| 720 | ufs_warning(sb, "ufs_read_inode", "unable to read inode %lu\n", | ||
| 721 | inode->i_ino); | ||
| 722 | goto bad_inode; | ||
| 723 | } | ||
| 724 | if ((UFS_SB(sb)->s_flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) { | ||
| 725 | struct ufs2_inode *ufs2_inode = (struct ufs2_inode *)bh->b_data; | ||
| 726 | |||
| 727 | ufs2_read_inode(inode, | ||
| 728 | ufs2_inode + ufs_inotofsbo(inode->i_ino)); | ||
| 729 | } else { | ||
| 730 | struct ufs_inode *ufs_inode = (struct ufs_inode *)bh->b_data; | ||
| 731 | |||
| 732 | ufs1_read_inode(inode, ufs_inode + ufs_inotofsbo(inode->i_ino)); | ||
| 733 | } | ||
| 734 | |||
| 735 | inode->i_blksize = PAGE_SIZE;/*This is the optimal IO size (for stat)*/ | ||
| 736 | inode->i_version++; | ||
| 737 | ufsi->i_lastfrag = | ||
| 738 | (inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift; | ||
| 739 | ufsi->i_dir_start_lookup = 0; | ||
| 740 | ufsi->i_osync = 0; | 740 | ufsi->i_osync = 0; |
| 741 | 741 | ||
| 742 | ufs_set_inode_ops(inode); | 742 | ufs_set_inode_ops(inode); |
| @@ -745,6 +745,9 @@ ufs2_inode : | |||
| 745 | 745 | ||
| 746 | UFSD("EXIT\n"); | 746 | UFSD("EXIT\n"); |
| 747 | return; | 747 | return; |
| 748 | |||
| 749 | bad_inode: | ||
| 750 | make_bad_inode(inode); | ||
| 748 | } | 751 | } |
| 749 | 752 | ||
| 750 | static int ufs_update_inode(struct inode * inode, int do_sync) | 753 | static int ufs_update_inode(struct inode * inode, int do_sync) |
