Module Name:    src
Committed By:   christos
Date:           Sun Jan 27 20:05:47 UTC 2013

Modified Files:
        src/usr.sbin/makefs: Makefile ffs.c msdos.c
        src/usr.sbin/makefs/ffs: buf.c buf.h ffs_alloc.c ffs_balloc.c
        src/usr.sbin/makefs/msdos: msdosfs_vfsops.c msdosfs_vnops.c

Log Message:
This works well enough to populate plain files in the root dir. creating
directories fails.


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 src/usr.sbin/makefs/Makefile
cvs rdiff -u -r1.54 -r1.55 src/usr.sbin/makefs/ffs.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/makefs/msdos.c
cvs rdiff -u -r1.14 -r1.15 src/usr.sbin/makefs/ffs/buf.c
cvs rdiff -u -r1.5 -r1.6 src/usr.sbin/makefs/ffs/buf.h
cvs rdiff -u -r1.21 -r1.22 src/usr.sbin/makefs/ffs/ffs_alloc.c
cvs rdiff -u -r1.15 -r1.16 src/usr.sbin/makefs/ffs/ffs_balloc.c
cvs rdiff -u -r1.4 -r1.5 src/usr.sbin/makefs/msdos/msdosfs_vfsops.c
cvs rdiff -u -r1.8 -r1.9 src/usr.sbin/makefs/msdos/msdosfs_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/usr.sbin/makefs/Makefile
diff -u src/usr.sbin/makefs/Makefile:1.34 src/usr.sbin/makefs/Makefile:1.35
--- src/usr.sbin/makefs/Makefile:1.34	Fri Jan 25 19:31:49 2013
+++ src/usr.sbin/makefs/Makefile	Sun Jan 27 15:05:46 2013
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.34 2013/01/26 00:31:49 christos Exp $
+#	$NetBSD: Makefile,v 1.35 2013/01/27 20:05:46 christos Exp $
 #
 
 WARNS?=	5
@@ -18,7 +18,7 @@ MKNODSRC=	${NETBSDSRCDIR}/sbin/mknod
 MTREESRC=	${NETBSDSRCDIR}/usr.sbin/mtree
 
 CPPFLAGS+=	-I${.CURDIR} -I${MKNODSRC} -I${MTREESRC} -DMAKEFS
-CPPFLAGS+=	-DMSDOSFS_DEBUG
+#CPPFLAGS+=	-DMSDOSFS_DEBUG
 .PATH:		${MKNODSRC} ${MTREESRC}
 
 .include "${.CURDIR}/cd9660/Makefile.inc"

Index: src/usr.sbin/makefs/ffs.c
diff -u src/usr.sbin/makefs/ffs.c:1.54 src/usr.sbin/makefs/ffs.c:1.55
--- src/usr.sbin/makefs/ffs.c:1.54	Fri Jan 25 19:19:39 2013
+++ src/usr.sbin/makefs/ffs.c	Sun Jan 27 15:05:46 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs.c,v 1.54 2013/01/26 00:19:39 christos Exp $	*/
+/*	$NetBSD: ffs.c,v 1.55 2013/01/27 20:05:46 christos Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -71,7 +71,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(__lint)
-__RCSID("$NetBSD: ffs.c,v 1.54 2013/01/26 00:19:39 christos Exp $");
+__RCSID("$NetBSD: ffs.c,v 1.55 2013/01/27 20:05:46 christos Exp $");
 #endif	/* !__lint */
 
 #include <sys/param.h>
@@ -945,7 +945,6 @@ ffs_write_file(union dinode *din, uint32
 		errno = bwrite(bp);
 		if (errno != 0)
 			goto bad_ffs_write_file;
-		brelse(bp, 0);
 		if (!isfile)
 			p += chunk;
 	}

Index: src/usr.sbin/makefs/msdos.c
diff -u src/usr.sbin/makefs/msdos.c:1.7 src/usr.sbin/makefs/msdos.c:1.8
--- src/usr.sbin/makefs/msdos.c:1.7	Sun Jan 27 10:35:45 2013
+++ src/usr.sbin/makefs/msdos.c	Sun Jan 27 15:05:46 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: msdos.c,v 1.7 2013/01/27 15:35:45 christos Exp $	*/
+/*	$NetBSD: msdos.c,v 1.8 2013/01/27 20:05:46 christos Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(__lint)
-__RCSID("$NetBSD: msdos.c,v 1.7 2013/01/27 15:35:45 christos Exp $");
+__RCSID("$NetBSD: msdos.c,v 1.8 2013/01/27 20:05:46 christos Exp $");
 #endif	/* !__lint */
 
 #include <sys/param.h>
