Add wrapper for Linux BLKFLSBUF ioctl

FreeBSD has no analog. Buffered block devices were removed a decade
plus ago.

Reviewed-by: Igor Kozhukhov <igor@dilos.org>
Reviewed-by: Jorgen Lundman <lundman@lundman.net>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Matt Macy <mmacy@FreeBSD.org>
Closes #9508
This commit is contained in:
Matthew Macy 2019-10-28 09:53:39 -07:00 committed by Brian Behlendorf
parent 4a22ba5be0
commit d46f0deb03
4 changed files with 9 additions and 2 deletions

View File

@ -3444,7 +3444,7 @@ dump_label(const char *dev)
exit(1); exit(1);
} }
if (S_ISBLK(statbuf.st_mode) && ioctl(fd, BLKFLSBUF) != 0) if (S_ISBLK(statbuf.st_mode) && zfs_dev_flush(fd) != 0)
(void) printf("failed to invalidate cache '%s' : %s\n", path, (void) printf("failed to invalidate cache '%s' : %s\n", path,
strerror(errno)); strerror(errno));

View File

@ -1178,7 +1178,7 @@ zpool_do_labelclear(int argc, char **argv)
* fatal when the device does not support BLKFLSBUF as would be the * fatal when the device does not support BLKFLSBUF as would be the
* case for a file vdev. * case for a file vdev.
*/ */
if ((ioctl(fd, BLKFLSBUF) != 0) && (errno != ENOTTY)) if ((zfs_dev_flush(fd) != 0) && (errno != ENOTTY))
(void) fprintf(stderr, gettext("failed to invalidate " (void) fprintf(stderr, gettext("failed to invalidate "
"cache for %s: %s\n"), vdev, strerror(errno)); "cache for %s: %s\n"), vdev, strerror(errno));

View File

@ -103,6 +103,7 @@ extern int zfs_strcmp_pathname(const char *, const char *, int);
extern boolean_t zfs_dev_is_dm(const char *); extern boolean_t zfs_dev_is_dm(const char *);
extern boolean_t zfs_dev_is_whole_disk(const char *); extern boolean_t zfs_dev_is_whole_disk(const char *);
extern int zfs_dev_flush(int);
extern char *zfs_get_underlying_path(const char *); extern char *zfs_get_underlying_path(const char *);
extern char *zfs_get_enclosure_sysfs_path(const char *); extern char *zfs_get_enclosure_sysfs_path(const char *);

View File

@ -92,6 +92,12 @@ is_watchdog_dev(char *dev)
return (B_FALSE); return (B_FALSE);
} }
int
zfs_dev_flush(int fd)
{
return (ioctl(fd, BLKFLSBUF));
}
void void
zpool_open_func(void *arg) zpool_open_func(void *arg)
{ {