Module Name:    src
Committed By:   perseant
Date:           Tue Jul  2 20:36:51 UTC 2024

Modified Files:
        src/distrib/sets/lists/comp [perseant-exfatfs]: mi
        src/sbin/fsck_exfatfs [perseant-exfatfs]: Makefile
        src/sys/fs/exfatfs [perseant-exfatfs]: Makefile exfatfs.h
            exfatfs_extern.c exfatfs_vfsops.c exfatfs_vnops.c files.exfatfs
        src/sys/rump/fs/lib/libexfatfs [perseant-exfatfs]: Makefile
        src/usr.sbin/dumpexfatfs [perseant-exfatfs]: Makefile dumpexfatfs.c
            exfatfs.c
Added Files:
        src/sys/fs/exfatfs [perseant-exfatfs]: exfatfs_balloc.c
            exfatfs_balloc.h
Removed Files:
        src/sys/fs/exfatfs [perseant-exfatfs]: exfatfs_trie_basic.c
            exfatfs_trie_basic.h

Log Message:
Remove exfatfs_trie.[ch] and references to it, since we were not using the
tries at all anyway.  Replace with the more aptly named exfatfs_balloc.[ch].


To generate a diff of this commit:
cvs rdiff -u -r1.2459.2.2 -r1.2459.2.3 src/distrib/sets/lists/comp/mi
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sbin/fsck_exfatfs/Makefile
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/fs/exfatfs/Makefile \
    src/sys/fs/exfatfs/files.exfatfs
cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/sys/fs/exfatfs/exfatfs.h \
    src/sys/fs/exfatfs/exfatfs_extern.c src/sys/fs/exfatfs/exfatfs_vfsops.c \
    src/sys/fs/exfatfs/exfatfs_vnops.c
cvs rdiff -u -r0 -r1.1.2.1 src/sys/fs/exfatfs/exfatfs_balloc.c \
    src/sys/fs/exfatfs/exfatfs_balloc.h
cvs rdiff -u -r1.1.2.2 -r0 src/sys/fs/exfatfs/exfatfs_trie_basic.c \
    src/sys/fs/exfatfs/exfatfs_trie_basic.h
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/rump/fs/lib/libexfatfs/Makefile
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/usr.sbin/dumpexfatfs/Makefile \
    src/usr.sbin/dumpexfatfs/dumpexfatfs.c src/usr.sbin/dumpexfatfs/exfatfs.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/sets/lists/comp/mi
diff -u src/distrib/sets/lists/comp/mi:1.2459.2.2 src/distrib/sets/lists/comp/mi:1.2459.2.3
--- src/distrib/sets/lists/comp/mi:1.2459.2.2	Mon Jul  1 00:59:48 2024
+++ src/distrib/sets/lists/comp/mi	Tue Jul  2 20:36:50 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: mi,v 1.2459.2.2 2024/07/01 00:59:48 perseant Exp $
+#	$NetBSD: mi,v 1.2459.2.3 2024/07/02 20:36:50 perseant Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 ./etc/mtree/set.comp				comp-sys-root
@@ -976,6 +976,7 @@
 ./usr/include/fs/efs/efs_sb.h			comp-c-include
 ./usr/include/fs/exfatfs			comp-c-include	exfatfs
 ./usr/include/fs/exfatfs/exfatfs.h		comp-c-include	exfatfs
+./usr/include/fs/exfatfs/exfatfs_balloc.h	comp-c-include	exfatfs
 ./usr/include/fs/exfatfs/exfatfs_cksum.h	comp-c-include	exfatfs
 ./usr/include/fs/exfatfs/exfatfs_conv.h		comp-c-include	exfatfs
 ./usr/include/fs/exfatfs/exfatfs_dirent.h	comp-c-include	exfatfs
@@ -983,7 +984,6 @@
 ./usr/include/fs/exfatfs/exfatfs_inode.h	comp-c-include	exfatfs
 ./usr/include/fs/exfatfs/exfatfs_mount.h	comp-c-include	exfatfs
 ./usr/include/fs/exfatfs/exfatfs_tables.h	comp-c-include	exfatfs
