Commit changes proposed in

http://mail-index.netbsd.org/tech-kern/2003/09/06/0001.html
http://mail-index.netbsd.org/tech-kern/2003/09/06/0006.html
to avoid compat problems with old ffsv1 by reuse of the old FS_SWAPPED
value for FS_FLAGS_UPDATED, and use of new, larger fields:
- Don't use FS_FLAGS_UPDATED to see if we need to update new fields from
  old fields in ffsv1 case.
- when writing back the superblock, copy back the flags to the old location
  if only old flags are set (FS_FLAGS_UPDATED won't be set in this case)
  in ffsv1 case.
This commit is contained in:
bouyer 2003-09-13 13:47:04 +00:00
parent cfb7a98211
commit 5e33ea894e
1 changed files with 29 additions and 29 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: ffs_vfsops.c,v 1.119 2003/08/07 16:34:31 agc Exp $ */
/* $NetBSD: ffs_vfsops.c,v 1.120 2003/09/13 13:47:04 bouyer Exp $ */
/*
* Copyright (c) 1989, 1991, 1993, 1994
@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.119 2003/08/07 16:34:31 agc Exp $");
__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.120 2003/09/13 13:47:04 bouyer Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@ -964,28 +964,8 @@ ffs_oldfscompat_read(fs, ump, sblockloc)
return;
/*
* If not yet done, update fs_flags location and value of fs_sblockloc.
*/
if ((fs->fs_old_flags & FS_FLAGS_UPDATED) == 0) {
fs->fs_flags = fs->fs_old_flags;
fs->fs_old_flags |= FS_FLAGS_UPDATED;
fs->fs_sblockloc = sblockloc;
}
/*
* If the new fields haven't been set yet, or if the filesystem
* was mounted and modified by an old kernel, use the old csum
* totals.
*/
if (fs->fs_maxbsize != fs->fs_bsize || fs->fs_time < fs->fs_old_time) {
fs->fs_cstotal.cs_ndir = fs->fs_old_cstotal.cs_ndir;
fs->fs_cstotal.cs_nbfree = fs->fs_old_cstotal.cs_nbfree;
fs->fs_cstotal.cs_nifree = fs->fs_old_cstotal.cs_nifree;
fs->fs_cstotal.cs_nffree = fs->fs_old_cstotal.cs_nffree;
}
/*
* If not yet done, update UFS1 superblock with new wider fields.
* If not yet done, update UFS1 superblock with new wider fields,
* and update fs_flags location and value of fs_sblockloc.
*/
if (fs->fs_maxbsize != fs->fs_bsize) {
fs->fs_maxbsize = fs->fs_bsize;
@ -993,7 +973,23 @@ ffs_oldfscompat_read(fs, ump, sblockloc)
fs->fs_size = fs->fs_old_size;
fs->fs_dsize = fs->fs_old_dsize;
fs->fs_csaddr = fs->fs_old_csaddr;
fs->fs_sblockloc = sblockloc;
fs->fs_flags = fs->fs_old_flags;
fs->fs_old_flags |= FS_FLAGS_UPDATED;
}
/*
* If the new fields haven't been set yet, or if the filesystem
* was mounted and modified by an old kernel, use the old csum
* totals, and update the flags
*/
if (fs->fs_maxbsize != fs->fs_bsize || fs->fs_time < fs->fs_old_time) {
fs->fs_cstotal.cs_ndir = fs->fs_old_cstotal.cs_ndir;
fs->fs_cstotal.cs_nbfree = fs->fs_old_cstotal.cs_nbfree;
fs->fs_cstotal.cs_nifree = fs->fs_old_cstotal.cs_nifree;
fs->fs_cstotal.cs_nffree = fs->fs_old_cstotal.cs_nffree;
fs->fs_flags |= (fs->fs_old_flags & ~FS_FLAGS_UPDATED);
}
if (fs->fs_old_inodefmt < FS_44INODEFMT) {
fs->fs_maxfilesize = (u_quad_t) 1LL << 39;
@ -1034,6 +1030,12 @@ ffs_oldfscompat_write(fs, ump)
if (fs->fs_magic != FS_UFS1_MAGIC)
return;
/*
* if none of the newer flags are used, copy back fs_flags
* to fs_old_flags
*/
if ((fs->fs_flags & ~(FS_UNCLEAN|FS_DOSOFTDEP)) == 0)
fs->fs_old_flags = fs->fs_flags & (FS_UNCLEAN|FS_DOSOFTDEP);
/*
* OS X somehow still seems to use this field and panic.
* Just set it to zero.
@ -1560,16 +1562,14 @@ ffs_sbupdate(mp, waitfor)
(int)fs->fs_sbsize, 0, 0);
saveflag = fs->fs_flags & FS_INTERNAL;
fs->fs_flags &= ~FS_INTERNAL;
if (fs->fs_magic == FS_UFS1_MAGIC && fs->fs_sblockloc != SBLOCK_UFS1 &&
(fs->fs_flags & FS_FLAGS_UPDATED) == 0) {
if (fs->fs_magic == FS_UFS1_MAGIC && fs->fs_sblockloc != SBLOCK_UFS1) {
printf("%s: correcting fs_sblockloc from %" PRId64 " to %d\n",
fs->fs_fsmnt, fs->fs_sblockloc, SBLOCK_UFS1);
fs->fs_sblockloc = SBLOCK_UFS1;
}
if (fs->fs_magic == FS_UFS2_MAGIC && fs->fs_sblockloc != SBLOCK_UFS2 &&
(fs->fs_flags & FS_FLAGS_UPDATED) == 0) {
if (fs->fs_magic == FS_UFS2_MAGIC && fs->fs_sblockloc != SBLOCK_UFS2) {
printf("%s: correcting fs_sblockloc from %" PRId64 " to %d\n",
fs->fs_fsmnt, fs->fs_sblockloc, SBLOCK_UFS2);
fs->fs_sblockloc = SBLOCK_UFS2;