[Ocfs2-devel] [PATCH 3/3] Ocfs2: Cleanup for OCFS2_IOC_RESVSP & OCFS2_IOC_UNRESVSP.

Sunil Mushran sunil.mushran at oracle.com
Thu Mar 31 14:13:41 PDT 2011


On 03/31/2011 12:34 AM, Tristan Ye wrote:
> Given that VFS has alreay supported an entry to handle the unwritten_extents
> and punching-hole(is to be supported) by filp->f_op->fallocate(), our path of
> OCFS2_IOC_RESVSP becomes a bit redundant somehow, especially given the fact
> that ocfs2_fallocate() is working well.
>
> Signed-off-by: Tristan Ye<tristan.ye at oracle.com>
> ---
>   fs/ocfs2/file.c        |   63 ++++++++++++++++++++---------------------------
>   fs/ocfs2/file.h        |    3 --
>   fs/ocfs2/ioctl.c       |   13 ----------
>   fs/ocfs2/ocfs2_ioctl.h |   29 +++-------------------
>   4 files changed, 31 insertions(+), 77 deletions(-)
>
> diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
> index cce8c2b..d016322 100644
> --- a/fs/ocfs2/file.c
> +++ b/fs/ocfs2/file.c
> @@ -37,6 +37,7 @@
>   #include<linux/falloc.h>
>   #include<linux/quotaops.h>
>   #include<linux/blkdev.h>
> +#include<linux/falloc.h>
>
>   #include<cluster/masklog.h>
>
> @@ -1804,7 +1805,7 @@ out:
>    */
>   static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
>   				     loff_t f_pos, unsigned int cmd,
> -				     struct ocfs2_space_resv *sr,
> +				     struct space_resv *sr,
>   				     int change_size)
>   {
>   	int ret;
> @@ -1866,7 +1867,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
>   	}
>   	size = sr->l_start + sr->l_len;
>
> -	if (cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) {
> +	if (cmd == FS_IOC_RESVSP || cmd == FS_IOC_RESVSP64) {
>   		if (sr->l_len<= 0) {
>   			ret = -EINVAL;
>   			goto out_inode_unlock;
> @@ -1883,8 +1884,8 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
>
>   	down_write(&OCFS2_I(inode)->ip_alloc_sem);
>   	switch (cmd) {
> -	case OCFS2_IOC_RESVSP:
> -	case OCFS2_IOC_RESVSP64:
> +	case FS_IOC_RESVSP:
> +	case FS_IOC_RESVSP64:
>   		/*
>   		 * This takes unsigned offsets, but the signed ones we
>   		 * pass have been checked against overflow above.
> @@ -1892,8 +1893,8 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
>   		ret = ocfs2_allocate_unwritten_extents(inode, sr->l_start,
>   						       sr->l_len);
>   		break;
> -	case OCFS2_IOC_UNRESVSP:
> -	case OCFS2_IOC_UNRESVSP64:
> +	case FS_IOC_UNRESVSP:
> +	case FS_IOC_UNRESVSP64:
>   		ret = ocfs2_remove_inode_range(inode, di_bh, sr->l_start,
>   					       sr->l_len);
>   		break;
> @@ -1937,47 +1938,37 @@ out:
>   	return ret;
>   }
>
> -int ocfs2_change_file_space(struct file *file, unsigned int cmd,
> -			    struct ocfs2_space_resv *sr)
> -{
> -	struct inode *inode = file->f_path.dentry->d_inode;
> -	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> -
> -	if ((cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64)&&
> -	    !ocfs2_writes_unwritten_extents(osb))
> -		return -ENOTTY;
> -	else if ((cmd == OCFS2_IOC_UNRESVSP || cmd == OCFS2_IOC_UNRESVSP64)&&
> -		 !ocfs2_sparse_alloc(osb))
> -		return -ENOTTY;
> -
> -	if (!S_ISREG(inode->i_mode))
> -		return -EINVAL;
> -
> -	if (!(file->f_mode&  FMODE_WRITE))
> -		return -EBADF;
> -
> -	return __ocfs2_change_file_space(file, inode, file->f_pos, cmd, sr, 0);
> -}
> -
>   static long ocfs2_fallocate(struct file *file, int mode, loff_t offset,
>   			    loff_t len)
>   {
>   	struct inode *inode = file->f_path.dentry->d_inode;
>   	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> -	struct ocfs2_space_resv sr;
> +	struct space_resv sr;
>   	int change_size = 1;
> -	int cmd = OCFS2_IOC_RESVSP64;
> +	int cmd = FS_IOC_RESVSP64;
>
>   	if (mode&  ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
>   		return -EOPNOTSUPP;
> -	if (!ocfs2_writes_unwritten_extents(osb))
> -		return -EOPNOTSUPP;
>
> -	if (mode&  FALLOC_FL_KEEP_SIZE)
> -		change_size = 0;
> +	/*
> +	 * unwritten extents
> +	 */
> +	if ((mode&  FALLOC_FL_KEEP_SIZE)&&  !(mode&  FALLOC_FL_PUNCH_HOLE)) {
> +		if (ocfs2_writes_unwritten_extents(osb))
> +			change_size = 0;
> +		else
> +			return -EOPNOTSUPP;
> +	}

I think you have made the code harder to read that it was previously.


>
> -	if (mode&  FALLOC_FL_PUNCH_HOLE)
> -		cmd = OCFS2_IOC_UNRESVSP64;
> +	/*
> +	 * punching hole
> +	 */
> +	if ((mode&  FALLOC_FL_KEEP_SIZE)&&  (mode&  FALLOC_FL_PUNCH_HOLE)) {
> +		if (ocfs2_sparse_alloc(osb))
> +			cmd = FS_IOC_UNRESVSP64;
> +		else
> +			return -EOPNOTSUPP;
> +	}
>
>   	sr.l_whence = 0;
>   	sr.l_start = (s64)offset;
> diff --git a/fs/ocfs2/file.h b/fs/ocfs2/file.h
> index f5afbbe..2c9b7a8 100644
> --- a/fs/ocfs2/file.h
> +++ b/fs/ocfs2/file.h
> @@ -68,9 +68,6 @@ int ocfs2_should_update_atime(struct inode *inode,
>   int ocfs2_update_inode_atime(struct inode *inode,
>   			     struct buffer_head *bh);
>
> -int ocfs2_change_file_space(struct file *file, unsigned int cmd,
> -			    struct ocfs2_space_resv *sr);
> -
>   int ocfs2_check_range_for_refcount(struct inode *inode, loff_t pos,
>   				   size_t count);
>   #endif /* OCFS2_FILE_H */
> diff --git a/fs/ocfs2/ioctl.c b/fs/ocfs2/ioctl.c
> index 8f13c59..d703210 100644
> --- a/fs/ocfs2/ioctl.c
> +++ b/fs/ocfs2/ioctl.c
> @@ -476,7 +476,6 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
>   	unsigned int flags;
>   	int new_clusters;
>   	int status;
> -	struct ocfs2_space_resv sr;
>   	struct ocfs2_new_group_input input;
>   	struct reflink_arguments args;
>   	const char *old_path, *new_path;
> @@ -502,14 +501,6 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
>   			OCFS2_FL_MODIFIABLE);
>   		mnt_drop_write(filp->f_path.mnt);
>   		return status;
> -	case OCFS2_IOC_RESVSP:
> -	case OCFS2_IOC_RESVSP64:
> -	case OCFS2_IOC_UNRESVSP:
> -	case OCFS2_IOC_UNRESVSP64:
> -		if (copy_from_user(&sr, (int __user *) arg, sizeof(sr)))
> -			return -EFAULT;
> -
> -		return ocfs2_change_file_space(filp, cmd,&sr);
>   	case OCFS2_IOC_GROUP_EXTEND:
>   		if (!capable(CAP_SYS_RESOURCE))
>   			return -EPERM;
> @@ -562,10 +553,6 @@ long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
>   	case OCFS2_IOC32_SETFLAGS:
>   		cmd = OCFS2_IOC_SETFLAGS;
>   		break;
> -	case OCFS2_IOC_RESVSP:
> -	case OCFS2_IOC_RESVSP64:
> -	case OCFS2_IOC_UNRESVSP:
> -	case OCFS2_IOC_UNRESVSP64:
>   	case OCFS2_IOC_GROUP_EXTEND:
>   	case OCFS2_IOC_GROUP_ADD:
>   	case OCFS2_IOC_GROUP_ADD64:
> diff --git a/fs/ocfs2/ocfs2_ioctl.h b/fs/ocfs2/ocfs2_ioctl.h
> index b46f39b..4f9bf28 100644
> --- a/fs/ocfs2/ocfs2_ioctl.h
> +++ b/fs/ocfs2/ocfs2_ioctl.h
> @@ -28,31 +28,10 @@
>   #define OCFS2_IOC32_GETFLAGS	FS_IOC32_GETFLAGS
>   #define OCFS2_IOC32_SETFLAGS	FS_IOC32_SETFLAGS
>
> -/*
> - * Space reservation / allocation / free ioctls and argument structure
> - * are designed to be compatible with XFS.
> - *
> - * ALLOCSP* and FREESP* are not and will never be supported, but are
> - * included here for completeness.
> - */
> -struct ocfs2_space_resv {
> -	__s16		l_type;
> -	__s16		l_whence;
> -	__s64		l_start;
> -	__s64		l_len;		/* len == 0 means until end of file */
> -	__s32		l_sysid;
> -	__u32		l_pid;
> -	__s32		l_pad[4];	/* reserve area			    */
> -};
> -
> -#define OCFS2_IOC_ALLOCSP		_IOW ('X', 10, struct ocfs2_space_resv)
> -#define OCFS2_IOC_FREESP		_IOW ('X', 11, struct ocfs2_space_resv)
> -#define OCFS2_IOC_RESVSP		_IOW ('X', 40, struct ocfs2_space_resv)
> -#define OCFS2_IOC_UNRESVSP	_IOW ('X', 41, struct ocfs2_space_resv)
> -#define OCFS2_IOC_ALLOCSP64	_IOW ('X', 36, struct ocfs2_space_resv)
> -#define OCFS2_IOC_FREESP64	_IOW ('X', 37, struct ocfs2_space_resv)
> -#define OCFS2_IOC_RESVSP64	_IOW ('X', 42, struct ocfs2_space_resv)
> -#define OCFS2_IOC_UNRESVSP64	_IOW ('X', 43, struct ocfs2_space_resv)
> +#define OCFS2_IOC_ALLOCSP		_IOW ('X', 10, struct space_resv)
> +#define OCFS2_IOC_FREESP		_IOW ('X', 11, struct space_resv)
> +#define OCFS2_IOC_ALLOCSP64	_IOW ('X', 36, struct space_resv)
> +#define OCFS2_IOC_FREESP64	_IOW ('X', 37, struct space_resv)
>
>   /* Used to pass group descriptor data when online resize is done */
>   struct ocfs2_new_group_input {




More information about the Ocfs2-devel mailing list