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_ */