2010-05-25 23:05:00 +00:00
|
|
|
From: Ben Hutchings <ben@decadent.org.uk>
|
2010-06-06 17:51:44 +00:00
|
|
|
Date: Mon, 17 May 2010 06:00:00 -0400
|
2010-05-25 23:05:00 +00:00
|
|
|
Subject: [PATCH 2/2] ext4: Fix compat EXT4_IOC_ADD_GROUP
|
|
|
|
|
2010-06-06 17:51:44 +00:00
|
|
|
commit 4d92dc0f00a775dc2e1267b0e00befb783902fe7 upstream.
|
2010-05-25 23:05:00 +00:00
|
|
|
|
|
|
|
struct ext4_new_group_input needs to be converted because u64 has
|
|
|
|
only 32-bit alignment on some 32-bit architectures, notably i386.
|
|
|
|
|
|
|
|
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
|
|
|
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
|
|
|
|
---
|
|
|
|
fs/ext4/ext4.h | 16 ++++++++++++++++
|
|
|
|
fs/ext4/ioctl.c | 25 +++++++++++++++++++++++--
|
|
|
|
2 files changed, 39 insertions(+), 2 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
|
2010-06-06 17:51:44 +00:00
|
|
|
index d8c28f6..2c1165f 100644
|
2010-05-25 23:05:00 +00:00
|
|
|
--- a/fs/ext4/ext4.h
|
|
|
|
+++ b/fs/ext4/ext4.h
|
|
|
|
@@ -29,6 +29,9 @@
|
|
|
|
#include <linux/wait.h>
|
|
|
|
#include <linux/blockgroup_lock.h>
|
|
|
|
#include <linux/percpu_counter.h>
|
|
|
|
+#ifdef __KERNEL__
|
|
|
|
+#include <linux/compat.h>
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The fourth extended filesystem constants/structures
|
2010-06-06 17:51:44 +00:00
|
|
|
@@ -432,6 +435,18 @@ struct ext4_new_group_input {
|
2010-05-25 23:05:00 +00:00
|
|
|
__u16 unused;
|
|
|
|
};
|
|
|
|
|
|
|
|
+#if defined(__KERNEL__) && defined(CONFIG_COMPAT)
|
|
|
|
+struct compat_ext4_new_group_input {
|
|
|
|
+ u32 group;
|
|
|
|
+ compat_u64 block_bitmap;
|
|
|
|
+ compat_u64 inode_bitmap;
|
|
|
|
+ compat_u64 inode_table;
|
|
|
|
+ u32 blocks_count;
|
|
|
|
+ u16 reserved_blocks;
|
|
|
|
+ u16 unused;
|
|
|
|
+};
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
/* The struct ext4_new_group_input in kernel space, with free_blocks_count */
|
|
|
|
struct ext4_new_group_data {
|
|
|
|
__u32 group;
|
2010-06-06 17:51:44 +00:00
|
|
|
@@ -509,6 +524,7 @@ struct ext4_new_group_data {
|
2010-05-25 23:05:00 +00:00
|
|
|
#define EXT4_IOC32_GETRSVSZ _IOR('f', 5, int)
|
|
|
|
#define EXT4_IOC32_SETRSVSZ _IOW('f', 6, int)
|
|
|
|
#define EXT4_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int)
|
|
|
|
+#define EXT4_IOC32_GROUP_ADD _IOW('f', 8, struct compat_ext4_new_group_input)
|
|
|
|
#ifdef CONFIG_JBD2_DEBUG
|
|
|
|
#define EXT4_IOC32_WAIT_FOR_READONLY _IOR('f', 99, int)
|
|
|
|
#endif
|
|
|
|
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
|
2010-06-06 17:51:44 +00:00
|
|
|
index 66fa0b0..6ddec84 100644
|
2010-05-25 23:05:00 +00:00
|
|
|
--- a/fs/ext4/ioctl.c
|
|
|
|
+++ b/fs/ext4/ioctl.c
|
2010-06-06 17:51:44 +00:00
|
|
|
@@ -373,8 +373,29 @@ long ext4_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
2010-05-25 23:05:00 +00:00
|
|
|
case EXT4_IOC32_SETRSVSZ:
|
|
|
|
cmd = EXT4_IOC_SETRSVSZ;
|
|
|
|
break;
|
|
|
|
- case EXT4_IOC_GROUP_ADD:
|
|
|
|
- break;
|
|
|
|
+ case EXT4_IOC32_GROUP_ADD: {
|
|
|
|
+ struct compat_ext4_new_group_input __user *uinput;
|
|
|
|
+ struct ext4_new_group_input input;
|
|
|
|
+ mm_segment_t old_fs;
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ uinput = compat_ptr(arg);
|
|
|
|
+ err = get_user(input.group, &uinput->group);
|
|
|
|
+ err |= get_user(input.block_bitmap, &uinput->block_bitmap);
|
|
|
|
+ err |= get_user(input.inode_bitmap, &uinput->inode_bitmap);
|
|
|
|
+ err |= get_user(input.inode_table, &uinput->inode_table);
|
|
|
|
+ err |= get_user(input.blocks_count, &uinput->blocks_count);
|
|
|
|
+ err |= get_user(input.reserved_blocks,
|
|
|
|
+ &uinput->reserved_blocks);
|
|
|
|
+ if (err)
|
|
|
|
+ return -EFAULT;
|
|
|
|
+ old_fs = get_fs();
|
|
|
|
+ set_fs(KERNEL_DS);
|
|
|
|
+ err = ext4_ioctl(file, EXT4_IOC_GROUP_ADD,
|
|
|
|
+ (unsigned long) &input);
|
|
|
|
+ set_fs(old_fs);
|
|
|
|
+ return err;
|
|
|
|
+ }
|
|
|
|
default:
|
|
|
|
return -ENOIOCTLCMD;
|
|
|
|
}
|
|
|
|
--
|
|
|
|
1.7.1
|
|
|
|
|