[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
|
#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
|
STATIC long
|
||||||
xfs_compat_ioctl(
|
xfs_compat_ioctl(
|
||||||
int mode,
|
int mode,
|
||||||
|
@ -166,12 +210,7 @@ xfs_compat_ioctl(
|
||||||
case XFS_IOC_GETBMAPA:
|
case XFS_IOC_GETBMAPA:
|
||||||
case XFS_IOC_GETBMAPX:
|
case XFS_IOC_GETBMAPX:
|
||||||
/* not handled
|
/* 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_FSSETDM_BY_HANDLE:
|
||||||
case XFS_IOC_READLINK_BY_HANDLE:
|
|
||||||
case XFS_IOC_ATTRLIST_BY_HANDLE:
|
case XFS_IOC_ATTRLIST_BY_HANDLE:
|
||||||
case XFS_IOC_ATTRMULTI_BY_HANDLE:
|
case XFS_IOC_ATTRMULTI_BY_HANDLE:
|
||||||
*/
|
*/
|
||||||
|
@ -228,6 +267,14 @@ xfs_compat_ioctl(
|
||||||
arg = xfs_ioctl32_bulkstat(arg);
|
arg = xfs_ioctl32_bulkstat(arg);
|
||||||
break;
|
break;
|
||||||
#endif
|
#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:
|
default:
|
||||||
return -ENOIOCTLCMD;
|
return -ENOIOCTLCMD;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue