|
@@ -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;
|
|
|
}
|