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