diff options
Diffstat (limited to 'fs/ufs/super.c')
-rw-r--r-- | fs/ufs/super.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index c5bdea7c23a9..87f6b51a895d 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c | |||
@@ -286,7 +286,7 @@ void ufs_warning (struct super_block * sb, const char * function, | |||
286 | } | 286 | } |
287 | 287 | ||
288 | enum { | 288 | enum { |
289 | Opt_type_old, Opt_type_sunx86, Opt_type_sun, Opt_type_44bsd, | 289 | Opt_type_old, Opt_type_sunx86, Opt_type_sun, Opt_type_sunos, Opt_type_44bsd, |
290 | Opt_type_ufs2, Opt_type_hp, Opt_type_nextstepcd, Opt_type_nextstep, | 290 | Opt_type_ufs2, Opt_type_hp, Opt_type_nextstepcd, Opt_type_nextstep, |
291 | Opt_type_openstep, Opt_onerror_panic, Opt_onerror_lock, | 291 | Opt_type_openstep, Opt_onerror_panic, Opt_onerror_lock, |
292 | Opt_onerror_umount, Opt_onerror_repair, Opt_err | 292 | Opt_onerror_umount, Opt_onerror_repair, Opt_err |
@@ -296,6 +296,7 @@ static match_table_t tokens = { | |||
296 | {Opt_type_old, "ufstype=old"}, | 296 | {Opt_type_old, "ufstype=old"}, |
297 | {Opt_type_sunx86, "ufstype=sunx86"}, | 297 | {Opt_type_sunx86, "ufstype=sunx86"}, |
298 | {Opt_type_sun, "ufstype=sun"}, | 298 | {Opt_type_sun, "ufstype=sun"}, |
299 | {Opt_type_sunos, "ufstype=sunos"}, | ||
299 | {Opt_type_44bsd, "ufstype=44bsd"}, | 300 | {Opt_type_44bsd, "ufstype=44bsd"}, |
300 | {Opt_type_ufs2, "ufstype=ufs2"}, | 301 | {Opt_type_ufs2, "ufstype=ufs2"}, |
301 | {Opt_type_ufs2, "ufstype=5xbsd"}, | 302 | {Opt_type_ufs2, "ufstype=5xbsd"}, |
@@ -339,6 +340,10 @@ static int ufs_parse_options (char * options, unsigned * mount_options) | |||
339 | ufs_clear_opt (*mount_options, UFSTYPE); | 340 | ufs_clear_opt (*mount_options, UFSTYPE); |
340 | ufs_set_opt (*mount_options, UFSTYPE_SUN); | 341 | ufs_set_opt (*mount_options, UFSTYPE_SUN); |
341 | break; | 342 | break; |
343 | case Opt_type_sunos: | ||
344 | ufs_clear_opt(*mount_options, UFSTYPE); | ||
345 | ufs_set_opt(*mount_options, UFSTYPE_SUNOS); | ||
346 | break; | ||
342 | case Opt_type_44bsd: | 347 | case Opt_type_44bsd: |
343 | ufs_clear_opt (*mount_options, UFSTYPE); | 348 | ufs_clear_opt (*mount_options, UFSTYPE); |
344 | ufs_set_opt (*mount_options, UFSTYPE_44BSD); | 349 | ufs_set_opt (*mount_options, UFSTYPE_44BSD); |
@@ -654,8 +659,8 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) | |||
654 | ufs_set_opt (sbi->s_mount_opt, UFSTYPE_OLD); | 659 | ufs_set_opt (sbi->s_mount_opt, UFSTYPE_OLD); |
655 | } | 660 | } |
656 | 661 | ||
657 | sbi->s_uspi = uspi = | 662 | uspi = kzalloc(sizeof(struct ufs_sb_private_info), GFP_KERNEL); |
658 | kmalloc (sizeof(struct ufs_sb_private_info), GFP_KERNEL); | 663 | sbi->s_uspi = uspi; |
659 | if (!uspi) | 664 | if (!uspi) |
660 | goto failed; | 665 | goto failed; |
661 | uspi->s_dirblksize = UFS_SECTOR_SIZE; | 666 | uspi->s_dirblksize = UFS_SECTOR_SIZE; |
@@ -692,10 +697,22 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) | |||
692 | uspi->s_fshift = 10; | 697 | uspi->s_fshift = 10; |
693 | uspi->s_sbsize = super_block_size = 2048; | 698 | uspi->s_sbsize = super_block_size = 2048; |
694 | uspi->s_sbbase = 0; | 699 | uspi->s_sbbase = 0; |
695 | uspi->s_maxsymlinklen = 56; | 700 | uspi->s_maxsymlinklen = 0; /* Not supported on disk */ |
696 | flags |= UFS_DE_OLD | UFS_UID_EFT | UFS_ST_SUN | UFS_CG_SUN; | 701 | flags |= UFS_DE_OLD | UFS_UID_EFT | UFS_ST_SUN | UFS_CG_SUN; |
697 | break; | 702 | break; |
698 | 703 | ||
704 | case UFS_MOUNT_UFSTYPE_SUNOS: | ||
705 | UFSD(("ufstype=sunos\n")) | ||
706 | uspi->s_fsize = block_size = 1024; | ||
707 | uspi->s_fmask = ~(1024 - 1); | ||
708 | uspi->s_fshift = 10; | ||
709 | uspi->s_sbsize = 2048; | ||
710 | super_block_size = 2048; | ||
711 | uspi->s_sbbase = 0; | ||
712 | uspi->s_maxsymlinklen = 0; /* Not supported on disk */ | ||
713 | flags |= UFS_DE_OLD | UFS_UID_OLD | UFS_ST_SUNOS | UFS_CG_SUN; | ||
714 | break; | ||
715 | |||
699 | case UFS_MOUNT_UFSTYPE_SUNx86: | 716 | case UFS_MOUNT_UFSTYPE_SUNx86: |
700 | UFSD("ufstype=sunx86\n"); | 717 | UFSD("ufstype=sunx86\n"); |
701 | uspi->s_fsize = block_size = 1024; | 718 | uspi->s_fsize = block_size = 1024; |
@@ -703,7 +720,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) | |||
703 | uspi->s_fshift = 10; | 720 | uspi->s_fshift = 10; |
704 | uspi->s_sbsize = super_block_size = 2048; | 721 | uspi->s_sbsize = super_block_size = 2048; |
705 | uspi->s_sbbase = 0; | 722 | uspi->s_sbbase = 0; |
706 | uspi->s_maxsymlinklen = 56; | 723 | uspi->s_maxsymlinklen = 0; /* Not supported on disk */ |
707 | flags |= UFS_DE_OLD | UFS_UID_EFT | UFS_ST_SUNx86 | UFS_CG_SUN; | 724 | flags |= UFS_DE_OLD | UFS_UID_EFT | UFS_ST_SUNx86 | UFS_CG_SUN; |
708 | break; | 725 | break; |
709 | 726 | ||
@@ -805,11 +822,18 @@ again: | |||
805 | if (!ubh) | 822 | if (!ubh) |
806 | goto failed; | 823 | goto failed; |
807 | 824 | ||
808 | |||
809 | usb1 = ubh_get_usb_first(uspi); | 825 | usb1 = ubh_get_usb_first(uspi); |
810 | usb2 = ubh_get_usb_second(uspi); | 826 | usb2 = ubh_get_usb_second(uspi); |
811 | usb3 = ubh_get_usb_third(uspi); | 827 | usb3 = ubh_get_usb_third(uspi); |
812 | 828 | ||
829 | /* Sort out mod used on SunOS 4.1.3 for fs_state */ | ||
830 | uspi->s_postblformat = fs32_to_cpu(sb, usb3->fs_postblformat); | ||
831 | if (((flags & UFS_ST_MASK) == UFS_ST_SUNOS) && | ||
832 | (uspi->s_postblformat != UFS_42POSTBLFMT)) { | ||
833 | flags &= ~UFS_ST_MASK; | ||
834 | flags |= UFS_ST_SUN; | ||
835 | } | ||
836 | |||
813 | /* | 837 | /* |
814 | * Check ufs magic number | 838 | * Check ufs magic number |
815 | */ | 839 | */ |
@@ -904,6 +928,7 @@ magic_found: | |||
904 | if (((flags & UFS_ST_MASK) == UFS_ST_44BSD) || | 928 | if (((flags & UFS_ST_MASK) == UFS_ST_44BSD) || |
905 | ((flags & UFS_ST_MASK) == UFS_ST_OLD) || | 929 | ((flags & UFS_ST_MASK) == UFS_ST_OLD) || |
906 | (((flags & UFS_ST_MASK) == UFS_ST_SUN || | 930 | (((flags & UFS_ST_MASK) == UFS_ST_SUN || |
931 | (flags & UFS_ST_MASK) == UFS_ST_SUNOS || | ||
907 | (flags & UFS_ST_MASK) == UFS_ST_SUNx86) && | 932 | (flags & UFS_ST_MASK) == UFS_ST_SUNx86) && |
908 | (ufs_get_fs_state(sb, usb1, usb3) == (UFS_FSOK - fs32_to_cpu(sb, usb1->fs_time))))) { | 933 | (ufs_get_fs_state(sb, usb1, usb3) == (UFS_FSOK - fs32_to_cpu(sb, usb1->fs_time))))) { |
909 | switch(usb1->fs_clean) { | 934 | switch(usb1->fs_clean) { |
@@ -995,7 +1020,6 @@ magic_found: | |||
995 | uspi->s_contigsumsize = fs32_to_cpu(sb, usb3->fs_un2.fs_44.fs_contigsumsize); | 1020 | uspi->s_contigsumsize = fs32_to_cpu(sb, usb3->fs_un2.fs_44.fs_contigsumsize); |
996 | uspi->s_qbmask = ufs_get_fs_qbmask(sb, usb3); | 1021 | uspi->s_qbmask = ufs_get_fs_qbmask(sb, usb3); |
997 | uspi->s_qfmask = ufs_get_fs_qfmask(sb, usb3); | 1022 | uspi->s_qfmask = ufs_get_fs_qfmask(sb, usb3); |
998 | uspi->s_postblformat = fs32_to_cpu(sb, usb3->fs_postblformat); | ||
999 | uspi->s_nrpos = fs32_to_cpu(sb, usb3->fs_nrpos); | 1023 | uspi->s_nrpos = fs32_to_cpu(sb, usb3->fs_nrpos); |
1000 | uspi->s_postbloff = fs32_to_cpu(sb, usb3->fs_postbloff); | 1024 | uspi->s_postbloff = fs32_to_cpu(sb, usb3->fs_postbloff); |
1001 | uspi->s_rotbloff = fs32_to_cpu(sb, usb3->fs_rotbloff); | 1025 | uspi->s_rotbloff = fs32_to_cpu(sb, usb3->fs_rotbloff); |
@@ -1077,6 +1101,7 @@ static void ufs_write_super(struct super_block *sb) | |||
1077 | if (!(sb->s_flags & MS_RDONLY)) { | 1101 | if (!(sb->s_flags & MS_RDONLY)) { |
1078 | usb1->fs_time = cpu_to_fs32(sb, get_seconds()); | 1102 | usb1->fs_time = cpu_to_fs32(sb, get_seconds()); |
1079 | if ((flags & UFS_ST_MASK) == UFS_ST_SUN | 1103 | if ((flags & UFS_ST_MASK) == UFS_ST_SUN |
1104 | || (flags & UFS_ST_MASK) == UFS_ST_SUNOS | ||
1080 | || (flags & UFS_ST_MASK) == UFS_ST_SUNx86) | 1105 | || (flags & UFS_ST_MASK) == UFS_ST_SUNx86) |
1081 | ufs_set_fs_state(sb, usb1, usb3, | 1106 | ufs_set_fs_state(sb, usb1, usb3, |
1082 | UFS_FSOK - fs32_to_cpu(sb, usb1->fs_time)); | 1107 | UFS_FSOK - fs32_to_cpu(sb, usb1->fs_time)); |
@@ -1146,6 +1171,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1146 | ufs_put_super_internal(sb); | 1171 | ufs_put_super_internal(sb); |
1147 | usb1->fs_time = cpu_to_fs32(sb, get_seconds()); | 1172 | usb1->fs_time = cpu_to_fs32(sb, get_seconds()); |
1148 | if ((flags & UFS_ST_MASK) == UFS_ST_SUN | 1173 | if ((flags & UFS_ST_MASK) == UFS_ST_SUN |
1174 | || (flags & UFS_ST_MASK) == UFS_ST_SUNOS | ||
1149 | || (flags & UFS_ST_MASK) == UFS_ST_SUNx86) | 1175 | || (flags & UFS_ST_MASK) == UFS_ST_SUNx86) |
1150 | ufs_set_fs_state(sb, usb1, usb3, | 1176 | ufs_set_fs_state(sb, usb1, usb3, |
1151 | UFS_FSOK - fs32_to_cpu(sb, usb1->fs_time)); | 1177 | UFS_FSOK - fs32_to_cpu(sb, usb1->fs_time)); |
@@ -1162,6 +1188,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1162 | return -EINVAL; | 1188 | return -EINVAL; |
1163 | #else | 1189 | #else |
1164 | if (ufstype != UFS_MOUNT_UFSTYPE_SUN && | 1190 | if (ufstype != UFS_MOUNT_UFSTYPE_SUN && |
1191 | ufstype != UFS_MOUNT_UFSTYPE_SUNOS && | ||
1165 | ufstype != UFS_MOUNT_UFSTYPE_44BSD && | 1192 | ufstype != UFS_MOUNT_UFSTYPE_44BSD && |
1166 | ufstype != UFS_MOUNT_UFSTYPE_SUNx86 && | 1193 | ufstype != UFS_MOUNT_UFSTYPE_SUNx86 && |
1167 | ufstype != UFS_MOUNT_UFSTYPE_UFS2) { | 1194 | ufstype != UFS_MOUNT_UFSTYPE_UFS2) { |