-./usr/include/fs/exfatfs/exfatfs_trie.h		comp-c-include	exfatfs
 ./usr/include/fs/exfatfs/exfatfs_vfsops.h	comp-c-include	exfatfs
 ./usr/include/fs/exfatfs/exfatfs_vnops.h	comp-c-include	exfatfs
 ./usr/include/fs/hfs/hfs.h			comp-c-include

Index: src/sbin/fsck_exfatfs/Makefile
diff -u src/sbin/fsck_exfatfs/Makefile:1.1.2.1 src/sbin/fsck_exfatfs/Makefile:1.1.2.2
--- src/sbin/fsck_exfatfs/Makefile:1.1.2.1	Sat Jun 29 19:43:25 2024
+++ src/sbin/fsck_exfatfs/Makefile	Tue Jul  2 20:36:50 2024
@@ -1,10 +1,12 @@
-# $NetBSD: Makefile,v 1.1.2.1 2024/06/29 19:43:25 perseant Exp $
+# $NetBSD: Makefile,v 1.1.2.2 2024/07/02 20:36:50 perseant Exp $
 
 .include <bsd.own.mk>
 
 PROG=	fsck_exfatfs
 MAN=	fsck_exfatfs.8
-SRCS=	fsck_exfatfs.c exfatfs.c partutil.c bufcache.c exfatfs_cksum.c exfatfs_conv.c exfatfs_extern.c exfatfs_tables.c exfatfs_trie.c vnode.c kernelops.c pass0.c pass1.c pass2.c fsutil.c
+SRCS=	fsck_exfatfs.c exfatfs.c partutil.c bufcache.c exfatfs_balloc.c \
+	exfatfs_cksum.c exfatfs_conv.c exfatfs_extern.c exfatfs_tables.c \
+	vnode.c kernelops.c pass0.c pass1.c pass2.c fsutil.c
 
 LDADD+= -lutil
 DPADD+= ${LIBUTIL}

Index: src/sys/fs/exfatfs/Makefile
diff -u src/sys/fs/exfatfs/Makefile:1.1.2.1 src/sys/fs/exfatfs/Makefile:1.1.2.2
--- src/sys/fs/exfatfs/Makefile:1.1.2.1	Sat Jun 29 19:43:26 2024
+++ src/sys/fs/exfatfs/Makefile	Tue Jul  2 20:36:50 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.1.2.1 2024/06/29 19:43:26 perseant Exp $
+#	$NetBSD: Makefile,v 1.1.2.2 2024/07/02 20:36:50 perseant Exp $
 
 .include <bsd.own.mk>
 
@@ -6,12 +6,15 @@ CFLAGS=-I../.. -I.
 
 .if ${MKEXFATFS} != "no"
 INCSDIR= /usr/include/fs/exfatfs
-INCS=	exfatfs.h exfatfs_cksum.h exfatfs_conv.h exfatfs_dirent.h exfatfs_extern.h exfatfs_inode.h exfatfs_mount.h exfatfs_tables.h exfatfs_trie.h exfatfs_vfsops.h exfatfs_vnops.h
+INCS=	exfatfs.h exfatfs_balloc.h exfatfs_cksum.h exfatfs_conv.h \
+	exfatfs_dirent.h exfatfs_extern.h exfatfs_inode.h exfatfs_mount.h \
+	exfatfs_tables.h exfatfs_vfsops.h exfatfs_vnops.h
 .endif
 
 .include <bsd.kinc.mk>
 
-USEROBJ=exfatfs_cksum.o exfatfs_conv.o exfatfs_tables.o exfatfs_trie.o exfatfs_vfsops.o exfatfs_vnops.o
+USEROBJ=exfatfs_balloc.o exfatfs_cksum.o exfatfs_conv.o exfatfs_tables.o \
+	exfatfs_vfsops.o exfatfs_vnops.o
 userland: $(USEROBJ)
 
 userclean:
Index: src/sys/fs/exfatfs/files.exfatfs
diff -u src/sys/fs/exfatfs/files.exfatfs:1.1.2.1 src/sys/fs/exfatfs/files.exfatfs:1.1.2.2
--- src/sys/fs/exfatfs/files.exfatfs:1.1.2.1	Sat Jun 29 19:43:26 2024
+++ src/sys/fs/exfatfs/files.exfatfs	Tue Jul  2 20:36:50 2024
@@ -1,13 +1,13 @@
-#	$NetBSD: files.exfatfs,v 1.1.2.1 2024/06/29 19:43:26 perseant Exp $
+#	$NetBSD: files.exfatfs,v 1.1.2.2 2024/07/02 20:36:50 perseant Exp $
 
 deffs	EXFATFS
 
 define	exfatfs: vfs
