Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F103027529
D25563.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D25563.diff
View Options
Index: head/sbin/newfs_msdos/mkfs_msdos.c
===================================================================
--- head/sbin/newfs_msdos/mkfs_msdos.c
+++ head/sbin/newfs_msdos/mkfs_msdos.c
@@ -41,8 +41,10 @@
#include <sys/mount.h>
#endif
#include <sys/stat.h>
+#include <sys/sysctl.h>
#include <sys/time.h>
+#include <assert.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
@@ -78,25 +80,6 @@
#define MAXCLS16 0xfff4U /* maximum FAT16 clusters */
#define MAXCLS32 0xffffff4U /* maximum FAT32 clusters */
-#ifndef CTASSERT
-#define CTASSERT(x) _CTASSERT(x, __LINE__)
-#define _CTASSERT(x, y) __CTASSERT(x, y)
-#define __CTASSERT(x, y) typedef char __assert_ ## y [(x) ? 1 : -1]
-#endif
-
-/*
- * For better performance, we want to write larger chunks instead of
- * individual sectors (the size can only be 512, 1024, 2048 or 4096
- * bytes). Assert that MAXPHYS can always hold an integer number of
- * sectors by asserting that both are power of two numbers and the
- * MAXPHYS is greater than MAXBPS.
- */
-CTASSERT(powerof2(MAXPHYS));
-CTASSERT(powerof2(MAXBPS));
-CTASSERT(MAXPHYS > MAXBPS);
-
-const static ssize_t chunksize = MAXPHYS;
-
#define mincls(fat) ((fat) == 12 ? MINCLS12 : \
(fat) == 16 ? MINCLS16 : \
MINCLS32)
@@ -240,6 +223,7 @@
static void infohandler(int);
static int check_mounted(const char *, mode_t);
+static ssize_t getchunksize(void);
static int getstdfmt(const char *, struct bpb *);
static int getdiskinfo(int, const char *, const char *, int, struct bpb *);
static void print_bpb(struct bpb *);
@@ -272,6 +256,7 @@
bool set_res, set_spf, set_spc;
int fd, fd1, rv;
struct msdos_options o = *op;
+ ssize_t chunksize;
physbuf = NULL;
rv = -1;
@@ -640,6 +625,7 @@
tm = localtime(&now);
}
+ chunksize = getchunksize();
physbuf = malloc(chunksize);
if (physbuf == NULL) {
warn(NULL);
@@ -848,6 +834,47 @@
}
#endif
return 0;
+}
+
+/*
+ * Get optimal I/O size
+ */
+static ssize_t
+getchunksize(void)
+{
+ static int chunksize;
+
+ if (chunksize != 0)
+ return ((ssize_t)chunksize);
+
+#ifdef KERN_MAXPHYS
+ int mib[2];
+ size_t len;
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_MAXPHYS;
+ len = sizeof(chunksize);
+
+ if (sysctl(mib, 2, &chunksize, &len, NULL, 0) == -1) {
+ warn("sysctl: KERN_MAXPHYS, using %zu", (size_t)MAXPHYS);
+ chunksize = 0;
+ }
+#endif
+ if (chunksize == 0)
+ chunksize = MAXPHYS;
+
+ /*
+ * For better performance, we want to write larger chunks instead of
+ * individual sectors (the size can only be 512, 1024, 2048 or 4096
+ * bytes). Assert that chunksize can always hold an integer number of
+ * sectors by asserting that both are power of two numbers and the
+ * chunksize is greater than MAXBPS.
+ */
+ static_assert(powerof2(MAXBPS), "MAXBPS is not power of 2");
+ assert(powerof2(chunksize));
+ assert(chunksize > MAXBPS);
+
+ return ((ssize_t)chunksize);
}
/*
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Nov 21, 12:14 AM (21 h, 31 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14750393
Default Alt Text
D25563.diff (2 KB)
Attached To
Mode
D25563: Use KERN_MAXPHYS.
Attached
Detach File
Event Timeline
Log In to Comment