Browse Source

Move code required by libufs into libufs

Needed to move more code into sys/include.  Also split some functions out of ffs_subr into libufs/libufs_subr.c

Signed-off-by: Graham MacDonald <grahamamacdonald@gmail.com>
Graham MacDonald 6 years ago
parent
commit
1a14c096cf

+ 2 - 2
sys/include/ffs/fs.h

@@ -465,7 +465,7 @@ CTASSERT(sizeof(Fs) == 1376);
  * Cylinder group block for a filesystem.
  */
 #define	CG_MAGIC	0x090255
-struct cg {
+typedef struct Cg {
 	int32_t	 cg_firstfield;		/* historic cyl groups linked list */
 	int32_t	 cg_magic;		/* magic number */
 	int32_t  cg_old_time;		/* time last written */
@@ -494,7 +494,7 @@ struct cg {
 	int64_t	 cg_sparecon64[3];	/* reserved for future use */
 	uint8_t cg_space[1];		/* space for cylinder group maps */
 /* actually longer */
-};
+} Cg;
 
 /*
  * Macros for access to cylinder group array structures

+ 13 - 0
sys/include/ufs/freebsd_util.h

@@ -134,3 +134,16 @@ typedef int64_t intmax_t;	/* FIXME: This should probably be moved to <u.h> or re
 
 
 #define S_IFMT 0170000		/* type of file */
+
+#define	NBBY	8		/* number of bits in a byte */
+
+#define	setbit(a,i)	(((unsigned char *)(a))[(i)/NBBY] |= 1<<((i)%NBBY))
+#define	clrbit(a,i)	(((unsigned char *)(a))[(i)/NBBY] &= ~(1<<((i)%NBBY)))
+
+/*
+ * Vnode types.  VNON means no type.
+ */
+enum vtype { VNON, VREG, VDIR, VLNK, VBAD, VMARKER };
+typedef enum vtype Vtype;
+
+

+ 0 - 0
sys/src/9/ufs/ufs/inode.h → sys/include/ufs/inode.h


+ 0 - 0
sys/src/9/ufs/ufs/quota.h → sys/include/ufs/quota.h


+ 2 - 1
sys/src/9/amd64/core.json

@@ -31,7 +31,8 @@
 			"/$ARCH/lib/klibc.a",
 			"/$ARCH/lib/klibdraw.a",
 			"/$ARCH/lib/klibip.a",
-			"/$ARCH/lib/klibsec.a"
+			"/$ARCH/lib/klibsec.a",
+			"/$ARCH/lib/klibufs.a"
 		],
 		"Oflags": [
 			"-z",

+ 2 - 1
sys/src/9/riscv/core.json

@@ -20,7 +20,8 @@
 		"Libs": [
 			"/$ARCH/lib/klibc.a",
 			"/$ARCH/lib/klibip.a",
-			"/$ARCH/lib/klibsec.a"
+			"/$ARCH/lib/klibsec.a",
+			"/$ARCH/lib/klibufs.a"
 		],
 		"Oflags": [
 			"-z",

+ 1 - 237
sys/src/9/ufs/ffs/ffs_subr.c

@@ -39,18 +39,11 @@
 #include "ufs_harvey.h"
 
 #include "ufs/quota.h"
-#include "ffs/fs.h"
+#include <ffs/fs.h>
 #include "ufs/ufsmount.h"
 #include "ufs/inode.h"
 #include "ufs/dinode.h"
 
-/*
-#include <ufs/ufs/extattr.h>
-#include <ufs/ufs/ufsmount.h>
-#include <ufs/ufs/ufs_extern.h>
-#include <ufs/ffs/ffs_extern.h>
-#include <ufs/ffs/fs.h>*/
-
 /*
  * Return buffer with the contents of block "offset" from the beginning of
  * directory "ip".  If "res" is non-zero, fill it in with a pointer to the
@@ -80,7 +73,6 @@ ffs_blkatoff(vnode *vp, off_t offset, char **res, void **bpp)
 		*res = (char *)bp + blkoff(fs, offset);
 	*bpp = bp;
 	return (0);
-
 }
 
 /*
@@ -99,231 +91,3 @@ ffs_load_inode(void *buf, inode *ip, Fs *fs, ino_t ino)
 	ip->i_uid = ip->i_din2->di_uid;
 	ip->i_gid = ip->i_din2->di_gid;
 }
-
-#if 0
-
-/*
- * Update the frsum fields to reflect addition or deletion
- * of some frags.
- */
-void
-ffs_fragacct(struct fs *fs, int fragmap, int32_t fraglist[], int cnt)
-{
-	int inblk;
-	int field, subfield;
-	int siz, pos;
-
-	inblk = (int)(fragtbl[fs->fs_frag][fragmap]) << 1;
-	fragmap <<= 1;
-	for (siz = 1; siz < fs->fs_frag; siz++) {
-		if ((inblk & (1 << (siz + (fs->fs_frag % NBBY)))) == 0)
-			continue;
-		field = around[siz];
-		subfield = inside[siz];
-		for (pos = siz; pos <= fs->fs_frag; pos++) {
-			if ((fragmap & field) == subfield) {
-				fraglist[siz] += cnt;
-				pos += siz;
-				field <<= siz;
-				subfield <<= siz;
-			}
-			field <<= 1;
-			subfield <<= 1;
-		}
-	}
-}
-
-/*
- * block operations
- *
- * check if a block is available
- */
-int
-ffs_isblock(struct fs *fs, unsigned char *cp, ufs1_daddr_t h)
-{
-	unsigned char mask;
-
-	switch ((int)fs->fs_frag) {
-	case 8:
-		return (cp[h] == 0xff);
-	case 4:
-		mask = 0x0f << ((h & 0x1) << 2);
-		return ((cp[h >> 1] & mask) == mask);
-	case 2:
-		mask = 0x03 << ((h & 0x3) << 1);
-		return ((cp[h >> 2] & mask) == mask);
-	case 1:
-		mask = 0x01 << (h & 0x7);
-		return ((cp[h >> 3] & mask) == mask);
-	default:
-		panic("ffs_isblock");
-		break;
-	}
-	return (0);
-}
-
-/*
- * check if a block is free
- */
-int
-ffs_isfreeblock(struct fs *fs, uint8_t *cp, ufs1_daddr_t h)
-{
- 
-	switch ((int)fs->fs_frag) {
-	case 8:
-		return (cp[h] == 0);
-	case 4:
-		return ((cp[h >> 1] & (0x0f << ((h & 0x1) << 2))) == 0);
-	case 2:
-		return ((cp[h >> 2] & (0x03 << ((h & 0x3) << 1))) == 0);
-	case 1:
-		return ((cp[h >> 3] & (0x01 << (h & 0x7))) == 0);
-	default:
-		panic("ffs_isfreeblock");
-		break;
-	}
-	return (0);
-}
-
-/*
- * take a block out of the map
- */
-void
-ffs_clrblock(struct fs *fs, uint8_t *cp, ufs1_daddr_t h)
-{
-
-	switch ((int)fs->fs_frag) {
-	case 8:
-		cp[h] = 0;
-		return;
-	case 4:
-		cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2));
-		return;
-	case 2:
-		cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1));
-		return;
-	case 1:
-		cp[h >> 3] &= ~(0x01 << (h & 0x7));
-		return;
-	default:
-		panic("ffs_clrblock");
-		break;
-	}
-}
-
-/*
- * put a block into the map
- */
-void
-ffs_setblock(struct fs *fs, unsigned char *cp, ufs1_daddr_t h)
-{
-
-	switch ((int)fs->fs_frag) {
-
-	case 8:
-		cp[h] = 0xff;
-		return;
-	case 4:
-		cp[h >> 1] |= (0x0f << ((h & 0x1) << 2));
-		return;
-	case 2:
-		cp[h >> 2] |= (0x03 << ((h & 0x3) << 1));
-		return;
-	case 1:
-		cp[h >> 3] |= (0x01 << (h & 0x7));
-		return;
-	default:
-		panic("ffs_setblock");
-		break;
-	}
-}
-
-/*
- * Update the cluster map because of an allocation or free.
- *
- * Cnt == 1 means free; cnt == -1 means allocating.
- */
-void
-ffs_clusteracct(struct fs *fs, struct cg *cgp, ufs1_daddr_t blkno, int cnt)
-{
-	int32_t *sump;
-	int32_t *lp;
-	uint8_t *freemapp, *mapp;
-	int i, start, end, forw, back, map, bit;
-
-	if (fs->fs_contigsumsize <= 0)
-		return;
-	freemapp = cg_clustersfree(cgp);
-	sump = cg_clustersum(cgp);
-	/*
-	 * Allocate or clear the actual block.
-	 */
-	if (cnt > 0)
-		setbit(freemapp, blkno);
-	else
-		clrbit(freemapp, blkno);
-	/*
-	 * Find the size of the cluster going forward.
-	 */
-	start = blkno + 1;
-	end = start + fs->fs_contigsumsize;
-	if (end >= cgp->cg_nclusterblks)
-		end = cgp->cg_nclusterblks;
-	mapp = &freemapp[start / NBBY];
-	map = *mapp++;
-	bit = 1 << (start % NBBY);
-	for (i = start; i < end; i++) {
-		if ((map & bit) == 0)
-			break;
-		if ((i & (NBBY - 1)) != (NBBY - 1)) {
-			bit <<= 1;
-		} else {
-			map = *mapp++;
-			bit = 1;
-		}
-	}
-	forw = i - start;
-	/*
-	 * Find the size of the cluster going backward.
-	 */
-	start = blkno - 1;
-	end = start - fs->fs_contigsumsize;
-	if (end < 0)
-		end = -1;
-	mapp = &freemapp[start / NBBY];
-	map = *mapp--;
-	bit = 1 << (start % NBBY);
-	for (i = start; i > end; i--) {
-		if ((map & bit) == 0)
-			break;
-		if ((i & (NBBY - 1)) != 0) {
-			bit >>= 1;
-		} else {
-			map = *mapp--;
-			bit = 1 << (NBBY - 1);
-		}
-	}
-	back = start - i;
-	/*
-	 * Account for old cluster and the possibly new forward and
-	 * back clusters.
-	 */
-	i = back + forw + 1;
-	if (i > fs->fs_contigsumsize)
-		i = fs->fs_contigsumsize;
-	sump[i] += cnt;
-	if (back > 0)
-		sump[back] -= cnt;
-	if (forw > 0)
-		sump[forw] -= cnt;
-	/*
-	 * Update cluster summary information.
-	 */
-	lp = &sump[fs->fs_contigsumsize];
-	for (i = fs->fs_contigsumsize; i > 0; i--)
-		if (*lp-- > 0)
-			break;
-	fs->fs_maxcluster[cgp->cg_cgx] = i;
-}
-
-#endif // 0

