Skip to content
This repository has been archived by the owner on Feb 26, 2020. It is now read-only.

Add interface for file hole punching #168

Closed
wants to merge 5 commits into from

Conversation

dechamps
Copy link
Contributor

@dechamps dechamps commented Sep 3, 2012

This adds an interface to "punch holes" (deallocate space) in VFS files. The interface is identical to the Solaris VOP_SPACE interface. This interface is necessary for TRIM support on file vdevs (see openzfs/zfs#924).

This is implemented using Linux fallocate(FALLOC_FL_PUNCH_HOLE), which was introduced in 2.6.38. For a brief time before 2.6.38 this was done using the truncate_range inode operation, which was quickly deprecated. This patch only supports FALLOC_FL_PUNCH_HOLE.

@behlendorf: like the previous patch, you can either wait for ZFS TRIM support to be finished or you can merge this now. Your call.

This adds an interface to "punch holes" (deallocate space) in VFS
files. The interface is identical to the Solaris VOP_SPACE interface.
This interface is necessary for TRIM support on file vdevs.

This is implemented using Linux fallocate(FALLOC_FL_PUNCH_HOLE), which
was introduced in 2.6.38. For a brief time before 2.6.38 this was done
using the truncate_range inode operation, which was quickly deprecated.
This patch only supports FALLOC_FL_PUNCH_HOLE.
@behlendorf
Copy link
Contributor

@dechamps I'm going to hold of merging this until -rc12 since I want to get something known stable tagged soonish.

Currently, VOP_SPACE() returns a negative error code in some cases. It
shouldn't. This patch fixes that.
@dechamps
Copy link
Contributor Author

Don't merge this just yet, I'll be adding truncate_range support shortly. After that's done just squash everything together.

Reverts a remarkably dumb part of
0c0cb0d.

"Yo Dawg, we heard you like configure checks so we put a #define in
your #define so you can #ifdef while you #ifdef"
@dechamps
Copy link
Contributor Author

Okay, this is ready for merging now. Just squash everything together and you're good to go.

This adds support for the truncate_range() inode operation to
VOP_SPACE() for file hole punching. This API is deprecated and removed
in 3.5, so it's only useful for old kernels.
On tmpfs, the truncate_range() inode operation translates to
shmem_truncate_range(). Unfortunately, this function expects the end
offset to be inclusive and aligned to the end of a page. If it is not,
the kernel will stop with a BUG_ON().

This patch fixes the issue by adapting to the constraints set forth by
shmem_truncate_range().
@dechamps
Copy link
Contributor Author

dechamps commented Oct 5, 2012

@behlendorf: now would probably be a good time to merge this.

@behlendorf
Copy link
Contributor

Yup. I was working on pulling it in yesterday I'll get it finished today.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants