aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libzpool/kernel.c
diff options
context:
space:
mode:
authorRob Norris <[email protected]>2024-09-01 12:31:56 +1000
committerBrian Behlendorf <[email protected]>2024-09-18 11:35:04 -0700
commitfa330646b987756c7cff6762691e07925bce5da0 (patch)
treeae2a902b0652f623cc77d08562320d68083a3b3e /lib/libzpool/kernel.c
parent7cdfda3934b4080fa0bbcb0d306ef946d8ed282f (diff)
zfs_file: rename zfs_file_fallocate to zfs_file_deallocate
We only use it on a specific way: to punch a hole in (make sparse) a region of a file, in order to implement TRIM-like behaviour. So, call the op "deallocate", and move the Linux-style mode flags down into the Linux implementation, since they're an implementation detail. FreeBSD gets a no-op stub (for the moment). Sponsored-by: https://despairlabs.com/sponsor/ Reviewed by: Brian Behlendorf <[email protected]> Reviewed-by: Alexander Motin <[email protected]> Reviewed-by: Tino Reichardt <[email protected]> Signed-off-by: Rob Norris <[email protected]> Closes #16496
Diffstat (limited to 'lib/libzpool/kernel.c')
-rw-r--r--lib/libzpool/kernel.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/lib/libzpool/kernel.c b/lib/libzpool/kernel.c
index a3930ee07..68d22a431 100644
--- a/lib/libzpool/kernel.c
+++ b/lib/libzpool/kernel.c
@@ -1367,24 +1367,26 @@ zfs_file_fsync(zfs_file_t *fp, 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)
{
-#ifdef __linux__
- return (fallocate(fp->f_fd, mode, offset, len));
+ int rc;
+#if defined(__linux__)
+ rc = fallocate(fp->f_fd,
+ FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, offset, len);
#else
- (void) fp, (void) mode, (void) offset, (void) len;
- return (EOPNOTSUPP);
+ (void) fp, (void) offset, (void) len;
+ rc = EOPNOTSUPP;
#endif
+ if (rc)
+ return (SET_ERROR(rc));
+ return (0);
}
/*