diff options
Diffstat (limited to 'fs/ext2')
-rw-r--r-- | fs/ext2/dir.c | 3 | ||||
-rw-r--r-- | fs/ext2/ext2.h | 1 | ||||
-rw-r--r-- | fs/ext2/file.c | 12 | ||||
-rw-r--r-- | fs/ext2/ioctl.c | 32 | ||||
-rw-r--r-- | fs/ext2/namei.c | 2 |
5 files changed, 45 insertions, 5 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 */ |
138 | extern int ext2_ioctl (struct inode *, struct file *, unsigned int, | 138 | extern int ext2_ioctl (struct inode *, struct file *, unsigned int, |
139 | unsigned long); | 139 | unsigned long); |
140 | extern long ext2_compat_ioctl(struct file *, unsigned int, unsigned long); | ||
140 | 141 | ||
141 | /* namei.c */ | 142 | /* namei.c */ |
142 | struct dentry *ext2_get_parent(struct dentry *child); | 143 | struct dentry *ext2_get_parent(struct dentry *child); |
diff --git a/fs/ext2/file.c b/fs/ext2/file.c index 23e2c7ccec1d..2dba473c524a 100644 --- a/fs/ext2/file.c +++ b/fs/ext2/file.c | |||
@@ -41,17 +41,18 @@ static int ext2_release_file (struct inode * inode, struct file * filp) | |||
41 | */ | 41 | */ |
42 | const struct file_operations ext2_file_operations = { | 42 | const struct file_operations ext2_file_operations = { |
43 | .llseek = generic_file_llseek, | 43 | .llseek = generic_file_llseek, |
44 | .read = generic_file_read, | 44 | .read = do_sync_read, |
45 | .write = generic_file_write, | 45 | .write = do_sync_write, |
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, |
52 | .fsync = ext2_sync_file, | 55 | .fsync = ext2_sync_file, |
53 | .readv = generic_file_readv, | ||
54 | .writev = generic_file_writev, | ||
55 | .sendfile = generic_file_sendfile, | 56 | .sendfile = generic_file_sendfile, |
56 | .splice_read = generic_file_splice_read, | 57 | .splice_read = generic_file_splice_read, |
57 | .splice_write = generic_file_splice_write, | 58 | .splice_write = generic_file_splice_write, |
@@ -63,6 +64,9 @@ const struct file_operations ext2_xip_file_operations = { | |||
63 | .read = xip_file_read, | 64 | .read = xip_file_read, |
64 | .write = xip_file_write, | 65 | .write = xip_file_write, |
65 | .ioctl = ext2_ioctl, | 66 | .ioctl = ext2_ioctl, |
67 | #ifdef CONFIG_COMPAT | ||
68 | .compat_ioctl = ext2_compat_ioctl, | ||
69 | #endif | ||
66 | .mmap = xip_file_mmap, | 70 | .mmap = xip_file_mmap, |
67 | .open = generic_file_open, | 71 | .open = generic_file_open, |
68 | .release = ext2_release_file, | 72 | .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 | ||
87 | long 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 | ||
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index 4ca824985321..e1af5b4cf80c 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c | |||
@@ -326,7 +326,7 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
326 | ext2_set_link(new_dir, new_de, new_page, old_inode); | 326 | ext2_set_link(new_dir, new_de, new_page, old_inode); |
327 | new_inode->i_ctime = CURRENT_TIME_SEC; | 327 | new_inode->i_ctime = CURRENT_TIME_SEC; |
328 | if (dir_de) | 328 | if (dir_de) |
329 | new_inode->i_nlink--; | 329 | drop_nlink(new_inode); |
330 | inode_dec_link_count(new_inode); | 330 | inode_dec_link_count(new_inode); |
331 | } else { | 331 | } else { |
332 | if (dir_de) { | 332 | if (dir_de) { |