@@ -162,7 +162,6 @@ msdos_makefs(const char *image, const ch
 
 	vp.fd = open(image, O_RDWR);
 	vp.fs = msdos_opt;
-	vp.offset = 0;
 
 	if ((pmp = msdosfs_mount(&vp, 0)) == NULL)
 		err(1, "msdosfs_mount");
@@ -237,7 +236,7 @@ msdos_populate_dir(const char *path, str
 			continue;
 		}
 		if (msdosfs_mkfile(pbuf, dir, cur) == NULL)
-			err(1, "msdosfs_mkfile");
+			err(1, "msdosfs_mkfile %s", pbuf);
 	}
 	return 0;
 }

Index: src/usr.sbin/makefs/ffs/buf.c
diff -u src/usr.sbin/makefs/ffs/buf.c:1.14 src/usr.sbin/makefs/ffs/buf.c:1.15
--- src/usr.sbin/makefs/ffs/buf.c:1.14	Sun Jan 27 09:10:03 2013
+++ src/usr.sbin/makefs/ffs/buf.c	Sun Jan 27 15:05:46 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: buf.c,v 1.14 2013/01/27 14:10:03 christos Exp $	*/
+/*	$NetBSD: buf.c,v 1.15 2013/01/27 20:05:46 christos Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -41,7 +41,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(__lint)
-__RCSID("$NetBSD: buf.c,v 1.14 2013/01/27 14:10:03 christos Exp $");
+__RCSID("$NetBSD: buf.c,v 1.15 2013/01/27 20:05:46 christos Exp $");
 #endif	/* !__lint */
 
 #include <sys/param.h>
@@ -148,6 +148,7 @@ bwrite(struct buf *bp)
 	if (debug & DEBUG_BUF_BWRITE)
 		printf("bwrite: write %ld (offset %lld) returned %lld\n",
 		    bp->b_bcount, (long long)offset, (long long)rv);
+	brelse(bp, 0);
 	if (rv == bp->b_bcount)
 		return (0);
 	else if (rv == -1)		/* write error */
