Module Name:    src
Committed By:   perseant
Date:           Wed Jul  3 18:41:08 UTC 2024

Modified Files:
        src/sys/fs/exfatfs [perseant-exfatfs]: exfatfs_balloc.c

Log Message:
Correct logic to search the beginning of the bitmap too, if we started
in the middle.

Correct a sign error that triggered a spurious assertion failure.


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/fs/exfatfs/exfatfs_balloc.c

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

Modified files:

Index: src/sys/fs/exfatfs/exfatfs_balloc.c
diff -u src/sys/fs/exfatfs/exfatfs_balloc.c:1.1.2.1 src/sys/fs/exfatfs/exfatfs_balloc.c:1.1.2.2
--- src/sys/fs/exfatfs/exfatfs_balloc.c:1.1.2.1	Tue Jul  2 20:36:50 2024
+++ src/sys/fs/exfatfs/exfatfs_balloc.c	Wed Jul  3 18:41:08 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: exfatfs_balloc.c,v 1.1.2.1 2024/07/02 20:36:50 perseant Exp $	*/
+/*	$NetBSD: exfatfs_balloc.c,v 1.1.2.2 2024/07/03 18:41:08 perseant Exp $	*/
 
 /*-
  * Copyright (c) 2022, 2024 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exfatfs_balloc.c,v 1.1.2.1 2024/07/02 20:36:50 perseant Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exfatfs_balloc.c,v 1.1.2.2 2024/07/03 18:41:08 perseant Exp $");
 
 #include <sys/types.h>
 #include <sys/buf.h>
@@ -145,7 +145,7 @@ exfatfs_bitmap_alloc(struct exfatfs *fs,
 				++off;
 			}
 			if (r != INVALID) {
-				assert(r >= 2 && r < fs->xf_ClusterCount - 2);
+				assert(r >= 2 && r < fs->xf_ClusterCount + 2);
 				DPRINTF(("basic allocate cluster %u/%u"
 					 " at lbn %u bit %d\n",
 					 (unsigned)r, (unsigned)end,
@@ -162,15 +162,19 @@ exfatfs_bitmap_alloc(struct exfatfs *fs,
 			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);
+
+		/* If we've searched everywhere, we are done */
+		if (start != ostart || ostart <= 2)
+			break;
+
+		/* We've only searched the end.  Now search the begninning. */
+		end = start;
+		start = 2;
+		DPRINTF((" not found, now start=%u end=%u\n",
+			 (unsigned)start, (unsigned)end));
+	} while (1);
 	
+	DPRINTF(("no clusters to allocate, returning ENOSPC\n"));
 	return ENOSPC;
 }
 

Reply via email to