diff options
Diffstat (limited to 'fs/compat.c')
-rw-r--r-- | fs/compat.c | 246 |
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... */ | ||
1680 | struct compat_nfsctl_svc { | ||
1681 | u16 svc32_port; | ||
1682 | s32 svc32_nthreads; | ||
1683 | }; | ||
1684 | |||
1685 | struct 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 | |||
1694 | struct 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 | |||
1704 | struct compat_nfsctl_fdparm { | ||
1705 | struct sockaddr gd32_addr; | ||
1706 | s8 gd32_path[NFS_MAXPATHLEN+1]; | ||
1707 | compat_int_t gd32_version; | ||
1708 | }; | ||
1709 | |||
1710 | struct compat_nfsctl_fsparm { | ||
1711 | struct sockaddr gd32_addr; | ||
1712 | s8 gd32_path[NFS_MAXPATHLEN+1]; | ||
1713 | compat_int_t gd32_maxlen; | ||
1714 | }; | ||
1715 | |||
1716 | struct 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 | |||
1732 | union compat_nfsctl_res { | ||
1733 | __u8 cr32_getfh[NFS_FHSIZE]; | ||
1734 | struct knfsd_fh cr32_getfs; | ||
1735 | }; | ||
1736 | |||
1737 | static 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 | |||
1749 | static 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 | |||
1775 | static 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 | |||
1804 | static 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 | |||
1823 | static 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 | */ | ||
1844 | static 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 | |||
1854 | asmlinkage 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 | |||
1917 | done: | ||
1918 | kfree(karg); | ||
1919 | kfree(kres); | ||
1920 | return err; | ||
1921 | } | ||
1922 | #else /* !NFSD */ | ||
1923 | long asmlinkage compat_sys_nfsservctl(int cmd, void *notused, void *notused2) | 1678 | long 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 | ||