@@ -189,7 +190,6 @@ getblk(struct vnode *vp, daddr_t blkno, 
 	int fd = vp->fd;
 	struct fs *fs = vp->fs;
 
-	// blkno += vp->offset;
 	assert (fs != NULL);
 	if (debug & DEBUG_BUF_GETBLK)
 		printf("getblk: blkno %lld size %d\n", (long long)blkno, size);

Index: src/usr.sbin/makefs/ffs/buf.h
diff -u src/usr.sbin/makefs/ffs/buf.h:1.5 src/usr.sbin/makefs/ffs/buf.h:1.6
--- src/usr.sbin/makefs/ffs/buf.h:1.5	Sun Jan 27 09:10:22 2013
+++ src/usr.sbin/makefs/ffs/buf.h	Sun Jan 27 15:05:46 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: buf.h,v 1.5 2013/01/27 14:10:22 christos Exp $	*/
+/*	$NetBSD: buf.h,v 1.6 2013/01/27 20:05:46 christos Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -58,7 +58,6 @@ struct vnode {
 	int fd;
 	void *fs;
 	void *v_data;
-	int offset;
 };
 
 #define vput(a) ((void)(a))

Index: src/usr.sbin/makefs/ffs/ffs_alloc.c
diff -u src/usr.sbin/makefs/ffs/ffs_alloc.c:1.21 src/usr.sbin/makefs/ffs/ffs_alloc.c:1.22
--- src/usr.sbin/makefs/ffs/ffs_alloc.c:1.21	Fri Jan 25 19:19:39 2013
+++ src/usr.sbin/makefs/ffs/ffs_alloc.c	Sun Jan 27 15:05:46 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs_alloc.c,v 1.21 2013/01/26 00:19:39 christos Exp $	*/
+/*	$NetBSD: ffs_alloc.c,v 1.22 2013/01/27 20:05:46 christos Exp $	*/
 /* From: NetBSD: ffs_alloc.c,v 1.50 2001/09/06 02:16:01 lukem Exp */
 
 /*
@@ -47,7 +47,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(__lint)
-__RCSID("$NetBSD: ffs_alloc.c,v 1.21 2013/01/26 00:19:39 christos Exp $");
+__RCSID("$NetBSD: ffs_alloc.c,v 1.22 2013/01/27 20:05:46 christos Exp $");
 #endif	/* !__lint */
 
 #include <sys/param.h>
@@ -304,14 +304,13 @@ ffs_alloccg(struct inode *ip, int cg, da
 	int error, frags, allocsiz, i;
 	struct fs *fs = ip->i_fs;
 	const int needswap = UFS_FSNEEDSWAP(fs);
-	struct vnode vp = { ip->i_fd, ip->i_fs, NULL, 0 };
+	struct vnode vp = { ip->i_fd, ip->i_fs, NULL };
 
 	if (fs->fs_cs(fs, cg).cs_nbfree == 0 && size == fs->fs_bsize)
 		return (0);
 	error = bread(&vp, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize,
 	    NULL, 0, &bp);
 	if (error) {
-		brelse(bp, 0);
 		return (0);
 	}
 	cgp = (struct cg *)bp->b_data;
@@ -322,7 +321,7 @@ ffs_alloccg(struct inode *ip, int cg, da
 	}
 	if (size == fs->fs_bsize) {
 		bno = ffs_alloccgblk(ip, bp, bpref);
-		bdwrite(bp);
+		bwrite(bp);
 		return (bno);
 	}
 	/*
@@ -440,7 +439,7 @@ ffs_blkfree(struct inode *ip, daddr_t bn
 	int i, error, cg, blk, frags, bbase;
 	struct fs *fs = ip->i_fs;
 	const int needswap = UFS_FSNEEDSWAP(fs);
-	struct vnode vp = { ip->i_fd, ip->i_fs, NULL, 0 };
+	struct vnode vp = { ip->i_fd, ip->i_fs, NULL };
 
 	if (size > fs->fs_bsize || fragoff(fs, size) != 0 ||
 	    fragnum(fs, bno) + numfrags(fs, size) > fs->fs_frag) {

Index: src/usr.sbin/makefs/ffs/ffs_balloc.c
diff -u src/usr.sbin/makefs/ffs/ffs_balloc.c:1.15 src/usr.sbin/makefs/ffs/ffs_balloc.c:1.16
--- src/usr.sbin/makefs/ffs/ffs_balloc.c:1.15	Fri Jan 25 19:19:39 2013
+++ src/usr.sbin/makefs/ffs/ffs_balloc.c	Sun Jan 27 15:05:46 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs_balloc.c,v 1.15 2013/01/26 00:19:39 christos Exp $	*/
+/*	$NetBSD: ffs_balloc.c,v 1.16 2013/01/27 20:05:46 christos Exp $	*/
 /* From NetBSD: ffs_balloc.c,v 1.25 2001/08/08 08:36:36 lukem Exp */
 
 /*
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(__lint)
-__RCSID("$NetBSD: ffs_balloc.c,v 1.15 2013/01/26 00:19:39 christos Exp $");
+__RCSID("$NetBSD: ffs_balloc.c,v 1.16 2013/01/27 20:05:46 christos Exp $");
 #endif	/* !__lint */
 
 #include <sys/param.h>
@@ -95,7 +95,7 @@ ffs_balloc_ufs1(struct inode *ip, off_t 
 	int32_t *allocblk, allociblk[UFS_NIADDR + 1];
 	int32_t *allocib;
 	const int needswap = UFS_FSNEEDSWAP(fs);
-	struct vnode vp = { ip->i_fd, ip->i_fs, NULL, 0 };
+	struct vnode vp = { ip->i_fd, ip->i_fs, NULL };
 
 	lbn = lblkno(fs, offset);
 	size = blkoff(fs, offset) + bufsize;
@@ -346,7 +346,7 @@ ffs_balloc_ufs2(struct inode *ip, off_t 
 	int64_t *allocblk, allociblk[UFS_NIADDR + 1];
 	int64_t *allocib;
 	const int needswap = UFS_FSNEEDSWAP(fs);
-	struct vnode vp = { ip->i_fd, ip->i_fs, NULL, 0 };
+	struct vnode vp = { ip->i_fd, ip->i_fs, NULL };
 
 	lbn = lblkno(fs, offset);
 	size = blkoff(fs, offset) + bufsize;

Index: src/usr.sbin/makefs/msdos/msdosfs_vfsops.c
diff -u src/usr.sbin/makefs/msdos/msdosfs_vfsops.c:1.4 src/usr.sbin/makefs/msdos/msdosfs_vfsops.c:1.5
--- src/usr.sbin/makefs/msdos/msdosfs_vfsops.c:1.4	Sun Jan 27 10:35:45 2013
+++ src/usr.sbin/makefs/msdos/msdosfs_vfsops.c	Sun Jan 27 15:05:46 2013
@@ -50,7 +50,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.4 2013/01/27 15:35:45 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.5 2013/01/27 20:05:46 christos Exp $");
 
 #include <sys/param.h>
 
@@ -301,6 +301,12 @@ msdosfs_mount(struct vnode *devvp, int f
 	pmp->pm_crbomask = pmp->pm_bpcluster - 1;
 	pmp->pm_cnshift = ffs(pmp->pm_bpcluster) - 1;
 
+	DPRINTF(("%s(fatmask=%lu, fatmult=%u, fatdiv=%u, fatblocksize=%lu, "
+	    "fatblocksec=%lu, bnshift=%lu, pbcluster=%lu, crbomask=%lu, "
+	    "cnshift=%lu)\n",
+	    __func__, pmp->pm_fatmask, pmp->pm_fatmult, pmp->pm_fatdiv,
+	    pmp->pm_fatblocksize, pmp->pm_fatblocksec, pmp->pm_bnshift,
+	    pmp->pm_bpcluster, pmp->pm_crbomask, pmp->pm_cnshift));
 	/*
 	 * Check for valid cluster size
 	 * must be a power of 2

Index: src/usr.sbin/makefs/msdos/msdosfs_vnops.c
diff -u src/usr.sbin/makefs/msdos/msdosfs_vnops.c:1.8 src/usr.sbin/makefs/msdos/msdosfs_vnops.c:1.9
--- src/usr.sbin/makefs/msdos/msdosfs_vnops.c:1.8	Sun Jan 27 11:03:15 2013
+++ src/usr.sbin/makefs/msdos/msdosfs_vnops.c	Sun Jan 27 15:05:46 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: msdosfs_vnops.c,v 1.8 2013/01/27 16:03:15 christos Exp $ */
+/*	$NetBSD: msdosfs_vnops.c,v 1.9 2013/01/27 20:05:46 christos Exp $ */
 
 /*-
  * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
@@ -51,7 +51,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.8 2013/01/27 16:03:15 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.9 2013/01/27 20:05:46 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/mman.h>
@@ -70,6 +70,11 @@ __KERNEL_RCSID(0, "$NetBSD: msdosfs_vnop
 #include "makefs.h"
 #include "msdos.h"
 
+#ifdef MSDOSFS_DEBUG
+#define DPRINTF(a) printf a
+#else
+#define DPRINTF(a)
+#endif
 /*
  * Some general notes:
  *
@@ -169,9 +174,7 @@ msdosfs_findslot(struct denode *dp, stru
 	 * case it doesn't already exist.
 	 */
 	slotcount = 0;
-#ifdef MSDOSFS_DEBUG
-	printf("%s(): dos filename: %s\n", __func__, dosfilename);
-#endif
+	DPRINTF(("%s(): dos filename: %s\n", __func__, dosfilename));
 	/*
 	 * Search the directory pointed at by vdp for the name pointed at
 	 * by cnp->cn_nameptr.
@@ -264,10 +267,8 @@ msdosfs_findslot(struct denode *dp, stru
 					chksum = -1;
 					continue;
 				}
-#ifdef MSDOSFS_DEBUG
-				printf("%s(): match blkoff %d, diroff %d\n",
-				    __func__, blkoff, diroff);
-#endif
+				DPRINTF(("%s(): match blkoff %d, diroff %d\n",
+				    __func__, blkoff, diroff));
 				/*
 				 * Remember where this directory
 				 * entry came from for whoever did
@@ -296,10 +297,8 @@ notfound:
 	 * that's ok if we are creating or renaming and are at the end of
 	 * the pathname and the directory hasn't been removed.
 	 */
-#ifdef MSDOSFS_DEBUG
-	printf("%s(): refcnt %ld, slotcount %d, slotoffset %d\n",
-	    __func__, dp->de_refcnt, slotcount, slotoffset);
-#endif
+	DPRINTF(("%s(): refcnt %ld, slotcount %d, slotoffset %d\n",
+	    __func__, dp->de_refcnt, slotcount, slotoffset));
 	/*
 	 * Fixup the slot description to point to the place where
 	 * we might put the new DOS direntry (putting the Win95
@@ -351,10 +350,8 @@ msdosfs_mkfile(const char *path, struct 
 	cn.cn_nameptr = node->name;
 	cn.cn_namelen = strlen(node->name);
 
-#ifdef MSDOSFS_DEBUG
-	printf("msdosfs_create(name %s, mode 0%o size %zu\n", node->name,
-	    st->st_mode, (size_t)st->st_size);
-#endif
+	DPRINTF(("%s(name %s, mode 0%o size %zu)\n", __func__, node->name,
+	    st->st_mode, (size_t)st->st_size));
 
 	/*
 	 * If this is the root directory and there is no space left we
@@ -398,6 +395,21 @@ bad:
 	errno = error;
 	return NULL;
 }
+static int
+msdosfs_updatede(struct denode *dep)
+{
+	struct buf *bp;
+	struct direntry *dirp;
+	int error;
+
+	dep->de_flag &= ~DE_MODIFIED;
+	error = readde(dep, &bp, &dirp);
+	if (error)
+		return error;
+	DE_EXTERNALIZE(dirp, dep);
+	error = bwrite(bp);
+	return error;
+}
 
 /*
  * Write data to a file or directory.
@@ -409,16 +421,12 @@ msdosfs_wfile(const char *path, struct d
 	size_t osize = dep->de_FileSize;
 	struct stat *st = &node->inode->st;
 	size_t nsize;
-	size_t offs = 0;
 	struct msdosfsmount *pmp = dep->de_pmp;
 	struct buf *bp;
 	char *dat;
-	u_long cn;
 
-#ifdef MSDOSFS_DEBUG
-	printf("%s(diroff %lu, dirclust %lu, startcluster %lu)\n", __func__,
-	    dep->de_diroffset, dep->de_dirclust, dep->de_StartCluster);
-#endif
+	DPRINTF(("%s(diroff %lu, dirclust %lu, startcluster %lu)\n", __func__,
+	    dep->de_diroffset, dep->de_dirclust, dep->de_StartCluster));
 	if (st->st_size == 0)
 		return 0;
 
@@ -429,11 +437,16 @@ msdosfs_wfile(const char *path, struct d
 	}
 
 	nsize = st->st_size;
+	DPRINTF(("%s(nsize=%zu, osize=%zu)\n", __func__, nsize, osize));
 	if (nsize > osize) {
 		if ((error = deextend(dep, nsize, NULL)) != 0) {
 			errno = error;
 			return -1;
 		}
+		if ((error = msdosfs_updatede(dep)) != 0) {
+			errno = error;
+			return -1;
+		}
 	}
 
 	if ((fd = open(path, O_RDONLY)) == -1)
@@ -441,35 +454,37 @@ msdosfs_wfile(const char *path, struct d
 
 	if ((dat = mmap(0, nsize, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0))
 	    == MAP_FAILED) {
-		fprintf(stderr, "mmap %s", node->name);
+		DPRINTF(("%s: mmap %s %s", __func__, node->name,
+		    strerror(errno)));
+		close(fd);
 		goto out;
 	}
 	close(fd);
 
-	for (cn = 0;; cn++) {
+	for (size_t offs = 0; offs < nsize;) {
 		int blsize, cpsize;
 		daddr_t bn;
-		if ((error = pcbmap(dep, cn, &bn, 0, &blsize)) != 0) {
-			fprintf(stderr, "pcbmap %ld\n", cn);
+		u_long lbn = dep->de_StartCluster;
+		u_long on = offs & pmp->pm_crbomask;
+
+		if (lbn == MSDOSFSROOT) {
+			DPRINTF(("%s: bad lbn %lu", __func__, lbn));
 			goto out;
 		}
-#ifdef MSDOSFS_DEBUG
-		printf("%s(cn=%lu, bn=%llu/%llu, blsize=%d)\n", __func__, cn,
-		    (unsigned long long)bn,
-		    (unsigned long long)de_bn2kb(pmp, bn), blsize);
-#endif
+		bn = cntobn(pmp, lbn);
+		blsize = pmp->pm_bpcluster;
+		DPRINTF(("%s(lbn=%lu, bn=%llu/%llu, blsize=%d)\n", __func__,
+		    lbn, (unsigned long long)bn,
+		    (unsigned long long)de_bn2kb(pmp, bn), blsize));
 		if ((error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), blsize,
 		    NULL, 0, &bp)) != 0) {
-			fprintf(stderr, "bread %d\n", error);
+			DPRINTF(("bread %d\n", error));
 			goto out;
 		} 
-		cpsize = MIN((int)(nsize - offs), blsize);
-		memcpy(bp->b_data, dat + offs, cpsize);
+		cpsize = MIN((nsize - offs), blsize - on);
+		memcpy((char *)bp->b_data + on, dat + offs, cpsize);
 		bwrite(bp);
-		brelse(bp, 0);
-		offs += blsize;
-		if (offs >= nsize)
-			break;
+		offs += cpsize;
 	}
 
 	munmap(dat, nsize);

Reply via email to