xfs
[Top] [All Lists]

Re: [PATCH 4/7][TAKE5] support new modes in fallocate

To: linux-fsdevel@xxxxxxxxxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, linux-ext4@xxxxxxxxxxxxxxx
Subject: Re: [PATCH 4/7][TAKE5] support new modes in fallocate
From: "Amit K. Arora" <aarora@xxxxxxxxxxxxxxxxxx>
Date: Mon, 25 Jun 2007 20:33:20 +0530
Cc: David Chinner <dgc@xxxxxxx>, Andreas Dilger <adilger@xxxxxxxxxxxxx>, suparna@xxxxxxxxxx, cmm@xxxxxxxxxx, xfs@xxxxxxxxxxx
In-reply-to: <20070625134500.GE1951@xxxxxxxxxxxxxxxxxxxx>
References: <20070510223950.GD86004887@xxxxxxx> <20070511110301.GB28425@xxxxxxxxxx> <20070512080157.GF85884050@xxxxxxx> <20070612061652.GA6320@xxxxxxxxxxxxxxxxxxxx> <20070613235217.GS86004887@xxxxxxx> <20070614091458.GH5181@xxxxxxxxxxxxxxxxxxxx> <20070614120413.GD86004887@xxxxxxx> <20070614193347.GN5181@xxxxxxxxxxxxxxxxxxxx> <20070625132810.GA1951@xxxxxxxxxxxxxxxxxxxx> <20070625134500.GE1951@xxxxxxxxxxxxxxxxxxxx>
Sender: xfs-bounce@xxxxxxxxxxx
User-agent: Mutt/1.4.1i
I have not implemented FA_FL_FREE_ENOSPC and FA_ZERO_SPACE flags yet, as
*suggested* by Andreas in http://lkml.org/lkml/2007/6/14/323  post.
If it is decided that these flags are also needed, I will update this
patch. Thanks!

On Mon, Jun 25, 2007 at 07:15:00PM +0530, Amit K. Arora wrote:
> Implement new flags and values for mode argument.
> 
> This patch implements the new flags and values for the "mode" argument
> of the fallocate system call. It is based on the discussion between
> Andreas Dilger and David Chinner on the man page proposed (by the later)
> on fallocate.
> 
> Signed-off-by: Amit Arora <aarora@xxxxxxxxxx>
> 
> Index: linux-2.6.22-rc4/include/linux/fs.h
> ===================================================================
> --- linux-2.6.22-rc4.orig/include/linux/fs.h
> +++ linux-2.6.22-rc4/include/linux/fs.h
> @@ -267,15 +267,16 @@ extern int dir_notify_enable;
>  #define SYNC_FILE_RANGE_WAIT_AFTER   4
> 
>  /*
> - * sys_fallocate modes
> - * Currently sys_fallocate supports two modes:
> - * FA_ALLOCATE  : This is the preallocate mode, using which an 
> application/user
> - *             may request (pre)allocation of blocks.
> - * FA_DEALLOCATE: This is the deallocate mode, which can be used to free
> - *             the preallocated blocks.
> + * sys_fallocate mode flags and values
>   */
> -#define FA_ALLOCATE  0x1
> -#define FA_DEALLOCATE        0x2
> +#define FA_FL_DEALLOC        0x01 /* default is allocate */
> +#define FA_FL_KEEP_SIZE      0x02 /* default is extend/shrink size */
> +#define FA_FL_DEL_DATA       0x04 /* default is keep written data on DEALLOC 
> */
> +
> +#define FA_ALLOCATE  0
> +#define FA_DEALLOCATE        FA_FL_DEALLOC
> +#define FA_RESV_SPACE        FA_FL_KEEP_SIZE
> +#define FA_UNRESV_SPACE      (FA_FL_DEALLOC | FA_FL_KEEP_SIZE | 
> FA_FL_DEL_DATA)
> 
>  #ifdef __KERNEL__
> 
> Index: linux-2.6.22-rc4/fs/open.c
> ===================================================================
> --- linux-2.6.22-rc4.orig/fs/open.c
> +++ linux-2.6.22-rc4/fs/open.c
> @@ -356,23 +356,26 @@ asmlinkage long sys_ftruncate64(unsigned
>   * sys_fallocate - preallocate blocks or free preallocated blocks
>   * @fd: the file descriptor
>   * @mode: mode specifies if fallocate should preallocate blocks OR free
> - *     (unallocate) preallocated blocks. Currently only FA_ALLOCATE and
> - *     FA_DEALLOCATE modes are supported.
> + *     (unallocate) preallocated blocks.
>   * @offset: The offset within file, from where (un)allocation is being
>   *       requested. It should not have a negative value.
>   * @len: The amount (in bytes) of space to be (un)allocated, from the offset.
>   *
>   * This system call, depending on the mode, preallocates or unallocates 
> blocks
>   * for a file. The range of blocks depends on the value of offset and len
> - * arguments provided by the user/application. For FA_ALLOCATE mode, if this
> + * arguments provided by the user/application. For FA_ALLOCATE and
> + * FA_RESV_SPACE modes, if the sys_fallocate()
>   * system call succeeds, subsequent writes to the file in the given range
>   * (specified by offset & len) should not fail - even if the file system
>   * later becomes full. Hence the preallocation done is persistent (valid
> - * even after reopen of the file and remount/reboot).
> + * even after reopen of the file and remount/reboot). If FA_RESV_SPACE mode
> + * is passed, the file size will not be changed even if the preallocation
> + * is beyond EOF.
>   *
>   * It is expected that the ->fallocate() inode operation implemented by the
>   * individual file systems will update the file size and/or ctime/mtime
> - * depending on the mode and also on the success of the operation.
> + * depending on the mode (change is visible to user or not - say file size)
> + * and obviously, on the success of the operation.
>   *
>   * Note: Incase the file system does not support preallocation,
>   * posix_fallocate() should fall back to the library implementation (i.e.
> @@ -398,7 +401,8 @@ asmlinkage long sys_fallocate(int fd, in
> 
>       /* Return error if mode is not supported */
>       ret = -EOPNOTSUPP;
> -     if (mode != FA_ALLOCATE && mode != FA_DEALLOCATE)
> +     if (!(mode == FA_ALLOCATE || mode == FA_DEALLOCATE ||
> +             mode == FA_RESV_SPACE || mode == FA_UNRESV_SPACE))
>               goto out;
> 
>       ret = -EBADF;
> -
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


<Prev in Thread] Current Thread [Next in Thread>