mirror_zfs/tests/zfs-tests/cmd/file/file_fadvise.c
Alexander Motin fa697b94e6
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
2025-05-29 09:34:07 -04:00

123 lines
2.5 KiB
C

// SPDX-License-Identifier: CDDL-1.0
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or https://opensource.org/licenses/CDDL-1.0.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Copyright (c) 2022 by Information2 Software, Inc. All rights reserved.
*/
#include "file_common.h"
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
/*
* Call fadvise to prefetch data
*/
static const char *execname = "file_fadvise";
static void
usage(void)
{
(void) fprintf(stderr,
"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 advice = POSIX_FADV_NORMAL;
int fd, ch;
int err = 0;
while ((ch = getopt(argc, argv, "a:f:")) != EOF) {
switch (ch) {
case 'a':
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;
break;
case '?':
(void) printf("unknown arg %c\n", optopt);
usage();
break;
}
}
if (!filename) {
(void) printf("Filename not specified (-f <file>)\n");
err++;
}
if (advice == -1) {
(void) printf("advice is invalid\n");
err++;
}
if (err) {
usage(); /* no return */
return (1);
}
if ((fd = open(filename, O_RDWR, 0666)) < 0) {
perror("open");
return (1);
}
if (posix_fadvise(fd, 0, 0, advice) != 0) {
perror("posix_fadvise");
close(fd);
return (1);
}
close(fd);
return (0);
}