diff options
Diffstat (limited to 'fs/ufs/inode.c')
-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) |