|
@@ -1459,59 +1459,6 @@ out:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_XFS
|
|
|
-static int xfs_write_zeroes(BDRVRawState *s, int64_t offset, uint64_t bytes)
|
|
|
-{
|
|
|
- int64_t len;
|
|
|
- struct xfs_flock64 fl;
|
|
|
- int err;
|
|
|
-
|
|
|
- len = lseek(s->fd, 0, SEEK_END);
|
|
|
- if (len < 0) {
|
|
|
- return -errno;
|
|
|
- }
|
|
|
-
|
|
|
- if (offset + bytes > len) {
|
|
|
- /* XFS_IOC_ZERO_RANGE does not increase the file length */
|
|
|
- if (ftruncate(s->fd, offset + bytes) < 0) {
|
|
|
- return -errno;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- memset(&fl, 0, sizeof(fl));
|
|
|
- fl.l_whence = SEEK_SET;
|
|
|
- fl.l_start = offset;
|
|
|
- fl.l_len = bytes;
|
|
|
-
|
|
|
- if (xfsctl(NULL, s->fd, XFS_IOC_ZERO_RANGE, &fl) < 0) {
|
|
|
- err = errno;
|
|
|
- trace_file_xfs_write_zeroes(strerror(errno));
|
|
|
- return -err;
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int xfs_discard(BDRVRawState *s, int64_t offset, uint64_t bytes)
|
|
|
-{
|
|
|
- struct xfs_flock64 fl;
|
|
|
- int err;
|
|
|
-
|
|
|
- memset(&fl, 0, sizeof(fl));
|
|
|
- fl.l_whence = SEEK_SET;
|
|
|
- fl.l_start = offset;
|
|
|
- fl.l_len = bytes;
|
|
|
-
|
|
|
- if (xfsctl(NULL, s->fd, XFS_IOC_UNRESVSP64, &fl) < 0) {
|
|
|
- err = errno;
|
|
|
- trace_file_xfs_discard(strerror(errno));
|
|
|
- return -err;
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
static int translate_err(int err)
|
|
|
{
|
|
|
if (err == -ENODEV || err == -ENOSYS || err == -EOPNOTSUPP ||
|
|
@@ -1567,10 +1514,8 @@ static ssize_t handle_aiocb_write_zeroes_block(RawPosixAIOData *aiocb)
|
|
|
static int handle_aiocb_write_zeroes(void *opaque)
|
|
|
{
|
|
|
RawPosixAIOData *aiocb = opaque;
|
|
|
-#if defined(CONFIG_FALLOCATE) || defined(CONFIG_XFS)
|
|
|
- BDRVRawState *s = aiocb->bs->opaque;
|
|
|
-#endif
|
|
|
#ifdef CONFIG_FALLOCATE
|
|
|
+ BDRVRawState *s = aiocb->bs->opaque;
|
|
|
int64_t len;
|
|
|
#endif
|
|
|
|
|
@@ -1578,12 +1523,6 @@ static int handle_aiocb_write_zeroes(void *opaque)
|
|
|
return handle_aiocb_write_zeroes_block(aiocb);
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_XFS
|
|
|
- if (s->is_xfs) {
|
|
|
- return xfs_write_zeroes(s, aiocb->aio_offset, aiocb->aio_nbytes);
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
#ifdef CONFIG_FALLOCATE_ZERO_RANGE
|
|
|
if (s->has_write_zeroes) {
|
|
|
int ret = do_fallocate(s->fd, FALLOC_FL_ZERO_RANGE,
|
|
@@ -1653,14 +1592,6 @@ static int handle_aiocb_write_zeroes_unmap(void *opaque)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-#ifdef CONFIG_XFS
|
|
|
- if (s->is_xfs) {
|
|
|
- /* xfs_discard() guarantees that the discarded area reads as all-zero
|
|
|
- * afterwards, so we can use it here. */
|
|
|
- return xfs_discard(s, aiocb->aio_offset, aiocb->aio_nbytes);
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
/* If we couldn't manage to unmap while guaranteed that the area reads as
|
|
|
* all-zero afterwards, just write zeroes without unmapping */
|
|
|
ret = handle_aiocb_write_zeroes(aiocb);
|
|
@@ -1737,12 +1668,6 @@ static int handle_aiocb_discard(void *opaque)
|
|
|
ret = -errno;
|
|
|
#endif
|
|
|
} else {
|
|
|
-#ifdef CONFIG_XFS
|
|
|
- if (s->is_xfs) {
|
|
|
- return xfs_discard(s, aiocb->aio_offset, aiocb->aio_nbytes);
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
#ifdef CONFIG_FALLOCATE_PUNCH_HOLE
|
|
|
ret = do_fallocate(s->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
|
|
|
aiocb->aio_offset, aiocb->aio_nbytes);
|