Commit 8d098070 authored by Arnd Bergmann's avatar Arnd Bergmann

gfs2: add compat_ioctl support

Out of the four ioctl commands supported on gfs2, only FITRIM
works in compat mode.

Add a proper handler based on the ext4 implementation.

Fixes: 6ddc5c3d ("gfs2: getlabel support")
Reviewed-by: default avatarBob Peterson <rpeterso@redhat.com>
Cc: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent 0581f186
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/compat.h>
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/buffer_head.h> #include <linux/buffer_head.h>
#include <linux/pagemap.h> #include <linux/pagemap.h>
...@@ -354,6 +355,31 @@ static long gfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ...@@ -354,6 +355,31 @@ static long gfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
return -ENOTTY; return -ENOTTY;
} }
#ifdef CONFIG_COMPAT
static long gfs2_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
switch(cmd) {
/* These are just misnamed, they actually get/put from/to user an int */
case FS_IOC32_GETFLAGS:
cmd = FS_IOC_GETFLAGS;
break;
case FS_IOC32_SETFLAGS:
cmd = FS_IOC_SETFLAGS;
break;
/* Keep this list in sync with gfs2_ioctl */
case FITRIM:
case FS_IOC_GETFSLABEL:
break;
default:
return -ENOIOCTLCMD;
}
return gfs2_ioctl(filp, cmd, (unsigned long)compat_ptr(arg));
}
#else
#define gfs2_compat_ioctl NULL
#endif
/** /**
* gfs2_size_hint - Give a hint to the size of a write request * gfs2_size_hint - Give a hint to the size of a write request
* @filep: The struct file * @filep: The struct file
...@@ -1293,6 +1319,7 @@ const struct file_operations gfs2_file_fops = { ...@@ -1293,6 +1319,7 @@ const struct file_operations gfs2_file_fops = {
.write_iter = gfs2_file_write_iter, .write_iter = gfs2_file_write_iter,
.iopoll = iomap_dio_iopoll, .iopoll = iomap_dio_iopoll,
.unlocked_ioctl = gfs2_ioctl, .unlocked_ioctl = gfs2_ioctl,
.compat_ioctl = gfs2_compat_ioctl,
.mmap = gfs2_mmap, .mmap = gfs2_mmap,
.open = gfs2_open, .open = gfs2_open,
.release = gfs2_release, .release = gfs2_release,
...@@ -1308,6 +1335,7 @@ const struct file_operations gfs2_file_fops = { ...@@ -1308,6 +1335,7 @@ const struct file_operations gfs2_file_fops = {
const struct file_operations gfs2_dir_fops = { const struct file_operations gfs2_dir_fops = {
.iterate_shared = gfs2_readdir, .iterate_shared = gfs2_readdir,
.unlocked_ioctl = gfs2_ioctl, .unlocked_ioctl = gfs2_ioctl,
.compat_ioctl = gfs2_compat_ioctl,
.open = gfs2_open, .open = gfs2_open,
.release = gfs2_release, .release = gfs2_release,
.fsync = gfs2_fsync, .fsync = gfs2_fsync,
...@@ -1324,6 +1352,7 @@ const struct file_operations gfs2_file_fops_nolock = { ...@@ -1324,6 +1352,7 @@ const struct file_operations gfs2_file_fops_nolock = {
.write_iter = gfs2_file_write_iter, .write_iter = gfs2_file_write_iter,
.iopoll = iomap_dio_iopoll, .iopoll = iomap_dio_iopoll,
.unlocked_ioctl = gfs2_ioctl, .unlocked_ioctl = gfs2_ioctl,
.compat_ioctl = gfs2_compat_ioctl,
.mmap = gfs2_mmap, .mmap = gfs2_mmap,
.open = gfs2_open, .open = gfs2_open,
.release = gfs2_release, .release = gfs2_release,
...@@ -1337,6 +1366,7 @@ const struct file_operations gfs2_file_fops_nolock = { ...@@ -1337,6 +1366,7 @@ const struct file_operations gfs2_file_fops_nolock = {
const struct file_operations gfs2_dir_fops_nolock = { const struct file_operations gfs2_dir_fops_nolock = {
.iterate_shared = gfs2_readdir, .iterate_shared = gfs2_readdir,
.unlocked_ioctl = gfs2_ioctl, .unlocked_ioctl = gfs2_ioctl,
.compat_ioctl = gfs2_compat_ioctl,
.open = gfs2_open, .open = gfs2_open,
.release = gfs2_release, .release = gfs2_release,
.fsync = gfs2_fsync, .fsync = gfs2_fsync,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment