X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fioctl.c;h=c4d38f62f7b746ae4c46cac3820561f450109bde;hb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;hp=f84ba41b27a160e8a25c96d3d96d00c909b5e183;hpb=a8e794ca871505c8ea96cc102f4ad555c5231d7f;p=linux-2.6.git diff --git a/fs/ioctl.c b/fs/ioctl.c index f84ba41b2..c4d38f62f 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -4,11 +4,13 @@ * Copyright (C) 1991, 1992 Linus Torvalds */ +#include #include #include #include #include #include +#include #include #include #include @@ -16,7 +18,7 @@ #include #include -#ifdef CONFIG_VSERVER_LEGACY +#ifdef CONFIG_VSERVER_LEGACY extern int vx_proc_ioctl(struct inode *, struct file *, unsigned int, unsigned long); #endif @@ -26,6 +28,7 @@ static int file_ioctl(struct file *filp,unsigned int cmd,unsigned long arg) int error; int block; struct inode * inode = filp->f_dentry->d_inode; + int __user *p = (int __user *)arg; switch (cmd) { case FIBMAP: @@ -37,18 +40,18 @@ static int file_ioctl(struct file *filp,unsigned int cmd,unsigned long arg) return -EINVAL; if (!capable(CAP_SYS_RAWIO)) return -EPERM; - if ((error = get_user(block, (int *) arg)) != 0) + if ((error = get_user(block, p)) != 0) return error; res = mapping->a_ops->bmap(mapping, block); - return put_user(res, (int *) arg); + return put_user(res, p); } case FIGETBSZ: if (inode->i_sb == NULL) return -EBADF; - return put_user(inode->i_sb->s_blocksize, (int *) arg); + return put_user(inode->i_sb->s_blocksize, p); case FIONREAD: - return put_user(i_size_read(inode) - filp->f_pos, (int *) arg); + return put_user(i_size_read(inode) - filp->f_pos, p); } if (filp->f_op && filp->f_op->ioctl) return filp->f_op->ioctl(inode, filp, cmd, arg); @@ -127,7 +130,7 @@ asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) else error = -ENOTTY; break; -#ifdef CONFIG_VSERVER_LEGACY +#ifdef CONFIG_VSERVER_LEGACY #ifndef CONFIG_INOXID_NONE case FIOC_GETXID: { struct inode *inode = filp->f_dentry->d_inode; @@ -159,7 +162,7 @@ asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) inode->i_xid = (xid & 0xFFFF); inode->i_ctime = CURRENT_TIME; mark_inode_dirty(inode); - break; + break; } #endif case FIOC_GETXFLG: @@ -182,3 +185,11 @@ asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) out: return error; } + +/* + * Platforms implementing 32 bit compatibility ioctl handlers in + * modules need this exported + */ +#ifdef CONFIG_COMPAT +EXPORT_SYMBOL(sys_ioctl); +#endif