Source-Changes-HG archive

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

[src/trunk]: src Move the header part of struct lfs_direct to its own structure.



details:   https://anonhg.NetBSD.org/src/rev/bb904139a840
branches:  trunk
changeset: 810727:bb904139a840
user:      dholland <dholland%NetBSD.org@localhost>
date:      Tue Sep 15 14:59:58 2015 +0000

description:
Move the header part of struct lfs_direct to its own structure.
(lfs_dirheader)

Take the opportunity to improve the directory generation code in
make_lfs.c. (Everything else was unaffected by virtue of using
accessor functions.)

diffstat:

 sbin/newfs_lfs/make_lfs.c   |  120 +++++++++++++++++++------------------------
 sys/ufs/lfs/lfs.h           |   13 ++-
 sys/ufs/lfs/lfs_accessors.h |   22 ++++----
 3 files changed, 72 insertions(+), 83 deletions(-)

diffs (284 lines):

diff -r 1fe7312e1f53 -r bb904139a840 sbin/newfs_lfs/make_lfs.c
--- a/sbin/newfs_lfs/make_lfs.c Tue Sep 15 14:58:05 2015 +0000
+++ b/sbin/newfs_lfs/make_lfs.c Tue Sep 15 14:59:58 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: make_lfs.c,v 1.50 2015/09/15 14:58:05 dholland Exp $   */
+/*     $NetBSD: make_lfs.c,v 1.51 2015/09/15 14:59:58 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.50 2015/09/15 14:58:05 dholland Exp $");
+__RCSID("$NetBSD: make_lfs.c,v 1.51 2015/09/15 14:59:58 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -242,63 +242,32 @@
 
 #define        UMASK   0755
 
-struct lfs_direct lfs_root_dir[] = {
-       {
-               .d_ino = ULFS_ROOTINO,
-               .d_reclen = sizeof(struct lfs_direct),
-               .d_type = LFS_DT_DIR,
-               .d_namlen = 1,
-               .d_name = "."
-       },
-       {
-               .d_ino = ULFS_ROOTINO,
-               .d_reclen = sizeof(struct lfs_direct),
-               .d_type = LFS_DT_DIR,
-               .d_namlen = 2,
-               .d_name = ".."
-       },
-/*
-       {
-               .d_ino = LFS_IFILE_INUM,
-               .d_reclen = sizeof(struct lfs_direct),
-               .d_type = LFS_DT_REG,
-               .d_namlen = 5,
-               .d_name = "ifile"
-       },
-*/
+struct dirproto {
+       ino_t dp_ino;
+       const char *dp_name;
+       unsigned dp_type;
+};
+
+static const struct dirproto lfs_root_dir[] = {
+       { ULFS_ROOTINO, ".", LFS_DT_DIR },
+       { ULFS_ROOTINO, "..", LFS_DT_DIR },
+       /*{ LFS_IFILE_INUM, "ifile", LFS_DT_REG },*/
 #ifdef MAKE_LF_DIR
-       {
-               .d_ino = LOSTFOUNDINO,
-               .d_reclen = sizeof(struct lfs_direct),
-               .d_type = LFS_DT_DIR,
-               .d_namlen = 10,
-               .d_name = "lost+found"
-       },
+       { LOSTFOUNDINO, "lost+found", LFS_DT_DIR },
 #endif
 };
 
 #ifdef MAKE_LF_DIR
-struct lfs_direct lfs_lf_dir[] = {
-        {
-               .d_ino = LOSTFOUNDINO,
-               .d_reclen = sizeof(struct lfs_direct),
-               .d_type = LFS_DT_DIR,
-               .d_reclen = 1,
-               .d_name = "."
-       },
-        {
-               .d_ino = ULFS_ROOTINO,
-               .d_reclen = sizeof(struct lfs_direct),
-               .d_type = LFS_DT_DIR,
-               .d_reclen = 2,
-               .d_name = ".."
-       },
+static const struct dirproto lfs_lf_dir[] = {
+        { LOSTFOUNDINO, ".", LFS_DT_DIR },
+       { ULFS_ROOTINO, "..", LFS_DT_DIR },
 };
 #endif
 
 void pwarn(const char *, ...);
 static void make_dinode(ino_t, union lfs_dinode *, int, struct lfs *);
-static void make_dir(struct lfs *, void *, struct lfs_direct *, int);
+static void make_dir(struct lfs *, void *,
+               const struct dirproto *, unsigned);
 static uint64_t maxfilesize(int);
 
 /*
@@ -385,23 +354,42 @@
  * entries in protodir fit in the first DIRBLKSIZ.  
  */
 static void
-make_dir(struct lfs *fs, void *bufp, struct lfs_direct *protodir, int entries)
+make_dir(struct lfs *fs, void *bufp,
+    const struct dirproto *protodir, unsigned numentries)
 {
-       char *cp;
-       int i, spcleft;
-       unsigned reclen;
+       struct lfs_direct *ep;
+       unsigned spaceleft;
+       unsigned namlen, reclen;
+       unsigned i;
+       char *pad;
+
+       spaceleft = LFS_DIRBLKSIZ;
+       ep = bufp;
+       for (i = 0; i < numentries; i++) {
+               namlen = strlen(protodir[i].dp_name);
+               reclen = LFS_DIRECTSIZ(namlen);
+               if (spaceleft < reclen)
+                       fatal("%s: %s", special, "directory too big");
 
-       spcleft = LFS_DIRBLKSIZ;
-       for (cp = bufp, i = 0; i < entries - 1; i++) {
-               reclen = LFS_DIRSIZ(fs, &protodir[i]);
-               lfs_dir_setreclen(fs, &protodir[i], reclen);
-               memmove(cp, &protodir[i], lfs_dir_getreclen(fs, &protodir[i]));
-               cp += reclen;
-               if ((spcleft -= reclen) < 0)
-                       fatal("%s: %s", special, "directory too big");
+               /* Last entry includes all the free space. */
+               if (i + 1 == numentries) {
+                       reclen = spaceleft;
+               }
+               spaceleft -= reclen;
+
+               lfs_dir_setino(fs, ep, protodir[i].dp_ino);
+               lfs_dir_setreclen(fs, ep, reclen);
+               lfs_dir_settype(fs, ep, protodir[i].dp_type);
+               lfs_dir_setnamlen(fs, ep, namlen);
+               memcpy(ep->d_name, protodir[i].dp_name, namlen);
+               pad = ep->d_name + namlen;
+               ep = LFS_NEXTDIR(fs, ep);
+
+               while (pad < (char *)ep) {
+                       *pad++ = '\0';
+               }
        }
-       lfs_dir_setreclen(fs, &protodir[i], spcleft);
-       memmove(cp, &protodir[i], LFS_DIRSIZ(fs, &protodir[i]));
+       assert(spaceleft == 0);
 }
 
 int
@@ -838,8 +826,7 @@
                VTOI(vp)->i_lfs_fragsize[i - 1] =
                        roundup(LFS_DIRBLKSIZ, lfs_sb_getfsize(fs));
        bread(vp, 0, lfs_sb_getfsize(fs), 0, &bp);
-       make_dir(fs, bp->b_data, lfs_root_dir, 
-                sizeof(lfs_root_dir) / sizeof(struct lfs_direct));
+       make_dir(fs, bp->b_data, lfs_root_dir, __arraycount(lfs_root_dir));
        VOP_BWRITE(bp);
 
 #ifdef MAKE_LF_DIR
@@ -858,8 +845,7 @@
                VTOI(vp)->i_lfs_fragsize[i - 1] =
                        roundup(DIRBLKSIZ,fs->lfs_fsize);
        bread(vp, 0, fs->lfs_fsize, 0, &bp);
-       make_dir(fs, bp->b_data, lfs_lf_dir, 
-                sizeof(lfs_lf_dir) / sizeof(struct lfs_direct));
+       make_dir(fs, bp->b_data, lfs_lf_dir, __arraycount(lfs_lf_dir));
        VOP_BWRITE(bp);
 #endif /* MAKE_LF_DIR */
 
diff -r 1fe7312e1f53 -r bb904139a840 sys/ufs/lfs/lfs.h
--- a/sys/ufs/lfs/lfs.h Tue Sep 15 14:58:05 2015 +0000
+++ b/sys/ufs/lfs/lfs.h Tue Sep 15 14:59:58 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: lfs.h,v 1.186 2015/09/15 14:58:06 dholland Exp $       */
+/*     $NetBSD: lfs.h,v 1.187 2015/09/15 14:59:58 dholland Exp $       */
 
 /*  from NetBSD: dinode.h,v 1.22 2013/01/22 09:39:18 dholland Exp  */
 /*  from NetBSD: dir.h,v 1.21 2009/07/22 04:49:19 dholland Exp  */
@@ -365,11 +365,14 @@
 /*
  * (See notes above)
  */
+struct lfs_dirheader {
+       u_int32_t dh_ino;               /* inode number of entry */
+       u_int16_t dh_reclen;            /* length of this record */
+       u_int8_t  dh_type;              /* file type, see below */
+       u_int8_t  dh_namlen;            /* length of string in d_name */
+};
 struct lfs_direct {
-       u_int32_t d_ino;                /* inode number of entry */
-       u_int16_t d_reclen;             /* length of this record */
-       u_int8_t  d_type;               /* file type, see below */
-       u_int8_t  d_namlen;             /* length of string in d_name */
+       struct lfs_dirheader d_header;
        char      d_name[LFS_MAXNAMLEN + 1];/* name with length <= LFS_MAXNAMLEN */
 };
 
diff -r 1fe7312e1f53 -r bb904139a840 sys/ufs/lfs/lfs_accessors.h
--- a/sys/ufs/lfs/lfs_accessors.h       Tue Sep 15 14:58:05 2015 +0000
+++ b/sys/ufs/lfs/lfs_accessors.h       Tue Sep 15 14:59:58 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: lfs_accessors.h,v 1.23 2015/09/15 14:58:06 dholland Exp $      */
+/*     $NetBSD: lfs_accessors.h,v 1.24 2015/09/15 14:59:58 dholland Exp $      */
 
 /*  from NetBSD: lfs.h,v 1.165 2015/07/24 06:59:32 dholland Exp  */
 /*  from NetBSD: dinode.h,v 1.22 2013/01/22 09:39:18 dholland Exp  */
@@ -247,13 +247,13 @@
 static __unused inline uint32_t
 lfs_dir_getino(const STRUCT_LFS *fs, const struct lfs_direct *dp)
 {
-       return LFS_SWAP_uint32_t(fs, dp->d_ino);
+       return LFS_SWAP_uint32_t(fs, dp->d_header.dh_ino);
 }
 
 static __unused inline uint16_t
 lfs_dir_getreclen(const STRUCT_LFS *fs, const struct lfs_direct *dp)
 {
-       return LFS_SWAP_uint16_t(fs, dp->d_reclen);
+       return LFS_SWAP_uint16_t(fs, dp->d_header.dh_reclen);
 }
 
 static __unused inline uint8_t
@@ -262,7 +262,7 @@
        if (fs->lfs_hasolddirfmt) {
                return LFS_DT_UNKNOWN;
        }
-       return dp->d_type;
+       return dp->d_header.dh_type;
 }
 
 static __unused inline uint8_t
@@ -270,21 +270,21 @@
 {
        if (fs->lfs_hasolddirfmt && LFS_LITTLE_ENDIAN_ONDISK(fs)) {
                /* low-order byte of old 16-bit namlen field */
-               return dp->d_type;
+               return dp->d_header.dh_type;
        }
-       return dp->d_namlen;
+       return dp->d_header.dh_namlen;
 }
 
 static __unused inline void
 lfs_dir_setino(STRUCT_LFS *fs, struct lfs_direct *dp, uint32_t ino)
 {
-       dp->d_ino = LFS_SWAP_uint32_t(fs, ino);
+       dp->d_header.dh_ino = LFS_SWAP_uint32_t(fs, ino);
 }
 
 static __unused inline void
 lfs_dir_setreclen(STRUCT_LFS *fs, struct lfs_direct *dp, uint16_t reclen)
 {
-       dp->d_reclen = LFS_SWAP_uint16_t(fs, reclen);
+       dp->d_header.dh_reclen = LFS_SWAP_uint16_t(fs, reclen);
 }
 
 static __unused inline void
@@ -294,7 +294,7 @@
                /* do nothing */
                return;
        }
-       dp->d_type = type;
+       dp->d_header.dh_type = type;
 }
 
 static __unused inline void
@@ -302,9 +302,9 @@
 {
        if (fs->lfs_hasolddirfmt && LFS_LITTLE_ENDIAN_ONDISK(fs)) {
                /* low-order byte of old 16-bit namlen field */
-               dp->d_type = namlen;
+               dp->d_header.dh_type = namlen;
        }
-       dp->d_namlen = namlen;
+       dp->d_header.dh_namlen = namlen;
 }
 
 /*



Home | Main Index | Thread Index | Old Index