mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
FreeBSD: Add posix_fadvise(POSIX_FADV_WILLNEED) support
As commit 320f0c6 did for Linux, connect POSIX_FADV_WILLNEED
up to dmu_prefetch() on FreeBSD.
While there, fix portability problems in tests/functional/fadvise.
1. Instead of relying on the numerical values of POSIX_FADV_XXX macros,
accept macro names as arguments to the file_fadvise program. (The
numbers happen to match on Linux and FreeBSD, but future systems may
vary and it seems a little strange/raw to count on that.)
2. For implementation reasons, SEQUENTIAL doesn't reach ZFS via FreeBSD
VFS currently (perhaps something that should be investigated in
FreeBSD). Since on Linux we're treating SEQUENTIAL and WILLNEED the
same, it doesn't really matter which one we use, so switch the test
over to WILLNEED exercise the new prefetch code on both OSes the
same way.
Reviewed-by: Mateusz Guzik <mjg@FreeBSD.org>
Reviewed-by: Fedor Uporov <fuporov.vstack@gmail.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Signed-off-by: Thomas Munro <tmunro@FreeBSD.org>
Co-authored-by: Alexander Motin <mav@FreeBSD.org>
Closes #17379
This commit is contained in:
@@ -140,7 +140,7 @@ scripts_zfs_tests_bin_PROGRAMS += %D%/read_dos_attributes %D%/write_dos_attribu
|
||||
|
||||
scripts_zfs_tests_bin_PROGRAMS += %D%/randfree_file
|
||||
%C%_randfree_file_SOURCES = %D%/file/randfree_file.c
|
||||
endif
|
||||
|
||||
scripts_zfs_tests_bin_PROGRAMS += %D%/file_fadvise
|
||||
%C%_file_fadvise_SOURCES = %D%/file/file_fadvise.c
|
||||
endif
|
||||
|
||||
@@ -44,21 +44,41 @@ static void
|
||||
usage(void)
|
||||
{
|
||||
(void) fprintf(stderr,
|
||||
"usage: %s -f filename -a advise \n", execname);
|
||||
"usage: %s -f filename -a advice \n", execname);
|
||||
}
|
||||
|
||||
typedef struct advice_name {
|
||||
const char *name;
|
||||
int value;
|
||||
} advice_name;
|
||||
|
||||
static const struct advice_name table[] = {
|
||||
#define ADV(name) {#name, name}
|
||||
ADV(POSIX_FADV_NORMAL),
|
||||
ADV(POSIX_FADV_RANDOM),
|
||||
ADV(POSIX_FADV_SEQUENTIAL),
|
||||
ADV(POSIX_FADV_WILLNEED),
|
||||
ADV(POSIX_FADV_DONTNEED),
|
||||
ADV(POSIX_FADV_NOREUSE),
|
||||
{NULL}
|
||||
};
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
char *filename = NULL;
|
||||
int advise = 0;
|
||||
int advice = POSIX_FADV_NORMAL;
|
||||
int fd, ch;
|
||||
int err = 0;
|
||||
|
||||
while ((ch = getopt(argc, argv, "a:f:")) != EOF) {
|
||||
switch (ch) {
|
||||
case 'a':
|
||||
advise = atoll(optarg);
|
||||
advice = -1;
|
||||
for (const advice_name *p = table; p->name; ++p) {
|
||||
if (strcmp(p->name, optarg) == 0)
|
||||
advice = p->value;
|
||||
}
|
||||
break;
|
||||
case 'f':
|
||||
filename = optarg;
|
||||
@@ -75,8 +95,8 @@ main(int argc, char *argv[])
|
||||
err++;
|
||||
}
|
||||
|
||||
if (advise < POSIX_FADV_NORMAL || advise > POSIX_FADV_NOREUSE) {
|
||||
(void) printf("advise is invalid\n");
|
||||
if (advice == -1) {
|
||||
(void) printf("advice is invalid\n");
|
||||
err++;
|
||||
}
|
||||
|
||||
@@ -90,7 +110,7 @@ main(int argc, char *argv[])
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (posix_fadvise(fd, 0, 0, advise) != 0) {
|
||||
if (posix_fadvise(fd, 0, 0, advice) != 0) {
|
||||
perror("posix_fadvise");
|
||||
close(fd);
|
||||
return (1);
|
||||
|
||||
Reference in New Issue
Block a user