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 <[email protected]>
---
 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;
+       }
 
-       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 {
-- 
1.5.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel

Reply via email to