forked from Minki/linux
[XFS] Compat ioctl handler for handle operations
32bit struct xfs_fsop_handlereq has different size and offsets (due to pointers). TODO: case XFS_IOC_{FSSETDM,ATTRLIST,ATTRMULTI}_BY_HANDLE still not handled. SGI-PV: 967354 SGI-Modid: xfs-linux-melb:xfs-kern:29101a Signed-off-by: Michal Marek <mmarek@suse.cz> Signed-off-by: David Chinner <dgc@sgi.com> Signed-off-by: Tim Shimmin <tes@sgi.com>
This commit is contained in:
parent
547e00c3c6
commit
1fa503df66
@ -141,6 +141,50 @@ xfs_ioctl32_bulkstat(
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef struct compat_xfs_fsop_handlereq {
|
||||
__u32 fd; /* fd for FD_TO_HANDLE */
|
||||
compat_uptr_t path; /* user pathname */
|
||||
__u32 oflags; /* open flags */
|
||||
compat_uptr_t ihandle; /* user supplied handle */
|
||||
__u32 ihandlen; /* user supplied length */
|
||||
compat_uptr_t ohandle; /* user buffer for handle */
|
||||
compat_uptr_t ohandlen; /* user buffer length */
|
||||
} compat_xfs_fsop_handlereq_t;
|
||||
|
||||
#define XFS_IOC_PATH_TO_FSHANDLE_32 \
|
||||
_IOWR('X', 104, struct compat_xfs_fsop_handlereq)
|
||||
#define XFS_IOC_PATH_TO_HANDLE_32 \
|
||||
_IOWR('X', 105, struct compat_xfs_fsop_handlereq)
|
||||
#define XFS_IOC_FD_TO_HANDLE_32 \
|
||||
_IOWR('X', 106, struct compat_xfs_fsop_handlereq)
|
||||
#define XFS_IOC_OPEN_BY_HANDLE_32 \
|
||||
_IOWR('X', 107, struct compat_xfs_fsop_handlereq)
|
||||
#define XFS_IOC_READLINK_BY_HANDLE_32 \
|
||||
_IOWR('X', 108, struct compat_xfs_fsop_handlereq)
|
||||
|
||||
STATIC unsigned long xfs_ioctl32_fshandle(unsigned long arg)
|
||||
{
|
||||
compat_xfs_fsop_handlereq_t __user *p32 = (void __user *)arg;
|
||||
xfs_fsop_handlereq_t __user *p = compat_alloc_user_space(sizeof(*p));
|
||||
u32 addr;
|
||||
|
||||
if (copy_in_user(&p->fd, &p32->fd, sizeof(__u32)) ||
|
||||
get_user(addr, &p32->path) ||
|
||||
put_user(compat_ptr(addr), &p->path) ||
|
||||
copy_in_user(&p->oflags, &p32->oflags, sizeof(__u32)) ||
|
||||
get_user(addr, &p32->ihandle) ||
|
||||
put_user(compat_ptr(addr), &p->ihandle) ||
|
||||
copy_in_user(&p->ihandlen, &p32->ihandlen, sizeof(__u32)) ||
|
||||
get_user(addr, &p32->ohandle) ||
|
||||
put_user(compat_ptr(addr), &p->ohandle) ||
|
||||
get_user(addr, &p32->ohandlen) ||
|
||||
put_user(compat_ptr(addr), &p->ohandlen))
|
||||
return -EFAULT;
|
||||
|
||||
return (unsigned long)p;
|
||||
}
|
||||
|
||||
|
||||
STATIC long
|
||||
xfs_compat_ioctl(
|
||||
int mode,
|
||||
@ -166,12 +210,7 @@ xfs_compat_ioctl(
|
||||
case XFS_IOC_GETBMAPA:
|
||||
case XFS_IOC_GETBMAPX:
|
||||
/* not handled
|
||||
case XFS_IOC_FD_TO_HANDLE:
|
||||
case XFS_IOC_PATH_TO_HANDLE:
|
||||
case XFS_IOC_PATH_TO_FSHANDLE:
|
||||
case XFS_IOC_OPEN_BY_HANDLE:
|
||||
case XFS_IOC_FSSETDM_BY_HANDLE:
|
||||
case XFS_IOC_READLINK_BY_HANDLE:
|
||||
case XFS_IOC_ATTRLIST_BY_HANDLE:
|
||||
case XFS_IOC_ATTRMULTI_BY_HANDLE:
|
||||
*/
|
||||
@ -228,6 +267,14 @@ xfs_compat_ioctl(
|
||||
arg = xfs_ioctl32_bulkstat(arg);
|
||||
break;
|
||||
#endif
|
||||
case XFS_IOC_FD_TO_HANDLE_32:
|
||||
case XFS_IOC_PATH_TO_HANDLE_32:
|
||||
case XFS_IOC_PATH_TO_FSHANDLE_32:
|
||||
case XFS_IOC_OPEN_BY_HANDLE_32:
|
||||
case XFS_IOC_READLINK_BY_HANDLE_32:
|
||||
arg = xfs_ioctl32_fshandle(arg);
|
||||
cmd = _NATIVE_IOC(cmd, struct xfs_fsop_handlereq);
|
||||
break;
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user