+file	fs/exfatfs/exfatfs_balloc.c		exfatfs
 file	fs/exfatfs/exfatfs_cksum.c		exfatfs
 file	fs/exfatfs/exfatfs_conv.c		exfatfs
 file	fs/exfatfs/exfatfs_extern.c		exfatfs
 file	fs/exfatfs/exfatfs_rename.c		exfatfs
 file	fs/exfatfs/exfatfs_tables.c		exfatfs
-file	fs/exfatfs/exfatfs_trie.c		exfatfs
 file	fs/exfatfs/exfatfs_vfsops.c		exfatfs
 file	fs/exfatfs/exfatfs_vnops.c		exfatfs

Index: src/sys/fs/exfatfs/exfatfs.h
diff -u src/sys/fs/exfatfs/exfatfs.h:1.1.2.2 src/sys/fs/exfatfs/exfatfs.h:1.1.2.3
--- src/sys/fs/exfatfs/exfatfs.h:1.1.2.2	Mon Jul  1 22:15:21 2024
+++ src/sys/fs/exfatfs/exfatfs.h	Tue Jul  2 20:36:50 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: exfatfs.h,v 1.1.2.2 2024/07/01 22:15:21 perseant Exp $ */
+/* $NetBSD: exfatfs.h,v 1.1.2.3 2024/07/02 20:36:50 perseant Exp $ */
 
 /*-
  * Copyright (c) 2022, 2024 The NetBSD Foundation, Inc.
@@ -37,8 +37,6 @@
 
 #define USE_FATCACHE
 
-struct xf_bitmap_node;
-
 #define EXFATFS_BOOTBLOCK_PRIMARY_FSSEC   0
 #define EXFATFS_BOOTBLOCK_SECONDARY_FSSEC 12
 
@@ -114,7 +112,6 @@ struct exfatfs {
 	struct vnode *xf_upcasevp; /* XXX not needed? */
 	STAILQ_HEAD(, exfatfs_upcase_range_offset) xf_eurolist;
 	LIST_HEAD(, xfinode) xf_newxip;
-	struct xf_bitmap_node *xf_bitmap_trie;
 	int xf_bitmap_toplevel;
 	uint32_t xf_FreeClusterCount;
 	uint32_t xf_dirmask;
Index: src/sys/fs/exfatfs/exfatfs_extern.c
diff -u src/sys/fs/exfatfs/exfatfs_extern.c:1.1.2.2 src/sys/fs/exfatfs/exfatfs_extern.c:1.1.2.3
--- src/sys/fs/exfatfs/exfatfs_extern.c:1.1.2.2	Mon Jul  1 22:15:21 2024
+++ src/sys/fs/exfatfs/exfatfs_extern.c	Tue Jul  2 20:36:50 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: exfatfs_extern.c,v 1.1.2.2 2024/07/01 22:15:21 perseant Exp $	*/
+/*	$NetBSD: exfatfs_extern.c,v 1.1.2.3 2024/07/02 20:36:50 perseant Exp $	*/
 
 /*-
  * Copyright (c) 2022 The NetBSD Foundation, Inc.
@@ -52,13 +52,13 @@ typedef struct uvvnode uvnode_t;
 #endif
 
 #include <fs/exfatfs/exfatfs.h>
+#include <fs/exfatfs/exfatfs_balloc.h>
 #include <fs/exfatfs/exfatfs_cksum.h>
 #include <fs/exfatfs/exfatfs_conv.h>
 #include <fs/exfatfs/exfatfs_dirent.h>
 #include <fs/exfatfs/exfatfs_extern.h>
 #include <fs/exfatfs/exfatfs_inode.h>
 #include <fs/exfatfs/exfatfs_extern.h>
-#include <fs/exfatfs/exfatfs_trie.h>
 #include <fs/exfatfs/exfatfs_vfsops.h>
 
 /* #define EXFATFS_EXTERN_DEBUG */
