Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sbin/resize_ffs Add support for old ffsv1 superblocks. Afte...



details:   https://anonhg.NetBSD.org/src/rev/b5b3f71b3c6a
branches:  trunk
changeset: 759559:b5b3f71b3c6a
user:      mhitch <mhitch%NetBSD.org@localhost>
date:      Sun Dec 12 19:53:23 2010 +0000

description:
Add support for old ffsv1 superblocks.  After reading an old superblock,
copy appropriate data to where they are expected in the updated superblock.
When writing the updated superblock, move the updated values back to the
old ffsv1 superblock locations.  Also check for old superblock format when
updating the last cylinder group and adjust cg_old_ncyl appropriately.
Derived from how mksf sets them.  Should address PR bin/44209.

diffstat:

 sbin/resize_ffs/resize_ffs.c |  45 +++++++++++++++++++++++++++++++++++--------
 1 files changed, 36 insertions(+), 9 deletions(-)

diffs (92 lines):

diff -r 8bd970d6d87c -r b5b3f71b3c6a sbin/resize_ffs/resize_ffs.c
--- a/sbin/resize_ffs/resize_ffs.c      Sun Dec 12 19:29:23 2010 +0000
+++ b/sbin/resize_ffs/resize_ffs.c      Sun Dec 12 19:53:23 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: resize_ffs.c,v 1.19 2010/12/08 00:25:54 riz Exp $      */
+/*     $NetBSD: resize_ffs.c,v 1.20 2010/12/12 19:53:23 mhitch Exp $   */
 /* From sources sent on February 17, 2003 */
 /*-
  * As its sole author, I explicitly place this code in the public
@@ -449,14 +449,16 @@
          * mkfs do.
          */
        bzero(cg, newsb->fs_cgsize);
-       cg->cg_time = newsb->fs_time;
+       cg->cg_old_time = newsb->fs_time;
+       if (newsb->fs_old_flags & FS_FLAGS_UPDATED)
+               cg->cg_time = newsb->fs_time;
        cg->cg_magic = CG_MAGIC;
        cg->cg_cgx = cgn;
        cg->cg_old_ncyl = newsb->fs_old_cpg;
        /* Update the cg_old_ncyl value for the last cylinder. */
-       if ((cgn == newsb->fs_ncg - 1) && 
-           (newsb->fs_old_ncyl % newsb->fs_old_cpg) ) {
-               cg->cg_old_ncyl = newsb->fs_old_ncyl % newsb->fs_old_cpg;
+       if (cgn == newsb->fs_ncg - 1) {
+               if ((newsb->fs_old_flags & FS_FLAGS_UPDATED) == 0)
+                       cg->cg_old_ncyl = newsb->fs_old_ncyl % newsb->fs_old_cpg;
        }
        cg->cg_old_niblk = newsb->fs_ipg;
        cg->cg_ndblk = dmax;
@@ -945,8 +947,9 @@
                        newcgsize = newsb->fs_fpg;
                oldcgsize = oldsb->fs_size % oldsb->fs_fpg;
                set_bits(cg_blksfree(cg, 0), oldcgsize, newcgsize - oldcgsize);
-               cg->cg_old_ncyl = howmany(newcgsize * NSPF(newsb),
-                   newsb->fs_old_spc);
+               cg->cg_old_ncyl = oldsb->fs_old_cpg;
+               if ((newsb->fs_old_flags & FS_FLAGS_UPDATED) == 0)
+                       cg->cg_old_ncyl = newsb->fs_old_ncyl % newsb->fs_old_cpg;
                cg->cg_ndblk = newcgsize;
        }
        /* Fix up the csum info, if necessary. */
@@ -1626,9 +1629,9 @@
        for (i = 0; i < newsb->fs_ncg; i++)
                cgflags[i] |= CGF_DIRTY | CGF_BLKMAPS | CGF_INOMAPS;
        /* Update the cg_old_ncyl value for the last cylinder. */
-       if (newsb->fs_old_ncyl % newsb->fs_old_cpg)
+       if ((newsb->fs_old_flags & FS_FLAGS_UPDATED) == 0)
                cgs[newsb->fs_ncg - 1]->cg_old_ncyl =
-                   newsb->fs_old_ncyl % newsb->fs_old_cpg;
+                   newsb->fs_old_ncyl % newsb->fs_old_cpg;
        /* Make fs_dsize match the new reality. */
        recompute_fs_dsize();
 }
@@ -1819,6 +1822,18 @@
 {
        int i;
 
+       if (newsb->fs_magic == FS_UFS1_MAGIC &&
+           (newsb->fs_old_flags & FS_FLAGS_UPDATED) == 0) {
+               newsb->fs_old_time = newsb->fs_time;
+               newsb->fs_old_size = newsb->fs_size;
+               /* we don't update fs_csaddr */
+               newsb->fs_old_dsize = newsb->fs_dsize;
+               newsb->fs_old_cstotal.cs_ndir = newsb->fs_cstotal.cs_ndir;
+               newsb->fs_old_cstotal.cs_nbfree = newsb->fs_cstotal.cs_nbfree;
+               newsb->fs_old_cstotal.cs_nifree = newsb->fs_cstotal.cs_nifree;
+               newsb->fs_old_cstotal.cs_nffree = newsb->fs_cstotal.cs_nffree;
+               /* fill fs_old_postbl_start with 256 bytes of 0xff? */
+       }
        writeat(where /  DEV_BSIZE, newsb, SBLOCKSIZE);
        for (i = 0; i < newsb->fs_ncg; i++) {
                writeat(fsbtodb(newsb, cgsblock(newsb, i)), newsb, SBLOCKSIZE);
@@ -1931,6 +1946,18 @@
        }
        if (where == (off_t)-1)
                errx(EXIT_FAILURE, "Bad magic number");
+       if (oldsb->fs_magic == FS_UFS1_MAGIC &&
+           (oldsb->fs_old_flags & FS_FLAGS_UPDATED) == 0) {
+               oldsb->fs_csaddr = oldsb->fs_old_csaddr;
+               oldsb->fs_size = oldsb->fs_old_size;
+               oldsb->fs_dsize = oldsb->fs_old_dsize;
+               oldsb->fs_cstotal.cs_ndir = oldsb->fs_old_cstotal.cs_ndir;
+               oldsb->fs_cstotal.cs_nbfree = oldsb->fs_old_cstotal.cs_nbfree;
+               oldsb->fs_cstotal.cs_nifree = oldsb->fs_old_cstotal.cs_nifree;
+               oldsb->fs_cstotal.cs_nffree = oldsb->fs_old_cstotal.cs_nffree;
+               /* any others? */
+               printf("Resizing with ffsv1 superblock\n");
+       }
        oldsb->fs_qbmask = ~(int64_t) oldsb->fs_bmask;
        oldsb->fs_qfmask = ~(int64_t) oldsb->fs_fmask;
        if (oldsb->fs_ipg % INOPB(oldsb)) {



Home | Main Index | Thread Index | Old Index