Source-Changes-HG archive

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

[src/trunk]: src Add a (draft) 64-bit superblock. Make things build again.



details:   https://anonhg.NetBSD.org/src/rev/d5921f29e57b
branches:  trunk
changeset: 339668:d5921f29e57b
user:      dholland <dholland%NetBSD.org@localhost>
date:      Sun Aug 02 18:18:09 2015 +0000

description:
Add a (draft) 64-bit superblock. Make things build again.

Add pieces of support for using both superblock types where
convenient, and specifically to the superblock accessors, but don't
actually enable it anywhere.

First substantive step on PR 50000.

diffstat:

 libexec/lfs_cleanerd/cleaner.h      |    6 +-
 libexec/lfs_cleanerd/lfs_cleanerd.c |   25 +++++-
 sbin/dump_lfs/lfs_inode.c           |    8 +-
 sbin/fsck_lfs/lfs.c                 |   20 +++--
 sbin/fsck_lfs/segwrite.c            |   10 +-
 sbin/newfs_lfs/extern.h             |    6 +-
 sbin/newfs_lfs/make_lfs.c           |  103 ++++++++++++++++++++++++++---
 sbin/resize_lfs/resize_lfs.c        |    5 +-
 sbin/scan_ffs/scan_ffs.c            |   15 ++--
 sys/lib/libsa/lfsv1.c               |    4 +-
 sys/lib/libsa/lfsv2.c               |    5 +-
 sys/lib/libsa/ufs.c                 |   15 +++-
 sys/ufs/lfs/lfs.h                   |  126 +++++++++++++++++++++++++++++++++--
 sys/ufs/lfs/lfs_accessors.h         |   77 ++++++++++++++++++---
 sys/ufs/lfs/lfs_cksum.c             |   18 +++-
 sys/ufs/lfs/lfs_debug.c             |    8 +-
 sys/ufs/lfs/lfs_extern.h            |    4 +-
 sys/ufs/lfs/lfs_segment.c           |   17 +++-
 sys/ufs/lfs/lfs_vfsops.c            |   16 +--
 usr.sbin/dumplfs/dumplfs.c          |   21 +++--
 20 files changed, 398 insertions(+), 111 deletions(-)

diffs (truncated from 1144 to 300 lines):

diff -r f0ae1cfc1553 -r d5921f29e57b libexec/lfs_cleanerd/cleaner.h
--- a/libexec/lfs_cleanerd/cleaner.h    Sun Aug 02 18:14:16 2015 +0000
+++ b/libexec/lfs_cleanerd/cleaner.h    Sun Aug 02 18:18:09 2015 +0000
@@ -16,7 +16,11 @@
  * The cleaner's view of the superblock data structure.
  */
 struct clfs {
-       struct dlfs lfs_dlfs;
+       union {
+               struct dlfs u_32;
+               struct dlfs64 u_64;
+       } lfs_dlfs_u;
+       unsigned lfs_is64 : 1;
 
        /* Ifile */
        int clfs_ifilefd;          /* Ifile file descriptor */
diff -r f0ae1cfc1553 -r d5921f29e57b libexec/lfs_cleanerd/lfs_cleanerd.c
--- a/libexec/lfs_cleanerd/lfs_cleanerd.c       Sun Aug 02 18:14:16 2015 +0000
+++ b/libexec/lfs_cleanerd/lfs_cleanerd.c       Sun Aug 02 18:18:09 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_cleanerd.c,v 1.43 2015/08/02 18:14:16 dholland Exp $    */
+/* $NetBSD: lfs_cleanerd.c,v 1.44 2015/08/02 18:18:09 dholland Exp $    */
 
 /*-
  * Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -94,6 +94,11 @@
 extern u_int32_t lfs_cksum_part(void *, size_t, u_int32_t);
 extern int ulfs_getlbns(struct lfs *, struct uvnode *, daddr_t, struct indir *, int *);
 
+/* Ugh */
+#define FSMNT_SIZE MAX(sizeof(((struct dlfs *)0)->dlfs_fsmnt), \
+                       sizeof(((struct dlfs64 *)0)->dlfs_fsmnt))
+
+
 /* Compat */
 void pwarn(const char *unused, ...) { /* Does nothing */ };
 
