* [PATCH 2/6] XFS: handle hole punching via fallocate properly
2010-11-08 20:32 [PATCH 1/6] fs: add hole punching to fallocate Josef Bacik
@ 2010-11-08 20:32 ` Josef Bacik
2010-11-09 1:22 ` Dave Chinner
0 siblings, 1 reply; 14+ messages in thread
From: Josef Bacik @ 2010-11-08 20:32 UTC (permalink / raw)
To: linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
joel.becker, cmm, cluster-
This patch simply allows XFS to handle the hole punching flag in fallocate
properly. I've tested this with a little program that does a bunch of random
hole punching with FL_KEEP_SIZE and without it to make sure it does the right
thing. Thanks,
Signed-off-by: Josef Bacik <josef@redhat.com>
---
fs/xfs/linux-2.6/xfs_iops.c | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
index 96107ef..99df347 100644
--- a/fs/xfs/linux-2.6/xfs_iops.c
+++ b/fs/xfs/linux-2.6/xfs_iops.c
@@ -516,6 +516,7 @@ xfs_vn_fallocate(
loff_t new_size = 0;
xfs_flock64_t bf;
xfs_inode_t *ip = XFS_I(inode);
+ int cmd = XFS_IOC_RESVSP;
/* preallocation on directories not yet supported */
error = -ENODEV;
@@ -528,17 +529,22 @@ xfs_vn_fallocate(
xfs_ilock(ip, XFS_IOLOCK_EXCL);
+ if (mode & FALLOC_FL_PUNCH_HOLE)
+ cmd = XFS_IOC_UNRESVSP;
+
/* check the new inode size is valid before allocating */
if (!(mode & FALLOC_FL_KEEP_SIZE) &&
offset + len > i_size_read(inode)) {
- new_size = offset + len;
+ if (cmd == XFS_IOC_UNRESVSP)
+ new_size = offset;
+ else
+ new_size = offset + len;
error = inode_newsize_ok(inode, new_size);
if (error)
goto out_unlock;
}
- error = -xfs_change_file_space(ip, XFS_IOC_RESVSP, &bf,
- 0, XFS_ATTR_NOLOCK);
+ error = -xfs_change_file_space(ip, cmd, &bf, 0, XFS_ATTR_NOLOCK);
if (error)
goto out_unlock;
--
1.6.6.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 2/6] XFS: handle hole punching via fallocate properly
2010-11-08 20:32 ` [PATCH 2/6] XFS: handle hole punching via fallocate properly Josef Bacik
@ 2010-11-09 1:22 ` Dave Chinner
2010-11-09 2:05 ` Josef Bacik
0 siblings, 1 reply; 14+ messages in thread
From: Dave Chinner @ 2010-11-09 1:22 UTC (permalink / raw)
To: Josef Bacik
Cc: linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
joel.becker, cmm, cluster-devel
On Mon, Nov 08, 2010 at 03:32:03PM -0500, Josef Bacik wrote:
> This patch simply allows XFS to handle the hole punching flag in fallocate
> properly. I've tested this with a little program that does a bunch of random
> hole punching with FL_KEEP_SIZE and without it to make sure it does the right
> thing. Thanks,
>
> Signed-off-by: Josef Bacik <josef@redhat.com>
> ---
> fs/xfs/linux-2.6/xfs_iops.c | 12 +++++++++---
> 1 files changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
> index 96107ef..99df347 100644
> --- a/fs/xfs/linux-2.6/xfs_iops.c
> +++ b/fs/xfs/linux-2.6/xfs_iops.c
> @@ -516,6 +516,7 @@ xfs_vn_fallocate(
> loff_t new_size = 0;
> xfs_flock64_t bf;
> xfs_inode_t *ip = XFS_I(inode);
> + int cmd = XFS_IOC_RESVSP;
>
> /* preallocation on directories not yet supported */
> error = -ENODEV;
> @@ -528,17 +529,22 @@ xfs_vn_fallocate(
>
> xfs_ilock(ip, XFS_IOLOCK_EXCL);
>
> + if (mode & FALLOC_FL_PUNCH_HOLE)
> + cmd = XFS_IOC_UNRESVSP;
> +
> /* check the new inode size is valid before allocating */
> if (!(mode & FALLOC_FL_KEEP_SIZE) &&
> offset + len > i_size_read(inode)) {
> - new_size = offset + len;
> + if (cmd == XFS_IOC_UNRESVSP)
> + new_size = offset;
> + else
> + new_size = offset + len;
What semantic is FALLOC_FL_KEEP_SIZE supposed to convey during a
hole punch? Doesn't this just turn the hole punch operation into
a truncate? If so, what's the point of punching the hole when you
can just call ftruncate() to get the same result?
I'd suggest that FALLOC_FL_PUNCH_HOLE should, by definition, not
change the file size, and have no option to be able to change it.
This needs to be defined and documented - can you include a man
page update in this series that defines the expected behaviour
of FALLOC_FL_PUNCH_HOLE?
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/6] XFS: handle hole punching via fallocate properly
2010-11-09 1:22 ` Dave Chinner
@ 2010-11-09 2:05 ` Josef Bacik
2010-11-09 4:21 ` Dave Chinner
0 siblings, 1 reply; 14+ messages in thread
From: Josef Bacik @ 2010-11-09 2:05 UTC (permalink / raw)
To: Dave Chinner
Cc: Josef Bacik, linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel,
xfs, joel.becker, cmm, cluster-devel
On Tue, Nov 09, 2010 at 12:22:54PM +1100, Dave Chinner wrote:
> On Mon, Nov 08, 2010 at 03:32:03PM -0500, Josef Bacik wrote:
> > This patch simply allows XFS to handle the hole punching flag in fallocate
> > properly. I've tested this with a little program that does a bunch of random
> > hole punching with FL_KEEP_SIZE and without it to make sure it does the right
> > thing. Thanks,
> >
> > Signed-off-by: Josef Bacik <josef@redhat.com>
> > ---
> > fs/xfs/linux-2.6/xfs_iops.c | 12 +++++++++---
> > 1 files changed, 9 insertions(+), 3 deletions(-)
> >
> > diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
> > index 96107ef..99df347 100644
> > --- a/fs/xfs/linux-2.6/xfs_iops.c
> > +++ b/fs/xfs/linux-2.6/xfs_iops.c
> > @@ -516,6 +516,7 @@ xfs_vn_fallocate(
> > loff_t new_size = 0;
> > xfs_flock64_t bf;
> > xfs_inode_t *ip = XFS_I(inode);
> > + int cmd = XFS_IOC_RESVSP;
> >
> > /* preallocation on directories not yet supported */
> > error = -ENODEV;
> > @@ -528,17 +529,22 @@ xfs_vn_fallocate(
> >
> > xfs_ilock(ip, XFS_IOLOCK_EXCL);
> >
> > + if (mode & FALLOC_FL_PUNCH_HOLE)
> > + cmd = XFS_IOC_UNRESVSP;
> > +
> > /* check the new inode size is valid before allocating */
> > if (!(mode & FALLOC_FL_KEEP_SIZE) &&
> > offset + len > i_size_read(inode)) {
> > - new_size = offset + len;
> > + if (cmd == XFS_IOC_UNRESVSP)
> > + new_size = offset;
> > + else
> > + new_size = offset + len;
>
> What semantic is FALLOC_FL_KEEP_SIZE supposed to convey during a
> hole punch? Doesn't this just turn the hole punch operation into
> a truncate? If so, what's the point of punching the hole when you
> can just call ftruncate() to get the same result?
>
Well your UNRESVSP can do the same thing as a ftruncate so I figured it was ok
to just go ahead and use it rather than add complexity, especially since I don't
understand this crazy fs of yours ;).
> I'd suggest that FALLOC_FL_PUNCH_HOLE should, by definition, not
> change the file size, and have no option to be able to change it.
> This needs to be defined and documented - can you include a man
> page update in this series that defines the expected behaviour
> of FALLOC_FL_PUNCH_HOLE?
Oh I see you mean don't allow hole punch to change the size at all. I was
thinking of doing this originally, but like I said above I figured that there
was no harm in doing the equivalent of an ftruncate. But you are right, theres
no sense in duplicating functionality, I'll change it to keep PUNCH_HOLE from
changin the size. Now I just need to figure out where that man page is...
Josef
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/6] XFS: handle hole punching via fallocate properly
2010-11-09 2:05 ` Josef Bacik
@ 2010-11-09 4:21 ` Dave Chinner
0 siblings, 0 replies; 14+ messages in thread
From: Dave Chinner @ 2010-11-09 4:21 UTC (permalink / raw)
To: Josef Bacik
Cc: linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
joel.becker, cmm, cluster-devel
On Mon, Nov 08, 2010 at 09:05:09PM -0500, Josef Bacik wrote:
> On Tue, Nov 09, 2010 at 12:22:54PM +1100, Dave Chinner wrote:
> > On Mon, Nov 08, 2010 at 03:32:03PM -0500, Josef Bacik wrote:
> > > This patch simply allows XFS to handle the hole punching flag in fallocate
> > > properly. I've tested this with a little program that does a bunch of random
> > > hole punching with FL_KEEP_SIZE and without it to make sure it does the right
> > > thing. Thanks,
> > >
> > > Signed-off-by: Josef Bacik <josef@redhat.com>
> > > ---
> > > fs/xfs/linux-2.6/xfs_iops.c | 12 +++++++++---
> > > 1 files changed, 9 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
> > > index 96107ef..99df347 100644
> > > --- a/fs/xfs/linux-2.6/xfs_iops.c
> > > +++ b/fs/xfs/linux-2.6/xfs_iops.c
> > > @@ -516,6 +516,7 @@ xfs_vn_fallocate(
> > > loff_t new_size = 0;
> > > xfs_flock64_t bf;
> > > xfs_inode_t *ip = XFS_I(inode);
> > > + int cmd = XFS_IOC_RESVSP;
> > >
> > > /* preallocation on directories not yet supported */
> > > error = -ENODEV;
> > > @@ -528,17 +529,22 @@ xfs_vn_fallocate(
> > >
> > > xfs_ilock(ip, XFS_IOLOCK_EXCL);
> > >
> > > + if (mode & FALLOC_FL_PUNCH_HOLE)
> > > + cmd = XFS_IOC_UNRESVSP;
> > > +
> > > /* check the new inode size is valid before allocating */
> > > if (!(mode & FALLOC_FL_KEEP_SIZE) &&
> > > offset + len > i_size_read(inode)) {
> > > - new_size = offset + len;
> > > + if (cmd == XFS_IOC_UNRESVSP)
> > > + new_size = offset;
> > > + else
> > > + new_size = offset + len;
> >
> > What semantic is FALLOC_FL_KEEP_SIZE supposed to convey during a
> > hole punch? Doesn't this just turn the hole punch operation into
> > a truncate? If so, what's the point of punching the hole when you
> > can just call ftruncate() to get the same result?
> >
>
> Well your UNRESVSP can do the same thing as a ftruncate
Actually, it can't because it leaves the file size unchanged. Like
XFS_IOC_RESVSP, the use case is to allow punching out pre-allocated
blocks beyond EOF (that were put there by XFS_IOC_RESVSP). e.g:
# xfs_io -f \
> -c "truncate 20k" \
> -c "resvsp 16k 16k" \
> -c "unresvsp 24k 4k" \
> -c "bmap -v" \
> -c "stat" \
> test.out
test.out:
EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL FLAGS
0: [0..31]: hole 32
1: [32..47]: 136..151 0 (136..151) 16 10000
2: [48..55]: hole 8
3: [56..63]: 160..167 0 (160..167) 8 10000
fd.path = "test.out"
fd.flags = non-sync,non-direct,read-write
stat.ino = 134
stat.type = regular file
stat.size = 20480
stat.blocks = 24
fsxattr.xflags = 0x2 [prealloc]
fsxattr.projid = 0
fsxattr.extsize = 0
fsxattr.nextents = 2
fsxattr.naextents = 0
dioattr.mem = 0x200
dioattr.miniosz = 512
dioattr.maxiosz = 2147483136
#
Which leaves us witha file size of 20k and two unwritten extents
from 16-24k and 28-32k.
> so I figured it was ok
> to just go ahead and use it rather than add complexity, especially since I don't
> understand this crazy fs of yours ;).
Ask, and ye shall receive enlightenment. :)
> > I'd suggest that FALLOC_FL_PUNCH_HOLE should, by definition, not
> > change the file size, and have no option to be able to change it.
> > This needs to be defined and documented - can you include a man
> > page update in this series that defines the expected behaviour
> > of FALLOC_FL_PUNCH_HOLE?
>
> Oh I see you mean don't allow hole punch to change the size at all.
Exactly. If you can preallocate beyond EOF, then you need to be able
to punch beyond EOF, too. The only other way to remove persistent
preallocation beyond EOF is to truncate, but that doesn't allow you
to only punch specific ranges beyond EOF...
> I was thinking of doing this originally, but like I said above I
> figured that there was no harm in doing the equivalent of an
> ftruncate. But you are right, theres no sense in duplicating
> functionality, I'll change it to keep PUNCH_HOLE from changin the
> size. Now I just need to figure out where that man page is...
>From the man page: http://www.kernel.org/doc/man-pages/
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 2/6] XFS: handle hole punching via fallocate properly
2010-11-15 17:05 Hole Punching V2 Josef Bacik
@ 2010-11-15 17:05 ` Josef Bacik
0 siblings, 0 replies; 14+ messages in thread
From: Josef Bacik @ 2010-11-15 17:05 UTC (permalink / raw)
To: david, linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
cmm, cluster-dev
This patch simply allows XFS to handle the hole punching flag in fallocate
properly. I've tested this with a little program that does a bunch of random
hole punching with FL_KEEP_SIZE and without it to make sure it does the right
thing. Thanks,
Signed-off-by: Josef Bacik <josef@redhat.com>
---
fs/xfs/linux-2.6/xfs_iops.c | 9 ++++++---
1 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
index 96107ef..63cc929 100644
--- a/fs/xfs/linux-2.6/xfs_iops.c
+++ b/fs/xfs/linux-2.6/xfs_iops.c
@@ -516,6 +516,7 @@ xfs_vn_fallocate(
loff_t new_size = 0;
xfs_flock64_t bf;
xfs_inode_t *ip = XFS_I(inode);
+ int cmd = XFS_IOC_RESVSP;
/* preallocation on directories not yet supported */
error = -ENODEV;
@@ -528,8 +529,11 @@ xfs_vn_fallocate(
xfs_ilock(ip, XFS_IOLOCK_EXCL);
+ if (mode & FALLOC_FL_PUNCH_HOLE)
+ cmd = XFS_IOC_UNRESVSP;
+
/* check the new inode size is valid before allocating */
- if (!(mode & FALLOC_FL_KEEP_SIZE) &&
+ if (!(mode & (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) &&
offset + len > i_size_read(inode)) {
new_size = offset + len;
error = inode_newsize_ok(inode, new_size);
@@ -537,8 +541,7 @@ xfs_vn_fallocate(
goto out_unlock;
}
- error = -xfs_change_file_space(ip, XFS_IOC_RESVSP, &bf,
- 0, XFS_ATTR_NOLOCK);
+ error = -xfs_change_file_space(ip, cmd, &bf, 0, XFS_ATTR_NOLOCK);
if (error)
goto out_unlock;
--
1.6.6.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Hole Punching V3
@ 2010-11-18 1:46 Josef Bacik
2010-11-18 1:46 ` [PATCH 1/6] fs: add hole punching to fallocate Josef Bacik
` (6 more replies)
0 siblings, 7 replies; 14+ messages in thread
From: Josef Bacik @ 2010-11-18 1:46 UTC (permalink / raw)
To: david, linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
cmm, cluster-dev
This is version 3 of the hole punching series I've been posting. Not much has
changed, the history is below
V2->V3
-FALLOC_FL_PUNCH_HOLE must also have FALLOC_FL_KEEP_SIZE in order to work
-formatting fixes
V1->V2
-Hole punching doesn't change file size
-Fixed the mode checks in ext4/btrfs/gfs2 so they do what they are supposed to
I've updated my local copies of the xfsprogs patches I have to test this to use
KEEP_SIZE and PUNCH_HOLE together, I'll post them after it looks like these
patches are good to go, including the manpage update. The xfstest I wrote ran
fine both on xfs and btrfs (failing on btrfs obviously). Thanks,
Josef
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/6] fs: add hole punching to fallocate
2010-11-18 1:46 Hole Punching V3 Josef Bacik
@ 2010-11-18 1:46 ` Josef Bacik
2010-11-18 23:43 ` Jan Kara
2010-11-18 1:46 ` [PATCH 2/6] XFS: handle hole punching via fallocate properly Josef Bacik
` (5 subsequent siblings)
6 siblings, 1 reply; 14+ messages in thread
From: Josef Bacik @ 2010-11-18 1:46 UTC (permalink / raw)
To: david, linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
cmm, cluster-dev
Hole punching has already been implemented by XFS and OCFS2, and has the
potential to be implemented on both BTRFS and EXT4 so we need a generic way to
get to this feature. The simplest way in my mind is to add FALLOC_FL_PUNCH_HOLE
to fallocate() since it already looks like the normal fallocate() operation.
I've tested this patch with XFS and BTRFS to make sure XFS did what it's
supposed to do and that BTRFS failed like it was supposed to. Thank you,
Signed-off-by: Josef Bacik <josef@redhat.com>
---
fs/open.c | 7 ++++++-
include/linux/falloc.h | 1 +
2 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/fs/open.c b/fs/open.c
index 4197b9e..5b6ef7e 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -223,7 +223,12 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
return -EINVAL;
/* Return error if mode is not supported */
- if (mode && !(mode & FALLOC_FL_KEEP_SIZE))
+ if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
+ return -EOPNOTSUPP;
+
+ /* Punch hole must have keep size set */
+ if ((mode & FALLOC_FL_PUNCH_HOLE) &&
+ !(mode & FALLOC_FL_KEEP_SIZE))
return -EOPNOTSUPP;
if (!(file->f_mode & FMODE_WRITE))
diff --git a/include/linux/falloc.h b/include/linux/falloc.h
index 3c15510..73e0b62 100644
--- a/include/linux/falloc.h
+++ b/include/linux/falloc.h
@@ -2,6 +2,7 @@
#define _FALLOC_H_
#define FALLOC_FL_KEEP_SIZE 0x01 /* default is extend size */
+#define FALLOC_FL_PUNCH_HOLE 0x02 /* de-allocates range */
#ifdef __KERNEL__
--
1.6.6.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/6] XFS: handle hole punching via fallocate properly
2010-11-18 1:46 Hole Punching V3 Josef Bacik
2010-11-18 1:46 ` [PATCH 1/6] fs: add hole punching to fallocate Josef Bacik
@ 2010-11-18 1:46 ` Josef Bacik
2010-11-18 1:46 ` [PATCH 3/6] Ocfs2: " Josef Bacik
` (4 subsequent siblings)
6 siblings, 0 replies; 14+ messages in thread
From: Josef Bacik @ 2010-11-18 1:46 UTC (permalink / raw)
To: david, linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
cmm, cluster-dev
This patch simply allows XFS to handle the hole punching flag in fallocate
properly. I've tested this with a little program that does a bunch of random
hole punching with FL_KEEP_SIZE and without it to make sure it does the right
thing. Thanks,
Signed-off-by: Josef Bacik <josef@redhat.com>
---
fs/xfs/linux-2.6/xfs_iops.c | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
index 96107ef..07d2164 100644
--- a/fs/xfs/linux-2.6/xfs_iops.c
+++ b/fs/xfs/linux-2.6/xfs_iops.c
@@ -516,6 +516,7 @@ xfs_vn_fallocate(
loff_t new_size = 0;
xfs_flock64_t bf;
xfs_inode_t *ip = XFS_I(inode);
+ int cmd = XFS_IOC_RESVSP;
/* preallocation on directories not yet supported */
error = -ENODEV;
@@ -528,6 +529,9 @@ xfs_vn_fallocate(
xfs_ilock(ip, XFS_IOLOCK_EXCL);
+ if (mode & FALLOC_FL_PUNCH_HOLE)
+ cmd = XFS_IOC_UNRESVSP;
+
/* check the new inode size is valid before allocating */
if (!(mode & FALLOC_FL_KEEP_SIZE) &&
offset + len > i_size_read(inode)) {
@@ -537,8 +541,7 @@ xfs_vn_fallocate(
goto out_unlock;
}
- error = -xfs_change_file_space(ip, XFS_IOC_RESVSP, &bf,
- 0, XFS_ATTR_NOLOCK);
+ error = -xfs_change_file_space(ip, cmd, &bf, 0, XFS_ATTR_NOLOCK);
if (error)
goto out_unlock;
--
1.6.6.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 3/6] Ocfs2: handle hole punching via fallocate properly
2010-11-18 1:46 Hole Punching V3 Josef Bacik
2010-11-18 1:46 ` [PATCH 1/6] fs: add hole punching to fallocate Josef Bacik
2010-11-18 1:46 ` [PATCH 2/6] XFS: handle hole punching via fallocate properly Josef Bacik
@ 2010-11-18 1:46 ` Josef Bacik
2010-11-18 1:46 ` [PATCH 4/6] Ext4: fail if we try to use hole punch Josef Bacik
` (3 subsequent siblings)
6 siblings, 0 replies; 14+ messages in thread
From: Josef Bacik @ 2010-11-18 1:46 UTC (permalink / raw)
To: david, linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
cmm, cluster-dev
This patch just makes ocfs2 use its UNRESERVP ioctl when we get the hole punch
flag in fallocate. I didn't test it, but it seems simple enough. Thanks,
Acked-by: Jan Kara <jack@suse.cz>
Acked-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Josef Bacik <josef@redhat.com>
---
fs/ocfs2/file.c | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 77b4c04..ad23a18 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -1992,6 +1992,7 @@ static long ocfs2_fallocate(struct inode *inode, int mode, loff_t offset,
struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
struct ocfs2_space_resv sr;
int change_size = 1;
+ int cmd = OCFS2_IOC_RESVSP64;
if (!ocfs2_writes_unwritten_extents(osb))
return -EOPNOTSUPP;
@@ -2002,12 +2003,15 @@ static long ocfs2_fallocate(struct inode *inode, int mode, loff_t offset,
if (mode & FALLOC_FL_KEEP_SIZE)
change_size = 0;
+ if (mode & FALLOC_FL_PUNCH_HOLE)
+ cmd = OCFS2_IOC_UNRESVSP64;
+
sr.l_whence = 0;
sr.l_start = (s64)offset;
sr.l_len = (s64)len;
- return __ocfs2_change_file_space(NULL, inode, offset,
- OCFS2_IOC_RESVSP64, &sr, change_size);
+ return __ocfs2_change_file_space(NULL, inode, offset, cmd, &sr,
+ change_size);
}
int ocfs2_check_range_for_refcount(struct inode *inode, loff_t pos,
--
1.6.6.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 4/6] Ext4: fail if we try to use hole punch
2010-11-18 1:46 Hole Punching V3 Josef Bacik
` (2 preceding siblings ...)
2010-11-18 1:46 ` [PATCH 3/6] Ocfs2: " Josef Bacik
@ 2010-11-18 1:46 ` Josef Bacik
2010-11-18 1:46 ` [PATCH 5/6] Btrfs: " Josef Bacik
` (2 subsequent siblings)
6 siblings, 0 replies; 14+ messages in thread
From: Josef Bacik @ 2010-11-18 1:46 UTC (permalink / raw)
To: david, linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
cmm, cluster-dev
Ext4 doesn't have the ability to punch holes yet, so make sure we return
EOPNOTSUPP if we try to use hole punching through fallocate. This support can
be added later. Thanks,
Acked-by: Jan Kara <jack@suse.cz>
Signed-off-by: Josef Bacik <josef@redhat.com>
---
fs/ext4/extents.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 0554c48..35bca73 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -3622,6 +3622,10 @@ long ext4_fallocate(struct inode *inode, int mode, loff_t offset, loff_t len)
struct ext4_map_blocks map;
unsigned int credits, blkbits = inode->i_blkbits;
+ /* We only support the FALLOC_FL_KEEP_SIZE mode */
+ if (mode && (mode != FALLOC_FL_KEEP_SIZE))
+ return -EOPNOTSUPP;
+
/*
* currently supporting (pre)allocate mode for extent-based
* files _only_
--
1.6.6.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 5/6] Btrfs: fail if we try to use hole punch
2010-11-18 1:46 Hole Punching V3 Josef Bacik
` (3 preceding siblings ...)
2010-11-18 1:46 ` [PATCH 4/6] Ext4: fail if we try to use hole punch Josef Bacik
@ 2010-11-18 1:46 ` Josef Bacik
2010-11-18 1:46 ` [PATCH 6/6] Gfs2: " Josef Bacik
2011-01-03 21:57 ` Hole Punching V3 Josef Bacik
6 siblings, 0 replies; 14+ messages in thread
From: Josef Bacik @ 2010-11-18 1:46 UTC (permalink / raw)
To: david, linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
cmm, cluster-dev
Btrfs doesn't have the ability to punch holes yet, so make sure we return
EOPNOTSUPP if we try to use hole punching through fallocate. This support can
be added later. Thanks,
Signed-off-by: Josef Bacik <josef@redhat.com>
---
fs/btrfs/inode.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 78877d7..6f08892 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -6936,6 +6936,10 @@ static long btrfs_fallocate(struct inode *inode, int mode,
alloc_start = offset & ~mask;
alloc_end = (offset + len + mask) & ~mask;
+ /* We only support the FALLOC_FL_KEEP_SIZE mode */
+ if (mode && (mode != FALLOC_FL_KEEP_SIZE))
+ return -EOPNOTSUPP;
+
/*
* wait for ordered IO before we have any locks. We'll loop again
* below with the locks held.
--
1.6.6.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 6/6] Gfs2: fail if we try to use hole punch
2010-11-18 1:46 Hole Punching V3 Josef Bacik
` (4 preceding siblings ...)
2010-11-18 1:46 ` [PATCH 5/6] Btrfs: " Josef Bacik
@ 2010-11-18 1:46 ` Josef Bacik
2011-01-03 21:57 ` Hole Punching V3 Josef Bacik
6 siblings, 0 replies; 14+ messages in thread
From: Josef Bacik @ 2010-11-18 1:46 UTC (permalink / raw)
To: david, linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
cmm, cluster-dev
Gfs2 doesn't have the ability to punch holes yet, so make sure we return
EOPNOTSUPP if we try to use hole punching through fallocate. This support can
be added later. Thanks,
Signed-off-by: Josef Bacik <josef@redhat.com>
---
fs/gfs2/ops_inode.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c
index 12cbea7..65cb5f6 100644
--- a/fs/gfs2/ops_inode.c
+++ b/fs/gfs2/ops_inode.c
@@ -1439,6 +1439,10 @@ static long gfs2_fallocate(struct inode *inode, int mode, loff_t offset,
loff_t next = (offset + len - 1) >> sdp->sd_sb.sb_bsize_shift;
next = (next + 1) << sdp->sd_sb.sb_bsize_shift;
+ /* We only support the FALLOC_FL_KEEP_SIZE mode */
+ if (mode && (mode != FALLOC_FL_KEEP_SIZE))
+ return -EOPNOTSUPP;
+
offset = (offset >> sdp->sd_sb.sb_bsize_shift) <<
sdp->sd_sb.sb_bsize_shift;
--
1.6.6.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 1/6] fs: add hole punching to fallocate
2010-11-18 1:46 ` [PATCH 1/6] fs: add hole punching to fallocate Josef Bacik
@ 2010-11-18 23:43 ` Jan Kara
0 siblings, 0 replies; 14+ messages in thread
From: Jan Kara @ 2010-11-18 23:43 UTC (permalink / raw)
To: Josef Bacik
Cc: david, linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
cmm, cluster-devel, joel.becker, jack
On Wed 17-11-10 20:46:15, Josef Bacik wrote:
> Hole punching has already been implemented by XFS and OCFS2, and has the
> potential to be implemented on both BTRFS and EXT4 so we need a generic way to
> get to this feature. The simplest way in my mind is to add FALLOC_FL_PUNCH_HOLE
> to fallocate() since it already looks like the normal fallocate() operation.
> I've tested this patch with XFS and BTRFS to make sure XFS did what it's
> supposed to do and that BTRFS failed like it was supposed to. Thank you,
Looks nice now. Acked-by: Jan Kara <jack@suse.cz>
Honza
>
> Signed-off-by: Josef Bacik <josef@redhat.com>
> ---
> fs/open.c | 7 ++++++-
> include/linux/falloc.h | 1 +
> 2 files changed, 7 insertions(+), 1 deletions(-)
>
> diff --git a/fs/open.c b/fs/open.c
> index 4197b9e..5b6ef7e 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -223,7 +223,12 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
> return -EINVAL;
>
> /* Return error if mode is not supported */
> - if (mode && !(mode & FALLOC_FL_KEEP_SIZE))
> + if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
> + return -EOPNOTSUPP;
> +
> + /* Punch hole must have keep size set */
> + if ((mode & FALLOC_FL_PUNCH_HOLE) &&
> + !(mode & FALLOC_FL_KEEP_SIZE))
> return -EOPNOTSUPP;
>
> if (!(file->f_mode & FMODE_WRITE))
> diff --git a/include/linux/falloc.h b/include/linux/falloc.h
> index 3c15510..73e0b62 100644
> --- a/include/linux/falloc.h
> +++ b/include/linux/falloc.h
> @@ -2,6 +2,7 @@
> #define _FALLOC_H_
>
> #define FALLOC_FL_KEEP_SIZE 0x01 /* default is extend size */
> +#define FALLOC_FL_PUNCH_HOLE 0x02 /* de-allocates range */
>
> #ifdef __KERNEL__
>
> --
> 1.6.6.1
>
--
Jan Kara <jack@suse.cz>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Hole Punching V3
2010-11-18 1:46 Hole Punching V3 Josef Bacik
` (5 preceding siblings ...)
2010-11-18 1:46 ` [PATCH 6/6] Gfs2: " Josef Bacik
@ 2011-01-03 21:57 ` Josef Bacik
6 siblings, 0 replies; 14+ messages in thread
From: Josef Bacik @ 2011-01-03 21:57 UTC (permalink / raw)
To: Josef Bacik
Cc: david, linux-kernel, linux-btrfs, linux-ext4, linux-fsdevel, xfs,
cmm, cluster-devel, joel.becker, jack, akpm, torvalds
On Wed, Nov 17, 2010 at 08:46:14PM -0500, Josef Bacik wrote:
> This is version 3 of the hole punching series I've been posting. Not much has
> changed, the history is below
>
> V2->V3
> -FALLOC_FL_PUNCH_HOLE must also have FALLOC_FL_KEEP_SIZE in order to work
> -formatting fixes
>
> V1->V2
> -Hole punching doesn't change file size
> -Fixed the mode checks in ext4/btrfs/gfs2 so they do what they are supposed to
>
> I've updated my local copies of the xfsprogs patches I have to test this to use
> KEEP_SIZE and PUNCH_HOLE together, I'll post them after it looks like these
> patches are good to go, including the manpage update. The xfstest I wrote ran
> fine both on xfs and btrfs (failing on btrfs obviously). Thanks,
>
I'd like to try and get this into the next merge window, it seems everybody is
happy with it so far, any other comments? Provided everybody is ok with it, how
would you like me to send it to you Linus? Would you prefer a pull request or
will you just pull the patches off the mailinglist? Thanks,
Josef
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2011-01-03 21:58 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-18 1:46 Hole Punching V3 Josef Bacik
2010-11-18 1:46 ` [PATCH 1/6] fs: add hole punching to fallocate Josef Bacik
2010-11-18 23:43 ` Jan Kara
2010-11-18 1:46 ` [PATCH 2/6] XFS: handle hole punching via fallocate properly Josef Bacik
2010-11-18 1:46 ` [PATCH 3/6] Ocfs2: " Josef Bacik
2010-11-18 1:46 ` [PATCH 4/6] Ext4: fail if we try to use hole punch Josef Bacik
2010-11-18 1:46 ` [PATCH 5/6] Btrfs: " Josef Bacik
2010-11-18 1:46 ` [PATCH 6/6] Gfs2: " Josef Bacik
2011-01-03 21:57 ` Hole Punching V3 Josef Bacik
-- strict thread matches above, loose matches on Subject: below --
2010-11-15 17:05 Hole Punching V2 Josef Bacik
2010-11-15 17:05 ` [PATCH 2/6] XFS: handle hole punching via fallocate properly Josef Bacik
2010-11-08 20:32 [PATCH 1/6] fs: add hole punching to fallocate Josef Bacik
2010-11-08 20:32 ` [PATCH 2/6] XFS: handle hole punching via fallocate properly Josef Bacik
2010-11-09 1:22 ` Dave Chinner
2010-11-09 2:05 ` Josef Bacik
2010-11-09 4:21 ` Dave Chinner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).