Module Name: src Committed By: dholland Date: Sun Sep 20 04:51:43 UTC 2015
Modified Files: src/sbin/fsck_lfs: dir.c src/sys/ufs/lfs: lfs.h lfs_accessors.h lfs_rename.c lfs_vnops.c Log Message: Clean up struct lfs_dirtemplate. To generate a diff of this commit: cvs rdiff -u -r1.43 -r1.44 src/sbin/fsck_lfs/dir.c cvs rdiff -u -r1.189 -r1.190 src/sys/ufs/lfs/lfs.h cvs rdiff -u -r1.28 -r1.29 src/sys/ufs/lfs/lfs_accessors.h cvs rdiff -u -r1.13 -r1.14 src/sys/ufs/lfs/lfs_rename.c cvs rdiff -u -r1.290 -r1.291 src/sys/ufs/lfs/lfs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/fsck_lfs/dir.c diff -u src/sbin/fsck_lfs/dir.c:1.43 src/sbin/fsck_lfs/dir.c:1.44 --- src/sbin/fsck_lfs/dir.c:1.43 Tue Sep 15 15:02:25 2015 +++ src/sbin/fsck_lfs/dir.c Sun Sep 20 04:51:43 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dir.c,v 1.43 2015/09/15 15:02:25 dholland Exp $ */ +/* $NetBSD: dir.c,v 1.44 2015/09/20 04:51:43 dholland Exp $ */ /* * Copyright (c) 1980, 1986, 1993 @@ -54,6 +54,7 @@ const char *lfname = "lost+found"; int lfmode = 01700; +#if 0 struct lfs_dirtemplate emptydir = { .dot_ino = 0, .dot_reclen = LFS_DIRBLKSIZ, @@ -70,7 +71,6 @@ struct lfs_dirtemplate dirhead = { .dotdot_namlen = 2, .dotdot_name = ".." }; -#if 0 struct lfs_odirtemplate odirhead = { .dot_ino = 0, .dot_reclen = 12, @@ -587,6 +587,24 @@ makeentry(ino_t parent, ino_t ino, const } /* + * Initialize a completely empty directory block. + * (block size is LFS_DIRBLKSIZ) + */ +static void +zerodirblk(void *buf) +{ + struct lfs_dirheader *dirp; + + dirp = buf; + lfs_dir_setino(fs, dirp, 0); + lfs_dir_setreclen(fs, dirp, LFS_DIRBLKSIZ); + lfs_dir_settype(fs, dirp, LFS_DT_UNKNOWN); + lfs_dir_setnamlen(fs, dirp, 0); + lfs_copydirname(fs, lfs_dir_nameptr(fs, dirp), "", 0, + LFS_DIRBLKSIZ); +} + +/* * Attempt to expand the size of a directory */ static int @@ -620,13 +638,13 @@ expanddir(struct uvnode *vp, union lfs_d for (cp = &bp->b_data[LFS_DIRBLKSIZ]; cp < &bp->b_data[lfs_sb_getbsize(fs)]; cp += LFS_DIRBLKSIZ) - memcpy(cp, &emptydir, sizeof emptydir); + zerodirblk(cp); VOP_BWRITE(bp); bread(vp, lfs_dino_getdb(fs, dp, lastbn + 1), (long) lfs_dblksize(fs, dp, lastbn + 1), 0, &bp); if (bp->b_flags & B_ERROR) goto bad; - memcpy(bp->b_data, &emptydir, sizeof emptydir); + zerodirblk(bp->b_data); pwarn("NO SPACE LEFT IN %s", name); if (preen) printf(" (EXPANDED)\n"); @@ -655,13 +673,10 @@ allocdir(ino_t parent, ino_t request, in char *cp; union lfs_dinode *dp; struct ubuf *bp; - struct lfs_dirtemplate *dirp; + struct lfs_dirheader *dirp; struct uvnode *vp; ino = allocino(request, LFS_IFDIR | mode); - dirp = &dirhead; - dirp->dot_ino = ino; - dirp->dotdot_ino = parent; vp = vget(fs, ino); dp = VTOD(vp); bread(vp, lfs_dino_getdb(fs, dp, 0), lfs_sb_getfsize(fs), 0, &bp); @@ -670,11 +685,27 @@ allocdir(ino_t parent, ino_t request, in freeino(ino); return (0); } - memcpy(bp->b_data, dirp, sizeof(struct lfs_dirtemplate)); + dirp = (struct lfs_dirheader *)bp->b_data; + /* . */ + lfs_dir_setino(fs, dirp, ino); + lfs_dir_setreclen(fs, dirp, LFS_DIRECTSIZ(1)); + lfs_dir_settype(fs, dirp, LFS_DT_DIR); + lfs_dir_setnamlen(fs, dirp, 1); + lfs_copydirname(fs, lfs_dir_nameptr(fs, dirp), ".", 1, + LFS_DIRECTSIZ(1)); + /* .. */ + dirp = LFS_NEXTDIR(fs, dirp); + lfs_dir_setino(fs, dirp, parent); + lfs_dir_setreclen(fs, dirp, LFS_DIRBLKSIZ - LFS_DIRECTSIZ(1)); + lfs_dir_settype(fs, dirp, LFS_DT_DIR); + lfs_dir_setnamlen(fs, dirp, 2); + lfs_copydirname(fs, lfs_dir_nameptr(fs, dirp), "..", 2, + LFS_DIRBLKSIZ - LFS_DIRECTSIZ(1)); for (cp = &bp->b_data[LFS_DIRBLKSIZ]; cp < &bp->b_data[lfs_sb_getfsize(fs)]; - cp += LFS_DIRBLKSIZ) - memcpy(cp, &emptydir, sizeof emptydir); + cp += LFS_DIRBLKSIZ) { + zerodirblk(cp); + } VOP_BWRITE(bp); lfs_dino_setnlink(fs, dp, 2); inodirty(VTOI(vp)); Index: src/sys/ufs/lfs/lfs.h diff -u src/sys/ufs/lfs/lfs.h:1.189 src/sys/ufs/lfs/lfs.h:1.190 --- src/sys/ufs/lfs/lfs.h:1.189 Tue Sep 15 15:02:40 2015 +++ src/sys/ufs/lfs/lfs.h Sun Sep 20 04:51:43 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs.h,v 1.189 2015/09/15 15:02:40 dholland Exp $ */ +/* $NetBSD: lfs.h,v 1.190 2015/09/20 04:51:43 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 */ @@ -356,22 +356,16 @@ struct lfs_dirheader { }; /* - * Template for manipulating directories. Should use struct lfs_direct's, - * but the name field is LFS_MAXNAMLEN - 1, and this just won't do. + * Template for manipulating directories. */ struct lfs_dirtemplate { - u_int32_t dot_ino; - int16_t dot_reclen; - u_int8_t dot_type; - u_int8_t dot_namlen; - char dot_name[4]; /* must be multiple of 4 */ - u_int32_t dotdot_ino; - int16_t dotdot_reclen; - u_int8_t dotdot_type; - u_int8_t dotdot_namlen; - char dotdot_name[4]; /* ditto */ + struct lfs_dirheader dot_header; + char dot_name[4]; /* must be multiple of 4 */ + struct lfs_dirheader dotdot_header; + char dotdot_name[4]; /* ditto */ }; +#if 0 /* * This is the old format of directories, sans type element. */ @@ -385,6 +379,7 @@ struct lfs_odirtemplate { u_int16_t dotdot_namlen; char dotdot_name[4]; /* ditto */ }; +#endif /* * Inodes Index: src/sys/ufs/lfs/lfs_accessors.h diff -u src/sys/ufs/lfs/lfs_accessors.h:1.28 src/sys/ufs/lfs/lfs_accessors.h:1.29 --- src/sys/ufs/lfs/lfs_accessors.h:1.28 Sun Sep 20 04:50:58 2015 +++ src/sys/ufs/lfs/lfs_accessors.h Sun Sep 20 04:51:43 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_accessors.h,v 1.28 2015/09/20 04:50:58 dholland Exp $ */ +/* $NetBSD: lfs_accessors.h,v 1.29 2015/09/20 04:51:43 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 */ @@ -330,78 +330,6 @@ lfs_copydirname(STRUCT_LFS *fs, char *de } /* - * These are called "dirt" because they ought to be cleaned up. - */ - -static __unused inline uint8_t -lfs_dirt_getdottype(const STRUCT_LFS *fs, const struct lfs_dirtemplate *dp) -{ - if (fs->lfs_hasolddirfmt) { - return LFS_DT_UNKNOWN; - } - return dp->dot_type; -} - -static __unused inline uint8_t -lfs_dirt_getdotnamlen(const STRUCT_LFS *fs, const struct lfs_dirtemplate *dp) -{ - if (fs->lfs_hasolddirfmt && LFS_LITTLE_ENDIAN_ONDISK(fs)) { - /* low-order byte of old 16-bit namlen field */ - return dp->dot_type; - } - return dp->dot_namlen; -} - -static __unused inline uint8_t -lfs_dirt_getdotdottype(const STRUCT_LFS *fs, const struct lfs_dirtemplate *dp) -{ - if (fs->lfs_hasolddirfmt) { - return LFS_DT_UNKNOWN; - } - return dp->dotdot_type; -} - -static __unused inline uint8_t -lfs_dirt_getdotdotnamlen(const STRUCT_LFS *fs, const struct lfs_dirtemplate *dp) -{ - if (fs->lfs_hasolddirfmt && LFS_LITTLE_ENDIAN_ONDISK(fs)) { - /* low-order byte of old 16-bit namlen field */ - return dp->dotdot_type; - } - return dp->dotdot_namlen; -} - -static __unused inline void -lfs_dirt_settypes(const STRUCT_LFS *fs, struct lfs_dirtemplate *dtp, - unsigned dt1, unsigned dt2) -{ - if (fs->lfs_hasolddirfmt) { - /* do nothing */ - return; - } - dtp->dot_type = dt1; - dtp->dotdot_type = dt2; -} - -static __unused inline void -lfs_dirt_setnamlens(const STRUCT_LFS *fs, struct lfs_dirtemplate *dtp, - unsigned len1, unsigned len2) -{ - if (fs->lfs_hasolddirfmt && LFS_LITTLE_ENDIAN_ONDISK(fs)) { - /* low-order bytes of old 16-bit namlen field */ - dtp->dot_type = len1; - dtp->dotdot_type = len2; - /* clear the high-order bytes */ - dtp->dot_namlen = 0; - dtp->dotdot_namlen = 0; - return; - } - dtp->dot_namlen = len1; - dtp->dotdot_namlen = len2; -} - - -/* * dinodes */ Index: src/sys/ufs/lfs/lfs_rename.c diff -u src/sys/ufs/lfs/lfs_rename.c:1.13 src/sys/ufs/lfs/lfs_rename.c:1.14 --- src/sys/ufs/lfs/lfs_rename.c:1.13 Tue Sep 15 15:02:25 2015 +++ src/sys/ufs/lfs/lfs_rename.c Sun Sep 20 04:51:43 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_rename.c,v 1.13 2015/09/15 15:02:25 dholland Exp $ */ +/* $NetBSD: lfs_rename.c,v 1.14 2015/09/20 04:51:43 dholland Exp $ */ /* from NetBSD: ufs_rename.c,v 1.6 2013/01/22 09:39:18 dholland Exp */ /*- @@ -89,7 +89,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_rename.c,v 1.13 2015/09/15 15:02:25 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_rename.c,v 1.14 2015/09/20 04:51:43 dholland Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -128,16 +128,6 @@ __KERNEL_RCSID(0, "$NetBSD: lfs_rename.c #include <ufs/lfs/lfs_extern.h> /* - * A virgin directory (no blushing please). - * - * XXX Copypasta from ulfs_vnops.c. Kill! - */ -static const struct lfs_dirtemplate mastertemplate = { - 0, 12, LFS_DT_DIR, 1, ".", - 0, LFS_DIRBLKSIZ - 12, LFS_DT_DIR, 2, ".." -}; - -/* * ulfs_gro_directory_empty_p: Return true if the directory vp is * empty. dvp is its parent. * @@ -584,33 +574,13 @@ ulfs_rmdired_p(struct vnode *vp) } /* - * ulfs_dirbuf_dotdot_namlen: Return the namlen of the directory buffer - * dirbuf that came from the directory vp. Swap byte order if - * necessary. - */ -static int /* XXX int? uint8_t? */ -ulfs_dirbuf_dotdot_namlen(const struct lfs_dirtemplate *dirbuf, - const struct vnode *vp) -{ - struct lfs *fs; - - KASSERT(dirbuf != NULL); - KASSERT(vp != NULL); - KASSERT(VTOI(vp) != NULL); - KASSERT(VTOI(vp)->i_ump != NULL); - KASSERT(VTOI(vp)->i_lfs != NULL); - fs = VTOI(vp)->i_lfs; - - return lfs_dirt_getdotdotnamlen(fs, dirbuf); -} - -/* * ulfs_read_dotdot: Store in *ino_ret the inode number of the parent * of the directory vp. */ static int ulfs_read_dotdot(struct vnode *vp, kauth_cred_t cred, ino_t *ino_ret) { + struct lfs *fs; struct lfs_dirtemplate dirbuf; int error; @@ -618,19 +588,22 @@ ulfs_read_dotdot(struct vnode *vp, kauth KASSERT(ino_ret != NULL); KASSERT(vp->v_type == VDIR); + KASSERT(VTOI(vp) != NULL); + KASSERT(VTOI(vp)->i_lfs != NULL); + fs = VTOI(vp)->i_lfs; + error = ulfs_bufio(UIO_READ, vp, &dirbuf, sizeof dirbuf, (off_t)0, IO_NODELOCKED, cred, NULL, NULL); if (error) return error; - if (ulfs_dirbuf_dotdot_namlen(&dirbuf, vp) != 2 || + if (lfs_dir_getnamlen(fs, &dirbuf.dotdot_header) != 2 || dirbuf.dotdot_name[0] != '.' || dirbuf.dotdot_name[1] != '.') /* XXX Panic? Print warning? */ return ENOTDIR; - *ino_ret = ulfs_rw32(dirbuf.dotdot_ino, - ULFS_IPNEEDSWAP(VTOI(vp))); + *ino_ret = lfs_dir_getino(fs, &dirbuf.dotdot_header); return 0; } @@ -962,7 +935,15 @@ ulfs_gro_rename(struct mount *mp, kauth_ * the link count of fvp or the link count of tdvp. Go figure. */ if (directory_p && reparent_p) { - error = ulfs_dirrewrite(VTOI(fvp), mastertemplate.dot_reclen, + off_t position; + + /* + * The .. entry goes immediately after the . entry, so + * the position is the record length of the . entry, + * namely LFS_DIRECTSIZ(1). + */ + position = LFS_DIRECTSIZ(1); + error = ulfs_dirrewrite(VTOI(fvp), position, VTOI(fdvp), VTOI(tdvp)->i_number, LFS_DT_DIR, 0, IN_CHANGE); #if 0 /* XXX This branch was not in ulfs_rename! */ if (error) Index: src/sys/ufs/lfs/lfs_vnops.c diff -u src/sys/ufs/lfs/lfs_vnops.c:1.290 src/sys/ufs/lfs/lfs_vnops.c:1.291 --- src/sys/ufs/lfs/lfs_vnops.c:1.290 Tue Sep 15 15:00:32 2015 +++ src/sys/ufs/lfs/lfs_vnops.c Sun Sep 20 04:51:43 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vnops.c,v 1.290 2015/09/15 15:00:32 dholland Exp $ */ +/* $NetBSD: lfs_vnops.c,v 1.291 2015/09/20 04:51:43 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -125,7 +125,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.290 2015/09/15 15:00:32 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.291 2015/09/20 04:51:43 dholland Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -178,14 +178,6 @@ static int lfs_setextattr(void *v); static int lfs_listextattr(void *v); static int lfs_deleteextattr(void *v); -/* - * A virgin directory (no blushing please). - */ -static const struct lfs_dirtemplate mastertemplate = { - 0, 12, LFS_DT_DIR, 1, ".", - 0, LFS_DIRBLKSIZ - 12, LFS_DT_DIR, 2, ".." -}; - /* Global vfs data structures for lfs. */ int (**lfs_vnodeop_p)(void *); const struct vnodeopv_entry_desc lfs_vnodeop_entries[] = { @@ -857,7 +849,7 @@ lfs_mkdir(void *v) struct vattr *vap; struct ulfs_lookup_results *ulr; struct buf *bp; - struct lfs_dirtemplate dirtemplate; + struct lfs_dirheader *dirp; int dirblksiz; int error; @@ -884,6 +876,8 @@ lfs_mkdir(void *v) return EROFS; } dirblksiz = fs->um_dirblksiz; + /* XXX dholland 20150911 I believe this to be true, but... */ + //KASSERT(dirblksiz == LFS_DIRBLKSIZ); error = lfs_set_dirop(dvp, NULL); if (error) @@ -933,18 +927,10 @@ lfs_mkdir(void *v) goto bad; /* - * Initialize directory with "." and ".." from static template. + * Initialize directory with "." and "..". This used to use a + * static template but that adds moving parts for very little + * benefit. */ - dirtemplate = mastertemplate; - dirtemplate.dotdot_reclen = dirblksiz - dirtemplate.dot_reclen; - dirtemplate.dot_ino = ulfs_rw32(ip->i_number, ULFS_MPNEEDSWAP(fs)); - dirtemplate.dotdot_ino = ulfs_rw32(dp->i_number, ULFS_MPNEEDSWAP(fs)); - dirtemplate.dot_reclen = ulfs_rw16(dirtemplate.dot_reclen, - ULFS_MPNEEDSWAP(fs)); - dirtemplate.dotdot_reclen = ulfs_rw16(dirtemplate.dotdot_reclen, - ULFS_MPNEEDSWAP(fs)); - lfs_dirt_settypes(fs, &dirtemplate, LFS_DT_DIR, LFS_DT_DIR); - lfs_dirt_setnamlens(fs, &dirtemplate, 1, 2); if ((error = lfs_balloc(tvp, (off_t)0, dirblksiz, cnp->cn_cred, B_CLRBUF, &bp)) != 0) goto bad; @@ -952,7 +938,23 @@ lfs_mkdir(void *v) DIP_ASSIGN(ip, size, dirblksiz); ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; uvm_vnp_setsize(tvp, ip->i_size); - memcpy((void *)bp->b_data, (void *)&dirtemplate, sizeof dirtemplate); + dirp = bp->b_data; + + /* . */ + lfs_dir_setino(fs, dirp, ip->i_number); + lfs_dir_setreclen(fs, dirp, LFS_DIRECTSIZ(1)); + lfs_dir_settype(fs, dirp, LFS_DT_DIR); + lfs_dir_setnamlen(fs, dirp, 1); + lfs_copydirname(fs, lfs_dir_nameptr(fs, dirp), ".", 1, + LFS_DIRECTSIZ(1)); + dirp = LFS_NEXTDIR(fs, dirp); + /* .. */ + lfs_dir_setino(fs, dirp, dp->i_number); + lfs_dir_setreclen(fs, dirp, dirblksiz - LFS_DIRECTSIZ(1)); + lfs_dir_settype(fs, dirp, LFS_DT_DIR); + lfs_dir_setnamlen(fs, dirp, 2); + lfs_copydirname(fs, lfs_dir_nameptr(fs, dirp), "..", 2, + dirblksiz - LFS_DIRECTSIZ(1)); /* * Directory set up; now install its entry in the parent directory.