aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext2
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext2')
-rw-r--r--fs/ext2/dir.c3
-rw-r--r--fs/ext2/ext2.h1
-rw-r--r--fs/ext2/file.c6
-rw-r--r--fs/ext2/ioctl.c32
4 files changed, 42 insertions, 0 deletions
diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c
index 92ea8265d7d5..3e7a84a1e509 100644
--- a/fs/ext2/dir.c
+++ b/fs/ext2/dir.c
@@ -661,5 +661,8 @@ const struct file_operations ext2_dir_operations = {
661 .read = generic_read_dir, 661 .read = generic_read_dir,
662 .readdir = ext2_readdir, 662 .readdir = ext2_readdir,
663 .ioctl = ext2_ioctl, 663 .ioctl = ext2_ioctl,
664#ifdef CONFIG_COMPAT
665 .compat_ioctl = ext2_compat_ioctl,
666#endif
664 .fsync = ext2_sync_file, 667 .fsync = ext2_sync_file,
665}; 668};
diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h
index e65a019fc7a5..c19ac153f56b 100644
--- a/fs/ext2/ext2.h
+++ b/fs/ext2/ext2.h
@@ -137,6 +137,7 @@ extern void ext2_set_inode_flags(struct inode *inode);
137/* ioctl.c */ 137/* ioctl.c */
138extern int ext2_ioctl (struct inode *, struct file *, unsigned int, 138extern int ext2_ioctl (struct inode *, struct file *, unsigned int,
139 unsigned long); 139 unsigned long);
140extern long ext2_compat_ioctl(struct file *, unsigned int, unsigned long);
140 141
141/* namei.c */ 142/* namei.c */
142struct dentry *ext2_get_parent(struct dentry *child); 143struct dentry *ext2_get_parent(struct dentry *child);
diff --git a/fs/ext2/file.c b/fs/ext2/file.c
index 23e2c7ccec1d..e8bbed9dd268 100644
--- a/fs/ext2/file.c
+++ b/fs/ext2/file.c
@@ -46,6 +46,9 @@ const struct file_operations ext2_file_operations = {
46 .aio_read = generic_file_aio_read, 46 .aio_read = generic_file_aio_read,
47 .aio_write = generic_file_aio_write, 47 .aio_write = generic_file_aio_write,
48 .ioctl = ext2_ioctl, 48 .ioctl = ext2_ioctl,
49#ifdef CONFIG_COMPAT
50 .compat_ioctl = ext2_compat_ioctl,
51#endif
49 .mmap = generic_file_mmap, 52 .mmap = generic_file_mmap,
50 .open = generic_file_open, 53 .open = generic_file_open,
51 .release = ext2_release_file, 54 .release = ext2_release_file,
@@ -63,6 +66,9 @@ const struct file_operations ext2_xip_file_operations = {
63 .read = xip_file_read, 66 .read = xip_file_read,
64 .write = xip_file_write, 67 .write = xip_file_write,
65 .ioctl = ext2_ioctl, 68 .ioctl = ext2_ioctl,
69#ifdef CONFIG_COMPAT
70 .compat_ioctl = ext2_compat_ioctl,
71#endif
66 .mmap = xip_file_mmap, 72 .mmap = xip_file_mmap,
67 .open = generic_file_open, 73 .open = generic_file_open,
68 .release = ext2_release_file, 74 .release = ext2_release_file,
diff --git a/fs/ext2/ioctl.c b/fs/ext2/ioctl.c
index 3ca9afdf713d..1dfba77eab10 100644
--- a/fs/ext2/ioctl.c
+++ b/fs/ext2/ioctl.c
@@ -11,6 +11,8 @@
11#include <linux/capability.h> 11#include <linux/capability.h>
12#include <linux/time.h> 12#include <linux/time.h>
13#include <linux/sched.h> 13#include <linux/sched.h>
14#include <linux/compat.h>
15#include <linux/smp_lock.h>
14#include <asm/current.h> 16#include <asm/current.h>
15#include <asm/uaccess.h> 17#include <asm/uaccess.h>
16 18
@@ -80,3 +82,33 @@ int ext2_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
80 return -ENOTTY; 82 return -ENOTTY;
81 } 83 }
82} 84}
85
86#ifdef CONFIG_COMPAT
87long ext2_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
88{
89 struct inode *inode = file->f_dentry->d_inode;
90 int ret;
91
92 /* These are just misnamed, they actually get/put from/to user an int */
93 switch (cmd) {
94 case EXT2_IOC32_GETFLAGS:
95 cmd = EXT2_IOC_GETFLAGS;
96 break;
97 case EXT2_IOC32_SETFLAGS:
98 cmd = EXT2_IOC_SETFLAGS;
99 break;
100 case EXT2_IOC32_GETVERSION:
101 cmd = EXT2_IOC_GETVERSION;
102 break;
103 case EXT2_IOC32_SETVERSION:
104 cmd = EXT2_IOC_SETVERSION;
105 break;
106 default:
107 return -ENOIOCTLCMD;
108 }
109 lock_kernel();
110 ret = ext2_ioctl(inode, file, cmd, (unsigned long) compat_ptr(arg));
111 unlock_kernel();
112 return ret;
113}
114#endif