@@ -390,7 +390,7 @@ int exfatfs_mountfs_shared(struct vnode 
 	/*
 	 * Initialize data structure for finding free clusters.
 	 */
-	if ((error = exfatfs_bitmap_init(fs, 1)) != 0) {
+	if ((error = exfatfs_bitmap_init(fs)) != 0) {
 		DPRINTF(("Bitmap init failed with %d\n", error));
 		goto error_exit;
 	}
Index: src/sys/fs/exfatfs/exfatfs_vfsops.c
diff -u src/sys/fs/exfatfs/exfatfs_vfsops.c:1.1.2.2 src/sys/fs/exfatfs/exfatfs_vfsops.c:1.1.2.3
--- src/sys/fs/exfatfs/exfatfs_vfsops.c:1.1.2.2	Mon Jul  1 22:15:21 2024
+++ src/sys/fs/exfatfs/exfatfs_vfsops.c	Tue Jul  2 20:36:50 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: exfatfs_vfsops.c,v 1.1.2.2 2024/07/01 22:15:21 perseant Exp $ */
+/* $NetBSD: exfatfs_vfsops.c,v 1.1.2.3 2024/07/02 20:36:50 perseant Exp $ */
 
 /*-
  * Copyright (c) 2022 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exfatfs_vfsops.c,v 1.1.2.2 2024/07/01 22:15:21 perseant Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exfatfs_vfsops.c,v 1.1.2.3 2024/07/02 20:36:50 perseant Exp $");
 
 struct vm_page;
 
@@ -54,15 +54,15 @@ struct vm_page;
 #include <sys/module.h>
 
 #include <fs/exfatfs/exfatfs.h>
+#include <fs/exfatfs/exfatfs_balloc.h>
 #include <fs/exfatfs/exfatfs_cksum.h>
 #include <fs/exfatfs/exfatfs_conv.h>
 #include <fs/exfatfs/exfatfs_extern.h>
 #include <fs/exfatfs/exfatfs_inode.h>
 #include <fs/exfatfs/exfatfs_mount.h>
-#include <fs/exfatfs/exfatfs_trie.h>
 #include <fs/exfatfs/exfatfs_vfsops.h>
 
-#define EXFATFS_VFSOPS_DEBUG
+/* #define EXFATFS_VFSOPS_DEBUG */
 #ifdef EXFATFS_VFSOPS_DEBUG
 # define DPRINTF(x) printf x
 #else
@@ -195,8 +195,6 @@ exfatfs_init(void)
   	pool_init(&exfatfs_xfinode_pool, sizeof(struct xfinode), 0, 0, 0,
 	    "exfatfsinopl", &pool_allocator_nointr, IPL_NONE);
 	pool_sethiwat(&exfatfs_xfinode_pool, 1);
-  	pool_init(&exfatfs_bitmap_pool, sizeof(struct xf_bitmap_node), 0, 0, 0,
-	    "exfatfsbitpl", &pool_allocator_nointr, IPL_NONE);
 	pool_sethiwat(&exfatfs_bitmap_pool, 1);
   	pool_init(&exfatfs_dirent_pool, sizeof(struct exfatfs_dirent), 0, 0, 0,
 	    "exfatfsdirentpl", &pool_allocator_nointr, IPL_NONE);
Index: src/sys/fs/exfatfs/exfatfs_vnops.c
diff -u src/sys/fs/exfatfs/exfatfs_vnops.c:1.1.2.2 src/sys/fs/exfatfs/exfatfs_vnops.c:1.1.2.3
--- src/sys/fs/exfatfs/exfatfs_vnops.c:1.1.2.2	Mon Jul  1 22:15:21 2024
+++ src/sys/fs/exfatfs/exfatfs_vnops.c	Tue Jul  2 20:36:50 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: exfatfs_vnops.c,v 1.1.2.2 2024/07/01 22:15:21 perseant Exp $	*/
+/*	$NetBSD: exfatfs_vnops.c,v 1.1.2.3 2024/07/02 20:36:50 perseant Exp $	*/
 
 /*-
  * Copyright (c) 2022 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exfatfs_vnops.c,v 1.1.2.2 2024/07/01 22:15:21 perseant Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exfatfs_vnops.c,v 1.1.2.3 2024/07/02 20:36:50 perseant Exp $");
 
 #include <sys/buf.h>
 #include <sys/dirent.h>
@@ -53,6 +53,7 @@ __KERNEL_RCSID(0, "$NetBSD: exfatfs_vnop
 #include <uvm/uvm_extern.h>
 
 #include <fs/exfatfs/exfatfs.h>
+#include <fs/exfatfs/exfatfs_balloc.h>
 #include <fs/exfatfs/exfatfs_conv.h>
 #include <fs/exfatfs/exfatfs_cksum.h>
 #include <fs/exfatfs/exfatfs_dirent.h>
@@ -60,7 +61,6 @@ __KERNEL_RCSID(0, "$NetBSD: exfatfs_vnop
 #include <fs/exfatfs/exfatfs_mount.h>
 #include <fs/exfatfs/exfatfs_inode.h>
 #include <fs/exfatfs/exfatfs_rename.h>
-#include <fs/exfatfs/exfatfs_trie.h>
 #include <fs/exfatfs/exfatfs_tables.h>
 #include <fs/exfatfs/exfatfs_vnops.h>
 #include <fs/exfatfs/exfatfs_vfsops.h>

Index: src/sys/rump/fs/lib/libexfatfs/Makefile
diff -u src/sys/rump/fs/lib/libexfatfs/Makefile:1.1.2.1 src/sys/rump/fs/lib/libexfatfs/Makefile:1.1.2.2
--- src/sys/rump/fs/lib/libexfatfs/Makefile:1.1.2.1	Sat Jun 29 19:43:26 2024
+++ src/sys/rump/fs/lib/libexfatfs/Makefile	Tue Jul  2 20:36:51 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.1.2.1 2024/06/29 19:43:26 perseant Exp $
+#	$NetBSD: Makefile,v 1.1.2.2 2024/07/02 20:36:51 perseant Exp $
 #
 
 .PATH:  ${.CURDIR}/../../../../fs/exfatfs
@@ -6,9 +6,8 @@
 LIB=	rumpfs_exfatfs
 COMMENT=Microsoft exFAT file system
 
-SRCS=	exfatfs_cksum.c exfatfs_conv.c exfatfs_extern.c \
-	exfatfs_rename.c exfatfs_tables.c \
-	exfatfs_trie_basic.c exfatfs_vfsops.c exfatfs_vnops.c
+SRCS=	exfatfs_balloc.c exfatfs_cksum.c exfatfs_conv.c exfatfs_extern.c \
+	exfatfs_rename.c exfatfs_tables.c exfatfs_vfsops.c exfatfs_vnops.c
 
 CPPFLAGS+=
 

Index: src/usr.sbin/dumpexfatfs/Makefile
diff -u src/usr.sbin/dumpexfatfs/Makefile:1.1.2.1 src/usr.sbin/dumpexfatfs/Makefile:1.1.2.2
--- src/usr.sbin/dumpexfatfs/Makefile:1.1.2.1	Sat Jun 29 19:43:27 2024
+++ src/usr.sbin/dumpexfatfs/Makefile	Tue Jul  2 20:36:51 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.1.2.1 2024/06/29 19:43:27 perseant Exp $
+#	$NetBSD: Makefile,v 1.1.2.2 2024/07/02 20:36:51 perseant Exp $
 #	@(#)Makefile	8.1 (Berkeley) 6/18/93
 
 WARNS?=	3	# XXX -Wsign-compare
@@ -7,7 +7,9 @@ WARNS?=	3	# XXX -Wsign-compare
 
 CFLAGS+=-g
 PROG=	dumpexfatfs
-SRCS=	dumpexfatfs.c exfatfs.c exfatfs_cksum.c exfatfs_conv.c exfatfs_extern.c exfatfs_trie_basic.c exfatfs_tables.c bufcache.c vnode.c kernelops.c
+SRCS=	dumpexfatfs.c exfatfs.c exfatfs_cksum.c exfatfs_balloc.c \
+	exfatfs_conv.c exfatfs_extern.c exfatfs_tables.c \
+	bufcache.c vnode.c kernelops.c
 .PATH:	${NETBSDSRCDIR}/sys/fs/exfatfs
 MAN=	dumpexfatfs.8
 LDADD+=	-lutil
Index: src/usr.sbin/dumpexfatfs/dumpexfatfs.c
diff -u src/usr.sbin/dumpexfatfs/dumpexfatfs.c:1.1.2.1 src/usr.sbin/dumpexfatfs/dumpexfatfs.c:1.1.2.2
--- src/usr.sbin/dumpexfatfs/dumpexfatfs.c:1.1.2.1	Sat Jun 29 19:43:27 2024
+++ src/usr.sbin/dumpexfatfs/dumpexfatfs.c	Tue Jul  2 20:36:51 2024
@@ -19,11 +19,11 @@
 #define buf ubuf
 
 #include <fs/exfatfs/exfatfs.h>
+#include <fs/exfatfs/exfatfs_balloc.h>
 #include <fs/exfatfs/exfatfs_cksum.h>
 #include <fs/exfatfs/exfatfs_conv.h>
 #include <fs/exfatfs/exfatfs_dirent.h>
 #include <fs/exfatfs/exfatfs_extern.h>
-#include <fs/exfatfs/exfatfs_trie.h>
 
 #include "vnode.h"
 #include "bufcache.h"
Index: src/usr.sbin/dumpexfatfs/exfatfs.c
diff -u src/usr.sbin/dumpexfatfs/exfatfs.c:1.1.2.1 src/usr.sbin/dumpexfatfs/exfatfs.c:1.1.2.2
--- src/usr.sbin/dumpexfatfs/exfatfs.c:1.1.2.1	Sat Jun 29 19:43:27 2024
+++ src/usr.sbin/dumpexfatfs/exfatfs.c	Tue Jul  2 20:36:51 2024
@@ -37,10 +37,10 @@
 #define vnode uvnode
 #define buf ubuf
 #include <fs/exfatfs/exfatfs.h>
+#include <fs/exfatfs/exfatfs_balloc.h> /* for bitmap_init */
 #include <fs/exfatfs/exfatfs_dirent.h>
 #include <fs/exfatfs/exfatfs_extern.h>
 #include <fs/exfatfs/exfatfs_inode.h>
-#include <fs/exfatfs/exfatfs_trie.h> /* for bitmap_init */
 #include <fs/exfatfs/exfatfs_vfsops.h> /* for getnewvnode */
 #undef buf
 #undef vnode

Added files:

Index: src/sys/fs/exfatfs/exfatfs_balloc.c
diff -u /dev/null src/sys/fs/exfatfs/exfatfs_balloc.c:1.1.2.1
--- /dev/null	Tue Jul  2 20:36:51 2024
+++ src/sys/fs/exfatfs/exfatfs_balloc.c	Tue Jul  2 20:36:50 2024
@@ -0,0 +1,247 @@
+/*	$NetBSD: exfatfs_balloc.c,v 1.1.2.1 2024/07/02 20:36:50 perseant Exp $	*/
+
+/*-
+ * Copyright (c) 2022, 2024 The NetBSD Foundation, Inc.
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: exfatfs_balloc.c,v 1.1.2.1 2024/07/02 20:36:50 perseant Exp $");
+
+#include <sys/types.h>
+#include <sys/buf.h>
+#ifdef _KERNEL
+# include <sys/vnode.h>
+#else
+# include <assert.h>
+# include "vnode.h"
+# include "bufcache.h"
+typedef struct uvnode uvnode_t;
+# define vnode uvnode
+# define vnode_t uvnode_t
+# define buf ubuf
+# define bdwrite bwrite
+#endif
+
+#include <fs/exfatfs/exfatfs.h>
+#include <fs/exfatfs/exfatfs_balloc.h>
+#include <fs/exfatfs/exfatfs_extern.h>
+#include <fs/exfatfs/exfatfs_inode.h>
+#include <fs/exfatfs/exfatfs_mount.h>
+
+#ifndef _KERNEL
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+# include <errno.h>
+#endif
+
+/* #define EXFATFS_BALLOC_DEBUG */
+
+#ifdef EXFATFS_BALLOC_DEBUG
+# define DPRINTF(x) printf x
+#else
+# define DPRINTF(x) __nothing
+#endif
+
+/*
+ * Routines to create and manage a compressed cluster bitmap.
+ */
+
+extern struct pool exfatfs_bitmap_pool;
+
+/*
+ * Convert a cluster ID into a disk address
+ */
+extern u_int64_t exfatfs_lookup_bitmap_blk(uint32_t);
+
+/* How many bits are set in a byte of a given value */
+static uint8_t byte2bitcount[256] = {
+	0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 
+	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 
+	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 
+	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
+	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 
+	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
+	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
+	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 
+	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 
+	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
+	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
+	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 
+	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
+	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 
+	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 
+	4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
+};
+
+/*
+ * Find the next free cluster after "start" and allocate it.
+ */
+int
+exfatfs_bitmap_alloc(struct exfatfs *fs, uint32_t start, uint32_t *cp)
+{
+	daddr_t lbn, blkno;
+	uint32_t r, ostart, c;
+	struct buf *bp;
+	int off, error;
+	uint8_t *data;
+	uint32_t end;
+	
+	if (start < 2)
+		start = 2;
+	end = fs->xf_ClusterCount + 2;
+	
+	DPRINTF(("basic allocate cluster start=%u\n", (unsigned)start));
+	
+	ostart = start;
+	c = 0;
+	do {
+		lbn = BITMAPLBN(fs, start);
+		off = BITMAPOFF(fs, start);
+		DPRINTF((" LBNOFF2CLUSTER(%u,%u)=%u, end=%u\n",
+			 (unsigned)lbn, (unsigned)off,
+			 (unsigned)LBNOFF2CLUSTER(fs, lbn, off),
+			 (unsigned)end));
+		while (LBNOFF2CLUSTER(fs, lbn, off) < end) {
+			exfatfs_bmap_shared(fs->xf_bitmapvp, lbn, NULL, &blkno,
+					    NULL);
+			DPRINTF((" lbn %u -> bn 0x%x\n",
+				 (unsigned)lbn, (unsigned)blkno));
+			if ((error = bread(fs->xf_devvp, blkno, LBNSIZE(fs), 0,
+					   &bp)) != 0)
+				return error;
+			DPRINTF((" search %u..%u\n",
+				(unsigned)off,
+				(unsigned)(1 << BITMAPSHIFT(fs))));
+			while (off < (1 << BITMAPSHIFT(fs))
+			       && LBNOFF2CLUSTER(fs, lbn, off) < end) {
+				data = (uint8_t *)bp->b_data;
+				if (isclr(data, off)) {
+					r = LBNOFF2CLUSTER(fs, lbn, off);
+					break;
+				}
+				++off;
+			}
+			if (r != INVALID) {
+				assert(r >= 2 && r < fs->xf_ClusterCount - 2);
+				DPRINTF(("basic allocate cluster %u/%u"
+					 " at lbn %u bit %d\n",
+					 (unsigned)r, (unsigned)end,
+					 (unsigned)lbn, (int)off));
+				setbit(data, off);
+				bdwrite(bp);
+				--fs->xf_FreeClusterCount;
+				if (cp != NULL)
+					*cp = r;
+				return 0;
+			} else
+				brelse(bp, 0);
+			++lbn;
+			off = 0;
+			assert(++c <= 2 * fs->xf_ClusterCount);
+		}
+		if (start == ostart && start > 2) {
+			end = start;
+			start = 2;
+			DPRINTF((" not found, now start=%u end=%u\n",
+				 (unsigned)start, (unsigned)end));
+			continue;
+		}
+	} while (0);
+	
+	return ENOSPC;
+}
+
+int
+exfatfs_bitmap_dealloc(struct exfatfs *fs, uint32_t cno)
+{
+	daddr_t lbn, blkno;
+	struct buf *bp;
+	int off, error;
+	uint8_t *data;
+	
+	lbn = BITMAPLBN(fs, cno);
+	off = BITMAPOFF(fs, cno);
+	exfatfs_bmap_shared(fs->xf_bitmapvp, lbn, NULL, &blkno, NULL);
+	if ((error = bread(fs->xf_devvp, blkno, LBNSIZE(fs), 0, &bp)) != 0)
+		return error;
+	data = (uint8_t *)bp->b_data;
+	DPRINTF(("basic deallocate cluster %u at lbn %u bit %d\n",
+		 (unsigned)cno, (unsigned)lbn, (int)off));
+	clrbit(data, off);
+	bdwrite(bp);
+	++fs->xf_FreeClusterCount;
+	return 0;
+}
+
+int
+exfatfs_bitmap_init(struct exfatfs *fs)
+{
+	daddr_t lbn, blkno;
+	uint32_t cn, end;
+	struct buf *bp;
+	int i, off;
+	uint8_t *data = NULL;
+	
+	/* Scan the bitmap to discover how many clusters are free */
+	fs->xf_FreeClusterCount = fs->xf_ClusterCount;
+
+	end = fs->xf_ClusterCount + 2;
+	cn = 2;
+	bp = NULL;
+	while (cn < end) {
+		if (BITMAPOFF(fs, cn) == 0) {
+			if (bp != NULL)
+				brelse(bp, 0);
+			lbn = BITMAPLBN(fs, cn);
+			exfatfs_bmap_shared(fs->xf_bitmapvp, lbn, NULL,
+					    &blkno, NULL);
+			bread(fs->xf_devvp, blkno, LBNSIZE(fs), 0, &bp);
+			data = (uint8_t *)bp->b_data;
+		}
+		for (off = 0; off < LBNSIZE(fs) && cn < end; ++off) {
+			if (cn >= end - NBBY) {
+				for (i = 0; i < NBBY && cn < end; i++) {
+					if (data[off] & (1 << i))
+						--fs->xf_FreeClusterCount;
+					++cn;
+				}
+			} else {
+				fs->xf_FreeClusterCount
+					-= byte2bitcount[data[off]];
+				cn += NBBY;
+			}
+		}
+	}
+	if (bp)
+		brelse(bp, 0);
+
+	return 0;
+}
+
+void
+exfatfs_bitmap_destroy(struct exfatfs *fs)
+{
+}
Index: src/sys/fs/exfatfs/exfatfs_balloc.h
diff -u /dev/null src/sys/fs/exfatfs/exfatfs_balloc.h:1.1.2.1
--- /dev/null	Tue Jul  2 20:36:51 2024
+++ src/sys/fs/exfatfs/exfatfs_balloc.h	Tue Jul  2 20:36:50 2024
@@ -0,0 +1,52 @@
+/* $NetBSD: exfatfs_balloc.h,v 1.1.2.1 2024/07/02 20:36:50 perseant Exp $ */
+
+/*-
+ * Copyright (c) 2022, 2024 The NetBSD Foundation, Inc.
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+#ifndef EXFATFS_BALLOC_H_
+#define EXFATFS_BALLOC_H_
+
+/* XXX we need MAXPHYSSHIFT */
+#define MAXPSHIFT 16
+#define MAXPSIZE (1 << MAXPSHIFT) /* Must be <= MAXPHYS */
+
+/* Convert cluster number to disk address and offset */
+#define NBBYSHIFT		3 /* 1 << NBBYSHIFT == NBBY == 8 */
+#define LBNSIZE(fs)		(1 << LBNSHIFT(fs))
+#define LBNSHIFT(fs)		MIN(MAXPSHIFT, ((fs)->xf_BytesPerSectorShift + \
+                                (fs)->xf_SectorsPerClusterShift))
+#define LBNOFF2CLUSTER(fs, lbn, off) ((lbn << BITMAPSHIFT(fs)) + (off) + 2)
+#define BITMAPSHIFT(fs)		(LBNSHIFT(fs) + NBBYSHIFT)
+#define BITMAPLBN(fs, cn)	(((cn) - 2) >> BITMAPSHIFT(fs))
+#define BITMAPOFF(fs, cn)	(((cn) - 2) & ((1 << BITMAPSHIFT(fs)) - 1))
+#define INVALID			(~(uint32_t)0)
+
+int exfatfs_bitmap_init(struct exfatfs *);
+void exfatfs_bitmap_destroy(struct exfatfs *);
+int exfatfs_bitmap_alloc(struct exfatfs *, uint32_t, uint32_t *);
+int exfatfs_bitmap_dealloc(struct exfatfs *, uint32_t);
+
+#endif /* EXFATFS_BALLOC_H_ */

Reply via email to