aboutsummaryrefslogtreecommitdiffstats
path: root/module/os
diff options
context:
space:
mode:
Diffstat (limited to 'module/os')
-rw-r--r--module/os/freebsd/zfs/vdev_file.c11
-rw-r--r--module/os/freebsd/zfs/zfs_file_os.c14
-rw-r--r--module/os/linux/zfs/vdev_file.c9
-rw-r--r--module/os/linux/zfs/zfs_file_os.c19
4 files changed, 28 insertions, 25 deletions
diff --git a/module/os/freebsd/zfs/vdev_file.c b/module/os/freebsd/zfs/vdev_file.c
index 869093afa..6719c87f8 100644
--- a/module/os/freebsd/zfs/vdev_file.c
+++ b/module/os/freebsd/zfs/vdev_file.c
@@ -260,16 +260,9 @@ vdev_file_io_start(zio_t *zio)
zio_execute(zio);
return;
} else if (zio->io_type == ZIO_TYPE_TRIM) {
-#ifdef notyet
- int mode = 0;
-
ASSERT3U(zio->io_size, !=, 0);
-
- /* XXX FreeBSD has no fallocate routine in file ops */
- zio->io_error = zfs_file_fallocate(vf->vf_file,
- mode, zio->io_offset, zio->io_size);
-#endif
- zio->io_error = SET_ERROR(ENOTSUP);
+ zio->io_error = zfs_file_deallocate(vf->vf_file,
+ zio->io_offset, zio->io_size);
zio_execute(zio);
return;
}
diff --git a/module/os/freebsd/zfs/zfs_file_os.c b/module/os/freebsd/zfs/zfs_file_os.c
index bdb8c4fac..0a91ed47e 100644
--- a/module/os/freebsd/zfs/zfs_file_os.c
+++ b/module/os/freebsd/zfs/zfs_file_os.c
@@ -285,6 +285,20 @@ zfs_file_fsync(zfs_file_t *fp, int flags)
return (zfs_vop_fsync(fp->f_vnode));
}
+/*
+ * deallocate - zero and/or deallocate file storage
+ *
+ * fp - file pointer
+ * offset - offset to start zeroing or deallocating
+ * len - length to zero or deallocate
+ */
+int
+zfs_file_deallocate(zfs_file_t *fp, loff_t offset, loff_t len)
+{
+ (void) fp, (void) offset, (void) len;
+ return (SET_ERROR(EOPNOTSUPP));
+}
+
zfs_file_t *
zfs_file_get(int fd)
{
diff --git a/module/os/linux/zfs/vdev_file.c b/module/os/linux/zfs/vdev_file.c
index ac41a2615..4bffb6412 100644
--- a/module/os/linux/zfs/vdev_file.c
+++ b/module/os/linux/zfs/vdev_file.c
@@ -274,14 +274,9 @@ vdev_file_io_start(zio_t *zio)
zio_execute(zio);
return;
} else if (zio->io_type == ZIO_TYPE_TRIM) {
- int mode = 0;
-
ASSERT3U(zio->io_size, !=, 0);
-#ifdef __linux__
- mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE;
-#endif
- zio->io_error = zfs_file_fallocate(vf->vf_file,
- mode, zio->io_offset, zio->io_size);
+ zio->io_error = zfs_file_deallocate(vf->vf_file,
+ zio->io_offset, zio->io_size);
zio_execute(zio);
return;
}
diff --git a/module/os/linux/zfs/zfs_file_os.c b/module/os/linux/zfs/zfs_file_os.c
index 1b52dbe4f..4acdc6a41 100644
--- a/module/os/linux/zfs/zfs_file_os.c
+++ b/module/os/linux/zfs/zfs_file_os.c
@@ -281,17 +281,14 @@ zfs_file_fsync(zfs_file_t *filp, int flags)
}
/*
- * fallocate - allocate or free space on disk
+ * deallocate - zero and/or deallocate file storage
*
* fp - file pointer
- * mode (non-standard options for hole punching etc)
- * offset - offset to start allocating or freeing from
- * len - length to free / allocate
- *
- * OPTIONAL
+ * offset - offset to start zeroing or deallocating
+ * len - length to zero or deallocate
*/
int
-zfs_file_fallocate(zfs_file_t *fp, int mode, loff_t offset, loff_t len)
+zfs_file_deallocate(zfs_file_t *fp, loff_t offset, loff_t len)
{
/*
* May enter XFS which generates a warning when PF_FSTRANS is set.
@@ -307,12 +304,16 @@ zfs_file_fallocate(zfs_file_t *fp, int mode, loff_t offset, loff_t len)
*/
int error = EOPNOTSUPP;
if (fp->f_op->fallocate)
- error = fp->f_op->fallocate(fp, mode, offset, len);
+ error = -fp->f_op->fallocate(fp,
+ FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, offset, len);
if (fstrans)
current->flags |= __SPL_PF_FSTRANS;
- return (error);
+ if (error)
+ return (SET_ERROR(error));
+
+ return (0);
}
/*