aboutsummaryrefslogtreecommitdiffstats
path: root/fs/compat.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/compat.c')
-rw-r--r--fs/compat.c246
1 files changed, 0 insertions, 246 deletions
diff --git a/fs/compat.c b/fs/compat.c
index 0ea00832de23..0b48d018e38a 100644
--- a/fs/compat.c
+++ b/fs/compat.c
@@ -1675,256 +1675,10 @@ asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds,
1675} 1675}
1676#endif /* HAVE_SET_RESTORE_SIGMASK */ 1676#endif /* HAVE_SET_RESTORE_SIGMASK */
1677 1677
1678#if (defined(CONFIG_NFSD) || defined(CONFIG_NFSD_MODULE)) && !defined(CONFIG_NFSD_DEPRECATED)
1679/* Stuff for NFS server syscalls... */
1680struct compat_nfsctl_svc {
1681 u16 svc32_port;
1682 s32 svc32_nthreads;
1683};
1684
1685struct compat_nfsctl_client {
1686 s8 cl32_ident[NFSCLNT_IDMAX+1];
1687 s32 cl32_naddr;
1688 struct in_addr cl32_addrlist[NFSCLNT_ADDRMAX];
1689 s32 cl32_fhkeytype;
1690 s32 cl32_fhkeylen;
1691 u8 cl32_fhkey[NFSCLNT_KEYMAX];
1692};
1693
1694struct compat_nfsctl_export {
1695 char ex32_client[NFSCLNT_IDMAX+1];
1696 char ex32_path[NFS_MAXPATHLEN+1];
1697 compat_dev_t ex32_dev;
1698 compat_ino_t ex32_ino;
1699 compat_int_t ex32_flags;
1700 __compat_uid_t ex32_anon_uid;
1701 __compat_gid_t ex32_anon_gid;
1702};
1703
1704struct compat_nfsctl_fdparm {
1705 struct sockaddr gd32_addr;
1706 s8 gd32_path[NFS_MAXPATHLEN+1];
1707 compat_int_t gd32_version;
1708};
1709
1710struct compat_nfsctl_fsparm {
1711 struct sockaddr gd32_addr;
1712 s8 gd32_path[NFS_MAXPATHLEN+1];
1713 compat_int_t gd32_maxlen;
1714};
1715
1716struct compat_nfsctl_arg {
1717 compat_int_t ca32_version; /* safeguard */
1718 union {
1719 struct compat_nfsctl_svc u32_svc;
1720 struct compat_nfsctl_client u32_client;
1721 struct compat_nfsctl_export u32_export;
1722 struct compat_nfsctl_fdparm u32_getfd;
1723 struct compat_nfsctl_fsparm u32_getfs;
1724 } u;
1725#define ca32_svc u.u32_svc
1726#define ca32_client u.u32_client
1727#define ca32_export u.u32_export
1728#define ca32_getfd u.u32_getfd
1729#define ca32_getfs u.u32_getfs
1730};
1731
1732union compat_nfsctl_res {
1733 __u8 cr32_getfh[NFS_FHSIZE];
1734 struct knfsd_fh cr32_getfs;
1735};
1736
1737static int compat_nfs_svc_trans(struct nfsctl_arg *karg,
1738 struct compat_nfsctl_arg __user *arg)
1739{
1740 if (!access_ok(VERIFY_READ, &arg->ca32_svc, sizeof(arg->ca32_svc)) ||
1741 get_user(karg->ca_version, &arg->ca32_version) ||
1742 __get_user(karg->ca_svc.svc_port, &arg->ca32_svc.svc32_port) ||
1743 __get_user(karg->ca_svc.svc_nthreads,
1744 &arg->ca32_svc.svc32_nthreads))
1745 return -EFAULT;
1746 return 0;
1747}
1748
1749static int compat_nfs_clnt_trans(struct nfsctl_arg *karg,
1750 struct compat_nfsctl_arg __user *arg)
1751{
1752 if (!access_ok(VERIFY_READ, &arg->ca32_client,
1753 sizeof(arg->ca32_client)) ||
1754 get_user(karg->ca_version, &arg->ca32_version) ||
1755 __copy_from_user(&karg->ca_client.cl_ident[0],
1756 &arg->ca32_client.cl32_ident[0],
1757 NFSCLNT_IDMAX) ||
1758 __get_user(karg->ca_client.cl_naddr,
1759 &arg->ca32_client.cl32_naddr) ||
1760 __copy_from_user(&karg->ca_client.cl_addrlist[0],
1761 &arg->ca32_client.cl32_addrlist[0],
1762 (sizeof(struct in_addr) * NFSCLNT_ADDRMAX)) ||
1763 __get_user(karg->ca_client.cl_fhkeytype,
1764 &arg->ca32_client.cl32_fhkeytype) ||
1765 __get_user(karg->ca_client.cl_fhkeylen,
1766 &arg->ca32_client.cl32_fhkeylen) ||
1767 __copy_from_user(&karg->ca_client.cl_fhkey[0],
1768 &arg->ca32_client.cl32_fhkey[0],
1769 NFSCLNT_KEYMAX))
1770 return -EFAULT;
1771
1772 return 0;
1773}
1774
1775static int compat_nfs_exp_trans(struct nfsctl_arg *karg,
1776 struct compat_nfsctl_arg __user *arg)
1777{
1778 if (!access_ok(VERIFY_READ, &arg->ca32_export,
1779 sizeof(arg->ca32_export)) ||
1780 get_user(karg->ca_version, &arg->ca32_version) ||
1781 __copy_from_user(&karg->ca_export.ex_client[0],
1782 &arg->ca32_export.ex32_client[0],
1783 NFSCLNT_IDMAX) ||
1784 __copy_from_user(&karg->ca_export.ex_path[0],
1785 &arg->ca32_export.ex32_path[0],
1786 NFS_MAXPATHLEN) ||
1787 __get_user(karg->ca_export.ex_dev,
1788 &arg->ca32_export.ex32_dev) ||
1789 __get_user(karg->ca_export.ex_ino,
1790 &arg->ca32_export.ex32_ino) ||
1791 __get_user(karg->ca_export.ex_flags,
1792 &arg->ca32_export.ex32_flags) ||
1793 __get_user(karg->ca_export.ex_anon_uid,
1794 &arg->ca32_export.ex32_anon_uid) ||
1795 __get_user(karg->ca_export.ex_anon_gid,
1796 &arg->ca32_export.ex32_anon_gid))
1797 return -EFAULT;
1798 SET_UID(karg->ca_export.ex_anon_uid, karg->ca_export.ex_anon_uid);
1799 SET_GID(karg->ca_export.ex_anon_gid, karg->ca_export.ex_anon_gid);
1800
1801 return 0;
1802}
1803
1804static int compat_nfs_getfd_trans(struct nfsctl_arg *karg,
1805 struct compat_nfsctl_arg __user *arg)
1806{
1807 if (!access_ok(VERIFY_READ, &arg->ca32_getfd,
1808 sizeof(arg->ca32_getfd)) ||
1809 get_user(karg->ca_version, &arg->ca32_version) ||
1810 __copy_from_user(&karg->ca_getfd.gd_addr,
1811 &arg->ca32_getfd.gd32_addr,
1812 (sizeof(struct sockaddr))) ||
1813 __copy_from_user(&karg->ca_getfd.gd_path,
1814 &arg->ca32_getfd.gd32_path,
1815 (NFS_MAXPATHLEN+1)) ||
1816 __get_user(karg->ca_getfd.gd_version,
1817 &arg->ca32_getfd.gd32_version))
1818 return -EFAULT;
1819
1820 return 0;
1821}
1822
1823static int compat_nfs_getfs_trans(struct nfsctl_arg *karg,
1824 struct compat_nfsctl_arg __user *arg)
1825{
1826 if (!access_ok(VERIFY_READ,&arg->ca32_getfs,sizeof(arg->ca32_getfs)) ||
1827 get_user(karg->ca_version, &arg->ca32_version) ||
1828 __copy_from_user(&karg->ca_getfs.gd_addr,
1829 &arg->ca32_getfs.gd32_addr,
1830 (sizeof(struct sockaddr))) ||
1831 __copy_from_user(&karg->ca_getfs.gd_path,
1832 &arg->ca32_getfs.gd32_path,
1833 (NFS_MAXPATHLEN+1)) ||
1834 __get_user(karg->ca_getfs.gd_maxlen,
1835 &arg->ca32_getfs.gd32_maxlen))
1836 return -EFAULT;
1837
1838 return 0;
1839}
1840
1841/* This really doesn't need translations, we are only passing
1842 * back a union which contains opaque nfs file handle data.
1843 */
1844static int compat_nfs_getfh_res_trans(union nfsctl_res *kres,
1845 union compat_nfsctl_res __user *res)
1846{
1847 int err;
1848
1849 err = copy_to_user(res, kres, sizeof(*res));
1850
1851 return (err) ? -EFAULT : 0;
1852}
1853
1854asmlinkage long compat_sys_nfsservctl(int cmd,
1855 struct compat_nfsctl_arg __user *arg,
1856 union compat_nfsctl_res __user *res)
1857{
1858 struct nfsctl_arg *karg;
1859 union nfsctl_res *kres;
1860 mm_segment_t oldfs;
1861 int err;
1862
1863 karg = kmalloc(sizeof(*karg), GFP_USER);
1864 kres = kmalloc(sizeof(*kres), GFP_USER);
1865 if(!karg || !kres) {
1866 err = -ENOMEM;
1867 goto done;
1868 }
1869
1870 switch(cmd) {
1871 case NFSCTL_SVC:
1872 err = compat_nfs_svc_trans(karg, arg);
1873 break;
1874
1875 case NFSCTL_ADDCLIENT:
1876 err = compat_nfs_clnt_trans(karg, arg);
1877 break;
1878
1879 case NFSCTL_DELCLIENT:
1880 err = compat_nfs_clnt_trans(karg, arg);
1881 break;
1882
1883 case NFSCTL_EXPORT:
1884 case NFSCTL_UNEXPORT:
1885 err = compat_nfs_exp_trans(karg, arg);
1886 break;
1887
1888 case NFSCTL_GETFD:
1889 err = compat_nfs_getfd_trans(karg, arg);
1890 break;
1891
1892 case NFSCTL_GETFS:
1893 err = compat_nfs_getfs_trans(karg, arg);
1894 break;
1895
1896 default:
1897 err = -EINVAL;
1898 break;
1899 }
1900
1901 if (err)
1902 goto done;
1903
1904 oldfs = get_fs();
1905 set_fs(KERNEL_DS);
1906 /* The __user pointer casts are valid because of the set_fs() */
1907 err = sys_nfsservctl(cmd, (void __user *) karg, (void __user *) kres);
1908 set_fs(oldfs);
1909
1910 if (err)
1911 goto done;
1912
1913 if((cmd == NFSCTL_GETFD) ||
1914 (cmd == NFSCTL_GETFS))
1915 err = compat_nfs_getfh_res_trans(kres, res);
1916
1917done:
1918 kfree(karg);
1919 kfree(kres);
1920 return err;
1921}
1922#else /* !NFSD */
1923long asmlinkage compat_sys_nfsservctl(int cmd, void *notused, void *notused2) 1678long asmlinkage compat_sys_nfsservctl(int cmd, void *notused, void *notused2)
1924{ 1679{
1925 return sys_ni_syscall(); 1680 return sys_ni_syscall();
1926} 1681}
1927#endif
1928 1682
1929#ifdef CONFIG_EPOLL 1683#ifdef CONFIG_EPOLL
1930 1684