]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/ocfs2/ioctl.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/mingo/linux-2.6-sched
[linux-2.6-omap-h63xx.git] / fs / ocfs2 / ioctl.c
index 3663cef806897ce30436b0555b6f0be9834c428c..bd68c3f2afbeab67a05c32eda336266db7cd7406 100644 (file)
@@ -14,6 +14,7 @@
 #include "ocfs2.h"
 #include "alloc.h"
 #include "dlmglue.h"
+#include "file.h"
 #include "inode.h"
 #include "journal.h"
 
@@ -26,11 +27,12 @@ static int ocfs2_get_inode_attr(struct inode *inode, unsigned *flags)
 {
        int status;
 
-       status = ocfs2_meta_lock(inode, NULL, NULL, 0);
+       status = ocfs2_meta_lock(inode, NULL, 0);
        if (status < 0) {
                mlog_errno(status);
                return status;
        }
+       ocfs2_get_inode_flags(OCFS2_I(inode));
        *flags = OCFS2_I(inode)->ip_attr;
        ocfs2_meta_unlock(inode, 0);
 
@@ -43,14 +45,14 @@ static int ocfs2_set_inode_attr(struct inode *inode, unsigned flags,
 {
        struct ocfs2_inode_info *ocfs2_inode = OCFS2_I(inode);
        struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
-       struct ocfs2_journal_handle *handle = NULL;
+       handle_t *handle = NULL;
        struct buffer_head *bh = NULL;
        unsigned oldflags;
        int status;
 
        mutex_lock(&inode->i_mutex);
 
-       status = ocfs2_meta_lock(inode, NULL, &bh, 1);
+       status = ocfs2_meta_lock(inode, &bh, 1);
        if (status < 0) {
                mlog_errno(status);
                goto bail;
@@ -67,7 +69,7 @@ static int ocfs2_set_inode_attr(struct inode *inode, unsigned flags,
        if (!S_ISDIR(inode->i_mode))
                flags &= ~OCFS2_DIRSYNC_FL;
 
-       handle = ocfs2_start_trans(osb, NULL, OCFS2_INODE_UPDATE_CREDITS);
+       handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
        if (IS_ERR(handle)) {
                status = PTR_ERR(handle);
                mlog_errno(status);
@@ -96,7 +98,7 @@ static int ocfs2_set_inode_attr(struct inode *inode, unsigned flags,
        if (status < 0)
                mlog_errno(status);
 
-       ocfs2_commit_trans(handle);
+       ocfs2_commit_trans(osb, handle);
 bail_unlock:
        ocfs2_meta_unlock(inode, 1);
 bail:
@@ -114,6 +116,7 @@ int ocfs2_ioctl(struct inode * inode, struct file * filp,
 {
        unsigned int flags;
        int status;
+       struct ocfs2_space_resv sr;
 
        switch (cmd) {
        case OCFS2_IOC_GETFLAGS:
@@ -129,8 +132,44 @@ int ocfs2_ioctl(struct inode * inode, struct file * filp,
 
                return ocfs2_set_inode_attr(inode, flags,
                        OCFS2_FL_MODIFIABLE);
+       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);
        default:
                return -ENOTTY;
        }
 }
 
+#ifdef CONFIG_COMPAT
+long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
+{
+       struct inode *inode = file->f_path.dentry->d_inode;
+       int ret;
+
+       switch (cmd) {
+       case OCFS2_IOC32_GETFLAGS:
+               cmd = OCFS2_IOC_GETFLAGS;
+               break;
+       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:
+               break;
+       default:
+               return -ENOIOCTLCMD;
+       }
+
+       lock_kernel();
+       ret = ocfs2_ioctl(inode, file, cmd, arg);
+       unlock_kernel();
+       return ret;
+}
+#endif