+ 0 - 1
sys/src/9/ufs/ufs.json

@@ -27,7 +27,6 @@
 			"../ufs/ffs/ffs_softdep.c",
 			"../ufs/ffs/ffs_subr.c",
 			"../ufs/ffs/ffs_suspend.c",
-			"../ufs/ffs/ffs_tables.c",
 			"../ufs/ffs/ffs_vfsops.c",
 			"../ufs/ffs/ffs_vnops.c",
 			"../ufs/ufs/ufs_inode.c",

+ 0 - 9
sys/src/9/ufs/ufs_harvey.h

@@ -50,15 +50,6 @@ typedef struct ComponentName {
 } ComponentName;
 
 
-/*
- * Vnode types.  VNON means no type.
- */
-enum vtype { VNON, VREG, VDIR, VLNK, VBAD, VMARKER };
-typedef enum vtype Vtype;
-
-
-
-
 /*
  * Vnode flags.
  *	VI flags are protected by interlock and live in v_iflag

+ 2 - 1
sys/src/klibs.json

@@ -6,7 +6,8 @@
 			"/sys/src/libdraw/klibdraw.json",
 			"/sys/src/libmemdraw/klibmemdraw.json",
 			"/sys/src/libmemlayer/klibmemlayer.json",
-			"/sys/src/libsec/klibsec.json"
+			"/sys/src/libsec/klibsec.json",
+			"/sys/src/libufs/klibufs.json"
 		]
 	}
 }

+ 3 - 2
sys/src/9/ufs/ffs/ffs_tables.c → sys/src/libufs/ffs_tables.c

@@ -31,8 +31,9 @@
 
 #include <u.h>
 #include <libc.h>
-#include <ufs/dinode.h>
-#include <ffs/fs.h>
+
+#include "ufs/dinode.h"
+#include "ffs/fs.h"
 
 /*
  * Bit patterns for identifying fragments in the block map

+ 13 - 0
sys/src/libufs/klibufs.json

@@ -0,0 +1,13 @@
+{
+	"Kernellibufs": {
+		"Include": [
+			"/$ARCH/include/klib.json"
+		],
+		"Install": "/$ARCH/lib/",
+		"Library": "klibufs.a",
+		"SourceFiles": [
+			"libufs_subr.c",
+			"ffs_tables.c"
+		]
+	}
+}

+ 2 - 0
sys/src/libufs/build.json → sys/src/libufs/libufs.json

@@ -9,6 +9,8 @@
 			"block.c",
 			"cgroup.c",
 			"inode.c",
+			"libufs_subr.c",
+			"ffs_tables.c",
 			"sblock.c",
 			"type.c"
 		]

+ 264 - 0
sys/src/libufs/libufs_subr.c

@@ -0,0 +1,264 @@
+/*-
+ * Copyright (c) 1982, 1986, 1989, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)ffs_subr.c	8.5 (Berkeley) 3/21/95
+ */
+
+#include <u.h>
+#include <libc.h>
+
+#include <ufs/freebsd_util.h>
+
+#include <ufs/quota.h>
+#include <ffs/fs.h>
+#include <ufs/inode.h>
+
+
+void panic(char*, ...);
+
+
+/*
+ * Update the frsum fields to reflect addition or deletion
+ * of some frags.
+ */
+void
+ffs_fragacct(Fs *fs, int fragmap, int32_t fraglist[], int cnt)
+{
+	int inblk;
+	int field, subfield;
+	int siz, pos;
+
+	inblk = (int)(fragtbl[fs->fs_frag][fragmap]) << 1;
+	fragmap <<= 1;
+	for (siz = 1; siz < fs->fs_frag; siz++) {
+		if ((inblk & (1 << (siz + (fs->fs_frag % NBBY)))) == 0)
+			continue;
+		field = around[siz];
+		subfield = inside[siz];
+		for (pos = siz; pos <= fs->fs_frag; pos++) {
+			if ((fragmap & field) == subfield) {
+				fraglist[siz] += cnt;
+				pos += siz;
+				field <<= siz;
+				subfield <<= siz;
+			}
+			field <<= 1;
+			subfield <<= 1;
+		}
+	}
+}
+
+/*
+ * block operations
+ *
+ * check if a block is available
+ */
+int
+ffs_isblock(Fs *fs, unsigned char *cp, ufs1_daddr_t h)
+{
+	unsigned char mask;
+
+	switch ((int)fs->fs_frag) {
+	case 8:
+		return (cp[h] == 0xff);
+	case 4:
+		mask = 0x0f << ((h & 0x1) << 2);
+		return ((cp[h >> 1] & mask) == mask);
+	case 2:
+		mask = 0x03 << ((h & 0x3) << 1);
+		return ((cp[h >> 2] & mask) == mask);
+	case 1:
+		mask = 0x01 << (h & 0x7);
+		return ((cp[h >> 3] & mask) == mask);
+	default:
+		panic("ffs_isblock");
+		break;
+	}
+	return (0);
+}
+
+/*
+ * check if a block is free
+ */
+int
+ffs_isfreeblock(Fs *fs, uint8_t *cp, ufs1_daddr_t h)
+{
+	switch ((int)fs->fs_frag) {
+	case 8:
+		return (cp[h] == 0);
+	case 4:
+		return ((cp[h >> 1] & (0x0f << ((h & 0x1) << 2))) == 0);
+	case 2:
+		return ((cp[h >> 2] & (0x03 << ((h & 0x3) << 1))) == 0);
+	case 1:
+		return ((cp[h >> 3] & (0x01 << (h & 0x7))) == 0);
+	default:
+		panic("ffs_isfreeblock");
+		break;
+	}
+	return (0);
+}
+
+/*
+ * take a block out of the map
+ */
+void
+ffs_clrblock(Fs *fs, uint8_t *cp, ufs1_daddr_t h)
+{
+	switch ((int)fs->fs_frag) {
+	case 8:
+		cp[h] = 0;
+		return;
+	case 4:
+		cp[h >> 1] &= ~(0x0f << ((h & 0x1) << 2));
+		return;
+	case 2:
+		cp[h >> 2] &= ~(0x03 << ((h & 0x3) << 1));
+		return;
+	case 1:
+		cp[h >> 3] &= ~(0x01 << (h & 0x7));
+		return;
+	default:
+		panic("ffs_clrblock");
+		break;
+	}
+}
+
+/*
+ * put a block into the map
+ */
+void
+ffs_setblock(Fs *fs, unsigned char *cp, ufs1_daddr_t h)
+{
+	switch ((int)fs->fs_frag) {
+
+	case 8:
+		cp[h] = 0xff;
+		return;
+	case 4:
+		cp[h >> 1] |= (0x0f << ((h & 0x1) << 2));
+		return;
+	case 2:
+		cp[h >> 2] |= (0x03 << ((h & 0x3) << 1));
+		return;
+	case 1:
+		cp[h >> 3] |= (0x01 << (h & 0x7));
+		return;
+	default:
+		panic("ffs_setblock");
+		break;
+	}
+}
+
+/*
+ * Update the cluster map because of an allocation or free.
+ *
+ * Cnt == 1 means free; cnt == -1 means allocating.
+ */
+void
+ffs_clusteracct(Fs *fs, Cg *cgp, ufs1_daddr_t blkno, int cnt)
+{
+	int32_t *sump;
+	int32_t *lp;
+	uint8_t *freemapp, *mapp;
+	int i, start, end, forw, back, map, bit;
+
+	if (fs->fs_contigsumsize <= 0)
+		return;
+	freemapp = cg_clustersfree(cgp);
+	sump = cg_clustersum(cgp);
+	/*
+	 * Allocate or clear the actual block.
+	 */
+	if (cnt > 0)
+		setbit(freemapp, blkno);
+	else
+		clrbit(freemapp, blkno);
+	/*
+	 * Find the size of the cluster going forward.
+	 */
+	start = blkno + 1;
+	end = start + fs->fs_contigsumsize;
+	if (end >= cgp->cg_nclusterblks)
+		end = cgp->cg_nclusterblks;
+	mapp = &freemapp[start / NBBY];
+	map = *mapp++;
+	bit = 1 << (start % NBBY);
+	for (i = start; i < end; i++) {
+		if ((map & bit) == 0)
+			break;
+		if ((i & (NBBY - 1)) != (NBBY - 1)) {
+			bit <<= 1;
+		} else {
+			map = *mapp++;
+			bit = 1;
+		}
+	}
+	forw = i - start;
+	/*
+	 * Find the size of the cluster going backward.
+	 */
+	start = blkno - 1;
+	end = start - fs->fs_contigsumsize;
+	if (end < 0)
+		end = -1;
+	mapp = &freemapp[start / NBBY];
+	map = *mapp--;
+	bit = 1 << (start % NBBY);
+	for (i = start; i > end; i--) {
+		if ((map & bit) == 0)
+			break;
+		if ((i & (NBBY - 1)) != 0) {
+			bit >>= 1;
+		} else {
+			map = *mapp--;
+			bit = 1 << (NBBY - 1);
+		}
+	}
+	back = start - i;
+	/*
+	 * Account for old cluster and the possibly new forward and
+	 * back clusters.
+	 */
+	i = back + forw + 1;
+	if (i > fs->fs_contigsumsize)
+		i = fs->fs_contigsumsize;
+	sump[i] += cnt;
+	if (back > 0)
+		sump[back] -= cnt;
+	if (forw > 0)
+		sump[forw] -= cnt;
+	/*
+	 * Update cluster summary information.
+	 */
+	lp = &sump[fs->fs_contigsumsize];
+	for (i = fs->fs_contigsumsize; i > 0; i--)
+		if (*lp-- > 0)
+			break;
+	fs->fs_maxcluster[cgp->cg_cgx] = i;
+}