MFC r362937: Use KERN_MAXPHYS.

This commit is contained in:
Xin LI committed 2020-07-19 01:59:56 +00:00
1 parent 0122652042
commit 439ff9053e
1 file changed
+46 -19
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/stable/12/; revision=363315
+46 -19
View File
@@ -36,8 +36,10 @@ static const char rcsid[] =
#include <sys/disklabel.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/sysctl.h>
#include <sys/time.h>
#include <assert.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
@@ -73,25 +75,6 @@ static const char rcsid[] =
#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)
@@ -235,6 +218,7 @@ static volatile sig_atomic_t got_siginfo;
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 *);
@@ -267,6 +251,7 @@ mkfs_msdos(const char *fname, const char *dtype, const struct msdos_options *op)
bool set_res, set_spf, set_spc;
int fd, fd1, rv;
struct msdos_options o = *op;
ssize_t chunksize;
physbuf = NULL;
rv = -1;
@@ -629,6 +614,7 @@ mkfs_msdos(const char *fname, const char *dtype, const struct msdos_options *op)
tm = localtime(&now);
}
chunksize = getchunksize();
physbuf = malloc(chunksize);
if (physbuf == NULL) {
warn(NULL);
@@ -831,6 +817,47 @@ check_mounted(const char *fname, mode_t mode)
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);
}
/*
* Get a standard format.
*/