X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fioctl.c;h=12f3e71d29ba401196a3c1f40768467547ddf448;hb=da7238bfbc1c5267bb3c9a79e03b6c296839a07e;hp=9737a0fa881c598c890617bca80bb34b86268b8a;hpb=86090fcac5e27b630656fe3d963a6b80e26dac44;p=linux-2.6.git diff --git a/fs/ioctl.c b/fs/ioctl.c index 9737a0fa8..12f3e71d2 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -9,15 +9,24 @@ #include #include #include +#include +#include +#include #include #include +#ifdef CONFIG_VSERVER_LEGACY +extern int vx_proc_ioctl(struct inode *, struct file *, + unsigned int, unsigned long); +#endif + 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: @@ -29,18 +38,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); @@ -119,6 +128,48 @@ asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) else error = -ENOTTY; break; +#ifdef CONFIG_VSERVER_LEGACY +#ifndef CONFIG_INOXID_NONE + case FIOC_GETXID: { + struct inode *inode = filp->f_dentry->d_inode; + + /* fixme: if stealth, return -ENOTTY */ + error = -EPERM; + if (capable(CAP_CONTEXT)) + error = put_user(inode->i_xid, (int *) arg); + break; + } + case FIOC_SETXID: { + struct inode *inode = filp->f_dentry->d_inode; + int xid; + + /* fixme: if stealth, return -ENOTTY */ + error = -EPERM; + if (!capable(CAP_CONTEXT)) + break; + error = -EROFS; + if (IS_RDONLY(inode)) + break; + error = -ENOSYS; + if (!(inode->i_sb->s_flags & MS_TAGXID)) + break; + error = -EFAULT; + if (get_user(xid, (int *) arg)) + break; + error = 0; + inode->i_xid = (xid & 0xFFFF); + inode->i_ctime = CURRENT_TIME; + mark_inode_dirty(inode); + break; + } +#endif + case FIOC_GETXFLG: + case FIOC_SETXFLG: + error = -ENOTTY; + if (filp->f_dentry->d_inode->i_sb->s_magic == PROC_SUPER_MAGIC) + error = vx_proc_ioctl(filp->f_dentry->d_inode, filp, cmd, arg); + break; +#endif default: error = -ENOTTY; if (S_ISREG(filp->f_dentry->d_inode->i_mode))