@@ -133,9 +138,9 @@
 int
 reinit_fs(struct clfs *fs)
 {
-       char fsname[sizeof(fs->lfs_dlfs.dlfs_fsmnt)];
+       char fsname[FSMNT_SIZE];
 
-       memcpy(fsname, fs->lfs_dlfs.dlfs_fsmnt, sizeof(fsname));
+       memcpy(fsname, lfs_sb_getfsmnt(fs), sizeof(fsname));
        fsname[sizeof(fsname) - 1] = '\0';
 
        kops.ko_close(fs->clfs_ifilefd);
@@ -202,7 +207,7 @@
 int
 init_fs(struct clfs *fs, char *fsname)
 {
-       char mnttmp[sizeof(fs->lfs_dlfs.dlfs_fsmnt)];
+       char mnttmp[FSMNT_SIZE];
        struct statvfs sf;
        int rootfd;
        int i;
@@ -254,9 +259,17 @@
                return -1;
        }
 
-       memcpy(&(fs->lfs_dlfs), sbuf, sizeof(struct dlfs));
+       __CTASSERT(sizeof(struct dlfs) == sizeof(struct dlfs64));
+       memcpy(&fs->lfs_dlfs_u, sbuf, sizeof(struct dlfs));
        free(sbuf);
 
+       /* If it is not LFS, complain and exit! */
+       if (fs->lfs_dlfs_u.u_32.dlfs_magic != LFS_MAGIC) {
+               syslog(LOG_ERR, "%s: not LFS", fsname);
+               return -1;
+       }
+       fs->lfs_is64 = 0; /* XXX notyet */
+
        /* If this is not a version 2 filesystem, complain and exit */
        if (lfs_sb_getversion(fs) != 2) {
                syslog(LOG_ERR, "%s: not a version 2 LFS", fsname);
@@ -266,7 +279,7 @@
        /* Assume fsname is the mounted name */
        strncpy(mnttmp, fsname, sizeof(mnttmp));
        mnttmp[sizeof(mnttmp) - 1] = '\0';
-       memcpy(fs->lfs_dlfs.dlfs_fsmnt, mnttmp, sizeof(mnttmp));
+       lfs_sb_setfsmnt(fs, mnttmp);
 
        /* Set up vnodes for Ifile and raw device */
        fs->lfs_ivnode = fd_vget(fs->clfs_ifilefd, lfs_sb_getbsize(fs), 0, 0);
diff -r f0ae1cfc1553 -r d5921f29e57b sbin/dump_lfs/lfs_inode.c
--- a/sbin/dump_lfs/lfs_inode.c Sun Aug 02 18:14:16 2015 +0000
+++ b/sbin/dump_lfs/lfs_inode.c Sun Aug 02 18:18:09 2015 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: lfs_inode.c,v 1.22 2015/08/02 18:14:16 dholland Exp $ */
+/*      $NetBSD: lfs_inode.c,v 1.23 2015/08/02 18:18:09 dholland Exp $ */
 
 /*-
  * Copyright (c) 1980, 1991, 1993, 1994
@@ -39,7 +39,7 @@
 #if 0
 static char sccsid[] = "@(#)main.c      8.6 (Berkeley) 5/1/95";
 #else
-__RCSID("$NetBSD: lfs_inode.c,v 1.22 2015/08/02 18:14:16 dholland Exp $");
+__RCSID("$NetBSD: lfs_inode.c,v 1.23 2015/08/02 18:18:09 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -86,7 +86,7 @@
        sblock = (struct lfs *)superblock;
        while(1) {
                rawread(sboff, (char *) sblock, LFS_SBPAD);
-               if (sblock->lfs_magic != LFS_MAGIC) {
+               if (sblock->lfs_dlfs_u.u_32.dlfs_magic != LFS_MAGIC) {
 #ifdef notyet
                        if (sblock->lfs_magic == bswap32(LFS_MAGIC)) {
                                lfs_sb_swap(sblock, sblock, 0);
@@ -111,7 +111,7 @@
        if (ns)
                lfs_sb_swap(u.tbuf, u.tbuf, 0);
 #endif
-       if (u.lfss.lfs_magic != LFS_MAGIC) {
+       if (u.lfss.lfs_dlfs_u.u_32.dlfs_magic != LFS_MAGIC) {
                msg("Warning: secondary superblock at 0x%" PRIx64 " bad magic\n",
                        LFS_FSBTODB(sblock, (off_t)lfs_sb_getsboff(sblock, 1)));
        } else {
diff -r f0ae1cfc1553 -r d5921f29e57b sbin/fsck_lfs/lfs.c
--- a/sbin/fsck_lfs/lfs.c       Sun Aug 02 18:14:16 2015 +0000
+++ b/sbin/fsck_lfs/lfs.c       Sun Aug 02 18:18:09 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs.c,v 1.51 2015/08/02 18:14:16 dholland Exp $ */
+/* $NetBSD: lfs.c,v 1.52 2015/08/02 18:18:09 dholland Exp $ */
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -95,7 +95,7 @@
 #define panic call_panic
 
 extern u_int32_t cksum(void *, size_t);
-extern u_int32_t lfs_sb_cksum(struct dlfs *);
+extern u_int32_t lfs_sb_cksum(struct lfs *);
 extern void pwarn(const char *, ...);
 
 extern struct uvnodelst vnodelist;
@@ -427,15 +427,19 @@
 check_sb(struct lfs *fs)
 {
        u_int32_t checksum;
+       u_int32_t magic;
 
-       if (fs->lfs_magic != LFS_MAGIC) {
+       /* we can read the magic out of either the 32-bit or 64-bit dlfs */
+       magic = fs->lfs_dlfs_u.u_32.dlfs_magic;
+
+       if (magic != LFS_MAGIC) {
                printf("Superblock magic number (0x%lx) does not match "
-                      "expected 0x%lx\n", (unsigned long) fs->lfs_magic,
+                      "expected 0x%lx\n", (unsigned long) magic,
                       (unsigned long) LFS_MAGIC);
                return 1;
        }
        /* checksum */
-       checksum = lfs_sb_cksum(&(fs->lfs_dlfs));
+       checksum = lfs_sb_cksum(fs);
        if (lfs_sb_getcksum(fs) != checksum) {
                printf("Superblock checksum (%lx) does not match computed checksum (%lx)\n",
                    (unsigned long) lfs_sb_getcksum(fs), (unsigned long) checksum);
@@ -482,7 +486,8 @@
 
                (void)bread(devvp, sblkno, LFS_SBPAD, 0, &bp);
                fs = ecalloc(1, sizeof(*fs));
-               fs->lfs_dlfs = *((struct dlfs *) bp->b_data);
+               __CTASSERT(sizeof(struct dlfs) == sizeof(struct dlfs64));
+               memcpy(&fs->lfs_dlfs_u, bp->b_data, sizeof(struct dlfs));
                fs->lfs_devvp = devvp;
                bp->b_flags |= B_INVAL;
                brelse(bp, 0);
@@ -493,7 +498,8 @@
                        (void)bread(devvp, LFS_FSBTODB(fs, lfs_sb_getsboff(fs, 1)),
                        LFS_SBPAD, 0, &bp);
                        altfs = ecalloc(1, sizeof(*altfs));
-                       altfs->lfs_dlfs = *((struct dlfs *) bp->b_data);
+                       memcpy(&altfs->lfs_dlfs_u, bp->b_data,
+                              sizeof(struct dlfs));
                        altfs->lfs_devvp = devvp;
                        bp->b_flags |= B_INVAL;
                        brelse(bp, 0);
diff -r f0ae1cfc1553 -r d5921f29e57b sbin/fsck_lfs/segwrite.c
--- a/sbin/fsck_lfs/segwrite.c  Sun Aug 02 18:14:16 2015 +0000
+++ b/sbin/fsck_lfs/segwrite.c  Sun Aug 02 18:18:09 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: segwrite.c,v 1.35 2015/08/02 18:14:16 dholland Exp $ */
+/* $NetBSD: segwrite.c,v 1.36 2015/08/02 18:18:09 dholland Exp $ */
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -103,7 +103,7 @@
 time_t write_time;
 
 extern u_int32_t cksum(void *, size_t);
-extern u_int32_t lfs_sb_cksum(struct dlfs *);
+extern u_int32_t lfs_sb_cksum(struct lfs *);
 extern int preen;
 
 /*
@@ -1003,13 +1003,15 @@
                lfs_sb_setotstamp(fs, write_time);
        lfs_sb_settstamp(fs, write_time);
 
+       __CTASSERT(sizeof(struct dlfs) == sizeof(struct dlfs64));
+
        /* Checksum the superblock and copy it into a buffer. */
-       lfs_sb_setcksum(fs, lfs_sb_cksum(&(fs->lfs_dlfs)));
+       lfs_sb_setcksum(fs, lfs_sb_cksum(fs));
        assert(daddr > 0);
        bp = getblk(fs->lfs_devvp, LFS_FSBTODB(fs, daddr), LFS_SBPAD);
+       memcpy(bp->b_data, &fs->lfs_dlfs_u, sizeof(struct dlfs));
        memset(bp->b_data + sizeof(struct dlfs), 0,
            LFS_SBPAD - sizeof(struct dlfs));
-       *(struct dlfs *) bp->b_data = fs->lfs_dlfs;
 
        bwrite(bp);
 }
diff -r f0ae1cfc1553 -r d5921f29e57b sbin/newfs_lfs/extern.h
--- a/sbin/newfs_lfs/extern.h   Sun Aug 02 18:14:16 2015 +0000
+++ b/sbin/newfs_lfs/extern.h   Sun Aug 02 18:18:09 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: extern.h,v 1.12 2008/02/16 17:58:43 matt Exp $ */
+/*     $NetBSD: extern.h,v 1.13 2015/08/02 18:18:09 dholland Exp $     */
 
 /*-
  * Copyright (c) 1991, 1993
@@ -31,9 +31,9 @@
  *     @(#)extern.h    8.2 (Berkeley) 5/24/95
  */
 
-struct dlfs;
+struct lfs;
 
-uint32_t lfs_sb_cksum(struct dlfs *);
+uint32_t lfs_sb_cksum(struct lfs *);
 void   fatal(const char *fmt, ...)
      __attribute__((__format__(__printf__,1,2)));
 u_int  lfs_log2(u_int);
diff -r f0ae1cfc1553 -r d5921f29e57b sbin/newfs_lfs/make_lfs.c
--- a/sbin/newfs_lfs/make_lfs.c Sun Aug 02 18:14:16 2015 +0000
+++ b/sbin/newfs_lfs/make_lfs.c Sun Aug 02 18:18:09 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: make_lfs.c,v 1.39 2015/08/02 18:14:16 dholland Exp $   */
+/*     $NetBSD: make_lfs.c,v 1.40 2015/08/02 18:18:09 dholland Exp $   */
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
 #if 0
 static char sccsid[] = "@(#)lfs.c      8.5 (Berkeley) 5/24/95";
 #else
-__RCSID("$NetBSD: make_lfs.c,v 1.39 2015/08/02 18:14:16 dholland Exp $");
+__RCSID("$NetBSD: make_lfs.c,v 1.40 2015/08/02 18:18:09 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -109,8 +109,7 @@
 # define HIGHEST_USED_INO ULFS_ROOTINO
 #endif
 
-static struct lfs lfs_default =  {
-       .lfs_dlfs = {
+static const struct dlfs dlfs32_default = {
                .dlfs_magic =           LFS_MAGIC,
                .dlfs_version =         LFS_VERSION,
                .dlfs_size =            0,
@@ -174,9 +173,73 @@
 
                .dlfs_pad =             { 0 },
                .dlfs_cksum =           0
-       },
 };
 
+static const struct dlfs64 dlfs64_default = {
+               .dlfs_magic =           LFS64_MAGIC,
+               .dlfs_version =         LFS_VERSION,
+               .dlfs_size =            0,
+               .dlfs_dsize =           0,
+               .dlfs_ssize =           DFL_LFSSEG,
+               .dlfs_bsize =           DFL_LFSBLOCK,
+               .dlfs_fsize =           DFL_LFSFRAG,
+               .dlfs_frag =            DFL_LFSBLOCK/DFL_LFSFRAG,
+               .dlfs_freehd =          HIGHEST_USED_INO + 1,
+               .dlfs_nfiles =          0,
+               .dlfs_bfree =           0,
+               .dlfs_avail =           0,
+               .dlfs_idaddr =          0,
+               .dlfs_uinodes =         0,
+               .dlfs_ifile =           LFS_IFILE_INUM,
+               .dlfs_lastseg =         0,
+               .dlfs_nextseg =         0,
+               .dlfs_curseg =          0,
+               .dlfs_offset =          0,
+               .dlfs_lastpseg =        0,
+               .dlfs_inopf =           0,
+               .dlfs_minfree =         MINFREE,
+               .dlfs_maxfilesize =     0,
+               .dlfs_fsbpseg =         0,



Home | Main Index | Thread Index | Old Index