ufs: fix logics in "ufs: make fsck -f happy"
Storing stats _only_ at new locations is wrong for UFS1; old locations should always be kept updated. The check for "has been converted to use of new locations" is also wrong - it should be "->fs_maxbsize is equal to ->fs_bsize". Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
67a70017fa
commit
96ecff1422
|
@ -480,7 +480,7 @@ static void ufs_setup_cstotal(struct super_block *sb)
|
||||||
usb3 = ubh_get_usb_third(uspi);
|
usb3 = ubh_get_usb_third(uspi);
|
||||||
|
|
||||||
if ((mtype == UFS_MOUNT_UFSTYPE_44BSD &&
|
if ((mtype == UFS_MOUNT_UFSTYPE_44BSD &&
|
||||||
(usb1->fs_flags & UFS_FLAGS_UPDATED)) ||
|
(usb2->fs_un.fs_u2.fs_maxbsize == usb1->fs_bsize)) ||
|
||||||
mtype == UFS_MOUNT_UFSTYPE_UFS2) {
|
mtype == UFS_MOUNT_UFSTYPE_UFS2) {
|
||||||
/*we have statistic in different place, then usual*/
|
/*we have statistic in different place, then usual*/
|
||||||
uspi->cs_total.cs_ndir = fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_ndir);
|
uspi->cs_total.cs_ndir = fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_ndir);
|
||||||
|
@ -596,9 +596,7 @@ static void ufs_put_cstotal(struct super_block *sb)
|
||||||
usb2 = ubh_get_usb_second(uspi);
|
usb2 = ubh_get_usb_second(uspi);
|
||||||
usb3 = ubh_get_usb_third(uspi);
|
usb3 = ubh_get_usb_third(uspi);
|
||||||
|
|
||||||
if ((mtype == UFS_MOUNT_UFSTYPE_44BSD &&
|
if (mtype == UFS_MOUNT_UFSTYPE_UFS2) {
|
||||||
(usb1->fs_flags & UFS_FLAGS_UPDATED)) ||
|
|
||||||
mtype == UFS_MOUNT_UFSTYPE_UFS2) {
|
|
||||||
/*we have statistic in different place, then usual*/
|
/*we have statistic in different place, then usual*/
|
||||||
usb2->fs_un.fs_u2.cs_ndir =
|
usb2->fs_un.fs_u2.cs_ndir =
|
||||||
cpu_to_fs64(sb, uspi->cs_total.cs_ndir);
|
cpu_to_fs64(sb, uspi->cs_total.cs_ndir);
|
||||||
|
@ -608,16 +606,26 @@ static void ufs_put_cstotal(struct super_block *sb)
|
||||||
cpu_to_fs64(sb, uspi->cs_total.cs_nifree);
|
cpu_to_fs64(sb, uspi->cs_total.cs_nifree);
|
||||||
usb3->fs_un1.fs_u2.cs_nffree =
|
usb3->fs_un1.fs_u2.cs_nffree =
|
||||||
cpu_to_fs64(sb, uspi->cs_total.cs_nffree);
|
cpu_to_fs64(sb, uspi->cs_total.cs_nffree);
|
||||||
} else {
|
goto out;
|
||||||
usb1->fs_cstotal.cs_ndir =
|
|
||||||
cpu_to_fs32(sb, uspi->cs_total.cs_ndir);
|
|
||||||
usb1->fs_cstotal.cs_nbfree =
|
|
||||||
cpu_to_fs32(sb, uspi->cs_total.cs_nbfree);
|
|
||||||
usb1->fs_cstotal.cs_nifree =
|
|
||||||
cpu_to_fs32(sb, uspi->cs_total.cs_nifree);
|
|
||||||
usb1->fs_cstotal.cs_nffree =
|
|
||||||
cpu_to_fs32(sb, uspi->cs_total.cs_nffree);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mtype == UFS_MOUNT_UFSTYPE_44BSD &&
|
||||||
|
(usb2->fs_un.fs_u2.fs_maxbsize == usb1->fs_bsize)) {
|
||||||
|
/* store stats in both old and new places */
|
||||||
|
usb2->fs_un.fs_u2.cs_ndir =
|
||||||
|
cpu_to_fs64(sb, uspi->cs_total.cs_ndir);
|
||||||
|
usb2->fs_un.fs_u2.cs_nbfree =
|
||||||
|
cpu_to_fs64(sb, uspi->cs_total.cs_nbfree);
|
||||||
|
usb3->fs_un1.fs_u2.cs_nifree =
|
||||||
|
cpu_to_fs64(sb, uspi->cs_total.cs_nifree);
|
||||||
|
usb3->fs_un1.fs_u2.cs_nffree =
|
||||||
|
cpu_to_fs64(sb, uspi->cs_total.cs_nffree);
|
||||||
|
}
|
||||||
|
usb1->fs_cstotal.cs_ndir = cpu_to_fs32(sb, uspi->cs_total.cs_ndir);
|
||||||
|
usb1->fs_cstotal.cs_nbfree = cpu_to_fs32(sb, uspi->cs_total.cs_nbfree);
|
||||||
|
usb1->fs_cstotal.cs_nifree = cpu_to_fs32(sb, uspi->cs_total.cs_nifree);
|
||||||
|
usb1->fs_cstotal.cs_nffree = cpu_to_fs32(sb, uspi->cs_total.cs_nffree);
|
||||||
|
out:
|
||||||
ubh_mark_buffer_dirty(USPI_UBH(uspi));
|
ubh_mark_buffer_dirty(USPI_UBH(uspi));
|
||||||
ufs_print_super_stuff(sb, usb1, usb2, usb3);
|
ufs_print_super_stuff(sb, usb1, usb2, usb3);
|
||||||
UFSD("EXIT\n");
|
UFSD("EXIT\n");
|
||||||
|
@ -997,6 +1005,13 @@ again:
|
||||||
flags |= UFS_ST_SUN;
|
flags |= UFS_ST_SUN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((flags & UFS_ST_MASK) == UFS_ST_44BSD &&
|
||||||
|
uspi->s_postblformat == UFS_42POSTBLFMT) {
|
||||||
|
if (!silent)
|
||||||
|
pr_err("this is not a 44bsd filesystem");
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check ufs magic number
|
* Check ufs magic number
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue