diff options
author | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2009-04-06 22:01:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-07 11:31:18 -0400 |
commit | dc498d09be28172846cacded35ca2378222a8c7b (patch) | |
tree | 42b31073a0fb4eb74d6c09c2f4b9711262e97d2a /fs/nilfs2/ioctl.c | |
parent | 1088dcf4c3a0a27fdad5214781d5084b11405238 (diff) |
nilfs2: use fixed sized types for ioctl structures
Nilfs ioctl had structures not having fixed sized types such as:
struct nilfs_argv {
void *v_base;
size_t v_nmembs;
size_t v_size;
int v_index;
int v_flags;
};
Further, some of them are wrongly aligned:
e.g.
struct nilfs_cpmode {
__u64 cm_cno;
int cm_mode;
};
The size of wrongly aligned structures varies depending on
architectures, and it breaks the identity of ioctl commands, which
leads to arch dependent errors.
Previously, these are compensated by using compat_ioctl.
This fixes these problems and allows removal of compat ioctl.
Since this will change sizes of those structures, binary compatibility
for the past utilities will once break; new utilities have to be used
instead. However, it would be helpful to avoid platform dependent
problems in the long term.
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/nilfs2/ioctl.c')
-rw-r--r-- | fs/nilfs2/ioctl.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index 85a291ccc1be..7fbd9fe1d035 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c | |||
@@ -41,6 +41,7 @@ static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs, | |||
41 | void *, size_t, size_t)) | 41 | void *, size_t, size_t)) |
42 | { | 42 | { |
43 | void *buf; | 43 | void *buf; |
44 | void __user *base = (void __user *)(unsigned long)argv->v_base; | ||
44 | size_t maxmembs, total, n; | 45 | size_t maxmembs, total, n; |
45 | ssize_t nr; | 46 | ssize_t nr; |
46 | int ret, i; | 47 | int ret, i; |
@@ -64,9 +65,8 @@ static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs, | |||
64 | n = (argv->v_nmembs - i < maxmembs) ? | 65 | n = (argv->v_nmembs - i < maxmembs) ? |
65 | argv->v_nmembs - i : maxmembs; | 66 | argv->v_nmembs - i : maxmembs; |
66 | if ((dir & _IOC_WRITE) && | 67 | if ((dir & _IOC_WRITE) && |
67 | copy_from_user(buf, | 68 | copy_from_user(buf, base + argv->v_size * i, |
68 | (void __user *)argv->v_base + argv->v_size * i, | 69 | argv->v_size * n)) { |
69 | argv->v_size * n)) { | ||
70 | ret = -EFAULT; | 70 | ret = -EFAULT; |
71 | break; | 71 | break; |
72 | } | 72 | } |
@@ -78,9 +78,8 @@ static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs, | |||
78 | break; | 78 | break; |
79 | } | 79 | } |
80 | if ((dir & _IOC_READ) && | 80 | if ((dir & _IOC_READ) && |
81 | copy_to_user( | 81 | copy_to_user(base + argv->v_size * i, buf, |
82 | (void __user *)argv->v_base + argv->v_size * i, | 82 | argv->v_size * nr)) { |
83 | buf, argv->v_size * nr)) { | ||
84 | ret = -EFAULT; | 83 | ret = -EFAULT; |
85 | break; | 84 | break; |
86 | } | 85 | } |