Skip to content

Commit

Permalink
[PATCH] Move ncpfs 32bit compat ioctl to ncpfs
Browse files Browse the repository at this point in the history
The ncp specific compat ioctls are clearly local to one file system, so the
code can better live there.

This version of the patch moves everything into the generic ioctl handler
and uses it for both 32 and 64 bit calls.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Petr Vandrovec <petr@vandrovec.name>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Petr Vandrovec authored and Linus Torvalds committed Oct 1, 2006
1 parent 89bbc03 commit 54f67f6
Show file tree
Hide file tree
Showing 6 changed files with 217 additions and 239 deletions.
198 changes: 0 additions & 198 deletions fs/compat_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@
#include <linux/ctype.h>
#include <linux/ioctl32.h>
#include <linux/syscalls.h>
#include <linux/ncp_fs.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <linux/wireless.h>
Expand Down Expand Up @@ -2348,193 +2347,6 @@ static int rtc_ioctl(unsigned fd, unsigned cmd, unsigned long arg)
}
}

#if defined(CONFIG_NCP_FS) || defined(CONFIG_NCP_FS_MODULE)
struct ncp_ioctl_request_32 {
u32 function;
u32 size;
compat_caddr_t data;
};

struct ncp_fs_info_v2_32 {
s32 version;
u32 mounted_uid;
u32 connection;
u32 buffer_size;

u32 volume_number;
u32 directory_id;

u32 dummy1;
u32 dummy2;
u32 dummy3;
};

struct ncp_objectname_ioctl_32
{
s32 auth_type;
u32 object_name_len;
compat_caddr_t object_name; /* an userspace data, in most cases user name */
};

struct ncp_privatedata_ioctl_32
{
u32 len;
compat_caddr_t data; /* ~1000 for NDS */
};

#define NCP_IOC_NCPREQUEST_32 _IOR('n', 1, struct ncp_ioctl_request_32)
#define NCP_IOC_GETMOUNTUID2_32 _IOW('n', 2, u32)
#define NCP_IOC_GET_FS_INFO_V2_32 _IOWR('n', 4, struct ncp_fs_info_v2_32)
#define NCP_IOC_GETOBJECTNAME_32 _IOWR('n', 9, struct ncp_objectname_ioctl_32)
#define NCP_IOC_SETOBJECTNAME_32 _IOR('n', 9, struct ncp_objectname_ioctl_32)
#define NCP_IOC_GETPRIVATEDATA_32 _IOWR('n', 10, struct ncp_privatedata_ioctl_32)
#define NCP_IOC_SETPRIVATEDATA_32 _IOR('n', 10, struct ncp_privatedata_ioctl_32)

static int do_ncp_ncprequest(unsigned int fd, unsigned int cmd, unsigned long arg)
{
struct ncp_ioctl_request_32 n32;
struct ncp_ioctl_request __user *p = compat_alloc_user_space(sizeof(*p));

if (copy_from_user(&n32, compat_ptr(arg), sizeof(n32)) ||
put_user(n32.function, &p->function) ||
put_user(n32.size, &p->size) ||
put_user(compat_ptr(n32.data), &p->data))
return -EFAULT;

return sys_ioctl(fd, NCP_IOC_NCPREQUEST, (unsigned long)p);
}

static int do_ncp_getmountuid2(unsigned int fd, unsigned int cmd, unsigned long arg)
{
mm_segment_t old_fs = get_fs();
__kernel_uid_t kuid;
int err;

cmd = NCP_IOC_GETMOUNTUID2;

set_fs(KERNEL_DS);
err = sys_ioctl(fd, cmd, (unsigned long)&kuid);
set_fs(old_fs);

if (!err)
err = put_user(kuid,
(unsigned int __user *) compat_ptr(arg));

return err;
}

static int do_ncp_getfsinfo2(unsigned int fd, unsigned int cmd, unsigned long arg)
{
mm_segment_t old_fs = get_fs();
struct ncp_fs_info_v2_32 n32;
struct ncp_fs_info_v2 n;
int err;

if (copy_from_user(&n32, compat_ptr(arg), sizeof(n32)))
return -EFAULT;
if (n32.version != NCP_GET_FS_INFO_VERSION_V2)
return -EINVAL;
n.version = NCP_GET_FS_INFO_VERSION_V2;

set_fs(KERNEL_DS);
err = sys_ioctl(fd, NCP_IOC_GET_FS_INFO_V2, (unsigned long)&n);
set_fs(old_fs);

if (!err) {
n32.version = n.version;
n32.mounted_uid = n.mounted_uid;
n32.connection = n.connection;
n32.buffer_size = n.buffer_size;
n32.volume_number = n.volume_number;
n32.directory_id = n.directory_id;
n32.dummy1 = n.dummy1;
n32.dummy2 = n.dummy2;
n32.dummy3 = n.dummy3;
err = copy_to_user(compat_ptr(arg), &n32, sizeof(n32)) ? -EFAULT : 0;
}
return err;
}

static int do_ncp_getobjectname(unsigned int fd, unsigned int cmd, unsigned long arg)
{
struct ncp_objectname_ioctl_32 n32, __user *p32 = compat_ptr(arg);
struct ncp_objectname_ioctl __user *p = compat_alloc_user_space(sizeof(*p));
s32 auth_type;
u32 name_len;
int err;

if (copy_from_user(&n32, p32, sizeof(n32)) ||
put_user(n32.object_name_len, &p->object_name_len) ||
put_user(compat_ptr(n32.object_name), &p->object_name))
return -EFAULT;

err = sys_ioctl(fd, NCP_IOC_GETOBJECTNAME, (unsigned long)p);
if (err)
return err;

if (get_user(auth_type, &p->auth_type) ||
put_user(auth_type, &p32->auth_type) ||
get_user(name_len, &p->object_name_len) ||
put_user(name_len, &p32->object_name_len))
return -EFAULT;

return 0;
}

static int do_ncp_setobjectname(unsigned int fd, unsigned int cmd, unsigned long arg)
{
struct ncp_objectname_ioctl_32 n32, __user *p32 = compat_ptr(arg);
struct ncp_objectname_ioctl __user *p = compat_alloc_user_space(sizeof(*p));

if (copy_from_user(&n32, p32, sizeof(n32)) ||
put_user(n32.auth_type, &p->auth_type) ||
put_user(n32.object_name_len, &p->object_name_len) ||
put_user(compat_ptr(n32.object_name), &p->object_name))
return -EFAULT;

return sys_ioctl(fd, NCP_IOC_SETOBJECTNAME, (unsigned long)p);
}

static int do_ncp_getprivatedata(unsigned int fd, unsigned int cmd, unsigned long arg)
{
struct ncp_privatedata_ioctl_32 n32, __user *p32 = compat_ptr(arg);
struct ncp_privatedata_ioctl __user *p =
compat_alloc_user_space(sizeof(*p));
u32 len;
int err;

if (copy_from_user(&n32, p32, sizeof(n32)) ||
put_user(n32.len, &p->len) ||
put_user(compat_ptr(n32.data), &p->data))
return -EFAULT;

err = sys_ioctl(fd, NCP_IOC_GETPRIVATEDATA, (unsigned long)p);
if (err)
return err;

if (get_user(len, &p->len) ||
put_user(len, &p32->len))
return -EFAULT;

return 0;
}

static int do_ncp_setprivatedata(unsigned int fd, unsigned int cmd, unsigned long arg)
{
struct ncp_privatedata_ioctl_32 n32;
struct ncp_privatedata_ioctl_32 __user *p32 = compat_ptr(arg);
struct ncp_privatedata_ioctl __user *p =
compat_alloc_user_space(sizeof(*p));

if (copy_from_user(&n32, p32, sizeof(n32)) ||
put_user(n32.len, &p->len) ||
put_user(compat_ptr(n32.data), &p->data))
return -EFAULT;

return sys_ioctl(fd, NCP_IOC_SETPRIVATEDATA, (unsigned long)p);
}
#endif

static int
lp_timeout_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
{
Expand Down Expand Up @@ -2748,16 +2560,6 @@ HANDLE_IOCTL(RTC_IRQP_SET32, rtc_ioctl)
HANDLE_IOCTL(RTC_EPOCH_READ32, rtc_ioctl)
HANDLE_IOCTL(RTC_EPOCH_SET32, rtc_ioctl)

#if defined(CONFIG_NCP_FS) || defined(CONFIG_NCP_FS_MODULE)
HANDLE_IOCTL(NCP_IOC_NCPREQUEST_32, do_ncp_ncprequest)
HANDLE_IOCTL(NCP_IOC_GETMOUNTUID2_32, do_ncp_getmountuid2)
HANDLE_IOCTL(NCP_IOC_GET_FS_INFO_V2_32, do_ncp_getfsinfo2)
HANDLE_IOCTL(NCP_IOC_GETOBJECTNAME_32, do_ncp_getobjectname)
HANDLE_IOCTL(NCP_IOC_SETOBJECTNAME_32, do_ncp_setobjectname)
HANDLE_IOCTL(NCP_IOC_GETPRIVATEDATA_32, do_ncp_getprivatedata)
HANDLE_IOCTL(NCP_IOC_SETPRIVATEDATA_32, do_ncp_setprivatedata)
#endif

/* dvb */
HANDLE_IOCTL(VIDEO_GET_EVENT, do_video_get_event)
HANDLE_IOCTL(VIDEO_STILLPICTURE, do_video_stillpicture)
Expand Down
3 changes: 3 additions & 0 deletions fs/ncpfs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ const struct file_operations ncp_dir_operations =
.read = generic_read_dir,
.readdir = ncp_readdir,
.ioctl = ncp_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = ncp_compat_ioctl,
#endif
};

struct inode_operations ncp_dir_inode_operations =
Expand Down
3 changes: 3 additions & 0 deletions fs/ncpfs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,9 @@ const struct file_operations ncp_file_operations =
.read = ncp_file_read,
.write = ncp_file_write,
.ioctl = ncp_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = ncp_compat_ioctl,
#endif
.mmap = ncp_mmap,
.release = ncp_release,
.fsync = ncp_fsync,
Expand Down
Loading

0 comments on commit 54f67f6

Please sign in to comment.