mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* nfsservctl() compatibility broken on AMD64?
@ 2006-05-15  9:28 Meelis Roos
  2006-05-15 11:21 ` Meelis Roos
  2006-05-15 11:23 ` Andrew Morton
  0 siblings, 2 replies; 4+ messages in thread
From: Meelis Roos @ 2006-05-15  9:28 UTC (permalink / raw)
  To: Linux Kernel list

I'm trying to use the latest amd64 kernel (2.6.17-rc3 compiled last 
week) with Debian Sarge 32-bit userland (is it reasonable to expect it 
to work?).

There's a problem with exportfs. I can export to IP ranges OK but I can 
not export to single hosts - nfsservctl() returns EFAULT.

Documentation/Changes tells I need at least nfs-utils 1.0.5, sarge has 
1.0.6-3.1 so this should be OK.

# strace -o /tmp/log exportfs -a
192.168.0.1:/home: Bad address
# cat /tmp/log
execve("/usr/sbin/exportfs", ["exportfs", "-a"], [/* 12 vars */]) = 0
uname({sys="Linux", node="kaamel", ...}) = 0
brk(0)                                  = 0x8056000
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f1b000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.preload", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=93540, ...}) = 0
old_mmap(NULL, 93540, PROT_READ, MAP_PRIVATE, 3, 0) = 0xf7f04000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/tls/libc.so.6", O_RDONLY)    = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`Z\1\000"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1254660, ...}) = 0
old_mmap(NULL, 1264972, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xf7dcf000
old_mmap(0xf7ef9000, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x129000) = 0xf7ef9000
old_mmap(0xf7f02000, 7500, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xf7f02000
close(3)                                = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7dce000
set_thread_area({entry_number:-1 -> 12, base_addr:0xf7dce460, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
munmap(0xf7f04000, 93540)               = 0
getpid()                                = 23227
rt_sigaction(SIGUSR1, {0x804e400, [USR1], SA_RESTART}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGUSR2, {0x804e400, [USR2], SA_RESTART}, {SIG_DFL}, 8) = 0
stat64("/proc/fs/nfs/filehandle", 0xffffd14c) = -1 ENOENT (No such file or directory)
stat64("/proc/fs/nfsd/filehandle", 0xffffd14c) = -1 ENOENT (No such file or directory)
brk(0)                                  = 0x8056000
brk(0x8077000)                          = 0x8077000
brk(0)                                  = 0x8077000
open("/etc/exports", O_RDONLY)          = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=142, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f1a000
read(3, "# /etc/exports: the access contr"..., 4096) = 142
lstat64("/home", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0
gettimeofday({1147685220, 816184}, NULL) = 0
getpid()                                = 23227
open("/etc/resolv.conf", O_RDONLY)      = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=194, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f19000
read(4, "# Dynamic resolv.conf(5) file fo"..., 4096) = 194
read(4, "", 4096)                       = 0
close(4)                                = 0
munmap(0xf7f19000, 4096)                = 0
socket(PF_FILE, SOCK_STREAM, 0)         = 4
connect(4, {sa_family=AF_FILE, path="/var/run/.nscd_socket"}, 110) = -1 ENOENT (No such file or directory)
close(4)                                = 0
open("/etc/nsswitch.conf", O_RDONLY)    = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=465, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f19000
read(4, "# /etc/nsswitch.conf\n#\n# Example"..., 4096) = 465
read(4, "", 4096)                       = 0
close(4)                                = 0
munmap(0xf7f19000, 4096)                = 0
open("/etc/ld.so.cache", O_RDONLY)      = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=93540, ...}) = 0
old_mmap(NULL, 93540, PROT_READ, MAP_PRIVATE, 4, 0) = 0xf7db7000
close(4)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/tls/libnss_files.so.2", O_RDONLY) = 4
read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200\35"..., 512) = 512
fstat64(4, {st_mode=S_IFREG|0644, st_size=34748, ...}) = 0
old_mmap(NULL, 38044, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) = 0xf7f10000
old_mmap(0xf7f19000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 4, 0x8000) = 0xf7f19000
close(4)                                = 0
munmap(0xf7db7000, 93540)               = 0
open("/etc/host.conf", O_RDONLY)        = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=26, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f0f000
read(4, "order hosts,bind\nmulti on\n", 4096) = 26
read(4, "", 4096)                       = 0
close(4)                                = 0
munmap(0xf7f0f000, 4096)                = 0
open("/etc/hosts", O_RDONLY)            = 4
fcntl64(4, F_GETFD)                     = 0
fcntl64(4, F_SETFD, FD_CLOEXEC)         = 0
fstat64(4, {st_mode=S_IFREG|0644, st_size=254, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f0f000
read(4, "127.0.0.1\tlocalhost.localdomain\t"..., 4096) = 254
read(4, "", 4096)                       = 0
close(4)                                = 0
munmap(0xf7f0f000, 4096)                = 0
open("/etc/ld.so.cache", O_RDONLY)      = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=93540, ...}) = 0
old_mmap(NULL, 93540, PROT_READ, MAP_PRIVATE, 4, 0) = 0xf7db7000
close(4)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/tls/libnss_dns.so.2", O_RDONLY) = 4
read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240\16"..., 512) = 512
fstat64(4, {st_mode=S_IFREG|0644, st_size=13976, ...}) = 0
old_mmap(NULL, 12704, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) = 0xf7f0c000
old_mmap(0xf7f0f000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 4, 0x3000) = 0xf7f0f000
close(4)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/tls/libresolv.so.2", O_RDONLY) = 4
read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220)\0"..., 512) = 512
fstat64(4, {st_mode=S_IFREG|0644, st_size=64924, ...}) = 0
old_mmap(NULL, 73640, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) = 0xf7da5000
old_mmap(0xf7db4000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 4, 0xf000) = 0xf7db4000
old_mmap(0xf7db5000, 8104, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xf7db5000
close(4)                                = 0
munmap(0xf7db7000, 93540)               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.74.8")}, 28) = 0
send(4, "g\350\1\0\0\1\0\0\0\0\0\0\0011\0010\003168\003192\7in-"..., 42, 0) = 42
gettimeofday({1147685220, 818364}, NULL) = 0
poll([{fd=4, events=POLLIN, revents=POLLIN}], 1, 5000) = 1
ioctl(4, FIONREAD, [119])               = 0
recvfrom(4, "g\350\205\203\0\1\0\0\0\1\0\0\0011\0010\003168\003192\7"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.74.8")}, [16]) = 119
close(4)                                = 0
socket(PF_FILE, SOCK_STREAM, 0)         = 4
connect(4, {sa_family=AF_FILE, path="/var/run/.nscd_socket"}, 110) = -1 ENOENT (No such file or directory)
close(4)                                = 0
open("/etc/hosts", O_RDONLY)            = 4
fcntl64(4, F_GETFD)                     = 0
fcntl64(4, F_SETFD, FD_CLOEXEC)         = 0
fstat64(4, {st_mode=S_IFREG|0644, st_size=254, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f0b000
read(4, "127.0.0.1\tlocalhost.localdomain\t"..., 4096) = 254
read(4, "", 4096)                       = 0
close(4)                                = 0
munmap(0xf7f0b000, 4096)                = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.74.8")}, 28) = 0
send(4, "g\351\1\0\0\1\0\0\0\0\0\0\0011\0010\003168\003192\7in-"..., 42, 0) = 42
gettimeofday({1147685220, 849469}, NULL) = 0
poll([{fd=4, events=POLLIN, revents=POLLIN}], 1, 5000) = 1
ioctl(4, FIONREAD, [139])               = 0
recvfrom(4, "g\351\205\203\0\1\0\0\0\1\0\0\0011\0010\003168\003192\7"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.74.8")}, [16]) = 139
close(4)                                = 0
read(3, "", 4096)                       = 0
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0xf7f1a000, 4096)                = 0
open("/var/lib/nfs/etab", O_RDONLY)     = 3
rt_sigaction(SIGALRM, {0x804ded0, [], 0}, {SIG_DFL}, 8) = 0
alarm(10)                               = 0
fcntl64(3, F_SETLKW, {type=F_RDLCK, whence=SEEK_SET, start=0, len=0}) = 0
alarm(0)                                = 10
rt_sigaction(SIGALRM, {SIG_DFL}, NULL, 8) = 0
open("/var/lib/nfs/etab", O_RDONLY)     = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=150, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f1a000
read(4, "/home\t192.168.0.1(rw,async,wdela"..., 4096) = 150
lstat64("/home", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0
socket(PF_FILE, SOCK_STREAM, 0)         = 5
connect(5, {sa_family=AF_FILE, path="/var/run/.nscd_socket"}, 110) = -1 ENOENT (No such file or directory)
close(5)                                = 0
open("/etc/hosts", O_RDONLY)            = 5
fcntl64(5, F_GETFD)                     = 0
fcntl64(5, F_SETFD, FD_CLOEXEC)         = 0
fstat64(5, {st_mode=S_IFREG|0644, st_size=254, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f0b000
read(5, "127.0.0.1\tlocalhost.localdomain\t"..., 4096) = 254
read(5, "", 4096)                       = 0
close(5)                                = 0
munmap(0xf7f0b000, 4096)                = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 5
connect(5, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.74.8")}, 28) = 0
send(5, "g\352\1\0\0\1\0\0\0\0\0\0\0011\0010\003168\003192\7in-"..., 42, 0) = 42
gettimeofday({1147685220, 850802}, NULL) = 0
poll([{fd=5, events=POLLIN, revents=POLLIN}], 1, 5000) = 1
ioctl(5, FIONREAD, [139])               = 0
recvfrom(5, "g\352\205\203\0\1\0\0\0\1\0\0\0011\0010\003168\003192\7"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.74.8")}, [16]) = 139
close(5)                                = 0
read(4, "", 4096)                       = 0
read(4, "", 4096)                       = 0
close(4)                                = 0
munmap(0xf7f1a000, 4096)                = 0
close(3)                                = 0
open("/var/lib/nfs/rmtab", O_RDONLY)    = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f1a000
read(3, "", 4096)                       = 0
fdatasync(3)                            = 0
close(3)                                = 0
munmap(0xf7f1a000, 4096)                = 0
open("/proc/fs/nfs/exports", O_RDONLY)  = 3
close(3)                                = 0
open("/proc/fs/nfs/exports", O_RDONLY)  = 3
rt_sigaction(SIGALRM, {0x804ded0, [], 0}, {SIG_DFL}, 8) = 0
alarm(10)                               = 0
fcntl64(3, F_SETLKW, {type=F_RDLCK, whence=SEEK_SET, start=0, len=0}) = 0
alarm(0)                                = 10
rt_sigaction(SIGALRM, {SIG_DFL}, NULL, 8) = 0
open("/proc/fs/nfs/exports", O_RDONLY)  = 4
fstat64(4, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f1a000
read(4, "# Version 1.1\n# Path Client(Flag"..., 1024) = 41
read(4, "", 1024)                       = 0
read(4, "", 1024)                       = 0
close(4)                                = 0
munmap(0xf7f1a000, 4096)                = 0
close(3)                                = 0
nfsservctl(0x1, 0xffffbd40, 0)          = -1 EFAULT (Bad address)
write(2, "192.168.0.1:/home: Bad address\n", 31) = 31
open("/var/lib/nfs/etab", O_RDWR|O_CREAT, 036767260150) = 3
rt_sigaction(SIGALRM, {0x804ded0, [], 0}, {SIG_DFL}, 8) = 0
alarm(10)                               = 0
fcntl64(3, F_SETLKW, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}) = 0
alarm(0)                                = 10
rt_sigaction(SIGALRM, {SIG_DFL}, NULL, 8) = 0
open("/var/lib/nfs/etab.tmp", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f1a000
write(4, "/home\t192.168.0.1(rw,async,wdela"..., 150) = 150
close(4)                                = 0
munmap(0xf7f1a000, 4096)                = 0
open("/var/lib/nfs/etab.tmp", O_RDONLY) = 4
open("/var/lib/nfs/etab", O_RDONLY)     = 5
read(4, "/home\t192.168.0.1(rw,async,wdela"..., 4096) = 150
read(5, "/home\t192.168.0.1(rw,async,wdela"..., 4096) = 150
read(4, "", 4096)                       = 0
read(5, "", 4096)                       = 0
close(4)                                = 0
close(5)                                = 0
unlink("/var/lib/nfs/etab.tmp")         = 0
close(3)                                = 0
open("/var/lib/nfs/xtab", O_RDWR|O_CREAT, 036767400626) = 3
rt_sigaction(SIGALRM, {0x804ded0, [], 0}, {SIG_DFL}, 8) = 0
alarm(10)                               = 0
fcntl64(3, F_SETLKW, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}) = 0
alarm(0)                                = 10
rt_sigaction(SIGALRM, {SIG_DFL}, NULL, 8) = 0
open("/var/lib/nfs/xtab.tmp", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
close(4)                                = 0
open("/var/lib/nfs/xtab.tmp", O_RDONLY) = 4
open("/var/lib/nfs/xtab", O_RDONLY)     = 5
read(4, "", 4096)                       = 0
read(5, "", 4096)                       = 0
close(4)                                = 0
close(5)                                = 0
unlink("/var/lib/nfs/xtab.tmp")         = 0
close(3)                                = 0
exit_group(0)                           = ?

-- 
Meelis Roos (mroos@linux.ee)

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: nfsservctl() compatibility broken on AMD64?
  2006-05-15  9:28 nfsservctl() compatibility broken on AMD64? Meelis Roos
@ 2006-05-15 11:21 ` Meelis Roos
  2006-05-15 11:23 ` Andrew Morton
  1 sibling, 0 replies; 4+ messages in thread
From: Meelis Roos @ 2006-05-15 11:21 UTC (permalink / raw)
  To: linux-kernel

MR> I'm trying to use the latest amd64 kernel (2.6.17-rc3 compiled last 
MR> week) with Debian Sarge 32-bit userland (is it reasonable to expect it 
MR> to work?).
MR> 
MR> There's a problem with exportfs. I can export to IP ranges OK but I can 
MR> not export to single hosts - nfsservctl() returns EFAULT.

Sorry, probably a false alarm - I got it it work with loading nfsd
module and mounting /proc/fs/nfsd by hand, so it's probably something
initscripts related.

-- 
Meelis Roos

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: nfsservctl() compatibility broken on AMD64?
  2006-05-15  9:28 nfsservctl() compatibility broken on AMD64? Meelis Roos
  2006-05-15 11:21 ` Meelis Roos
@ 2006-05-15 11:23 ` Andrew Morton
  2006-05-15 12:56   ` Meelis Roos
  1 sibling, 1 reply; 4+ messages in thread
From: Andrew Morton @ 2006-05-15 11:23 UTC (permalink / raw)
  To: Meelis Roos; +Cc: linux-kernel

Meelis Roos <mroos@linux.ee> wrote:
>
> I'm trying to use the latest amd64 kernel (2.6.17-rc3 compiled last 
> week) with Debian Sarge 32-bit userland (is it reasonable to expect it 
> to work?).
> 
> There's a problem with exportfs. I can export to IP ranges OK but I can 
> not export to single hosts - nfsservctl() returns EFAULT.
> 
> Documentation/Changes tells I need at least nfs-utils 1.0.5, sarge has 
> 1.0.6-3.1 so this should be OK.
> 

Does this fix?


From: Lin Feng Shen <shenlinf@cn.ibm.com>

Functions compat_nfs_svc_trans, compat_nfs_clnt_trans,
compat_nfs_exp_trans, compat_nfs_getfd_trans and compat_nfs_getfs_trans,
which are called by compat_sys_nfsservctl(fs/compat.c), don't handle the
return value of access_ok properly.  access_ok return 1 when the addr is
valid, and 0 when it's not, but these functions have the reversed
understanding.  When the address is valid, they always return -EFAULT to
compat_sys_nfsservctl.

An example is to run /usr/sbin/rpc.nfsd(32bit program on Power5).  It
doesn't function as expected.  strace showes that nfsservctl returns
-EFAULT.

The patch fixes this by correcting the error handling on the return value
of access_ok in the five functions.

Signed-off-by: Lin Feng Shen <shenlinf@cn.ibm.com>
Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
Cc: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 fs/compat.c |  190 +++++++++++++++++++++++++-------------------------
 1 files changed, 98 insertions(+), 92 deletions(-)

diff -puN fs/compat.c~nfs-fix-error-handling-on-access_ok-in-compat_sys_nfsservctl fs/compat.c
--- devel/fs/compat.c~nfs-fix-error-handling-on-access_ok-in-compat_sys_nfsservctl	2006-05-13 19:48:55.000000000 -0700
+++ devel-akpm/fs/compat.c	2006-05-13 19:52:20.000000000 -0700
@@ -2030,109 +2030,114 @@ union compat_nfsctl_res {
 	struct knfsd_fh		cr32_getfs;
 };
 
-static int compat_nfs_svc_trans(struct nfsctl_arg *karg, struct compat_nfsctl_arg __user *arg)
+static int compat_nfs_svc_trans(struct nfsctl_arg *karg,
+				struct compat_nfsctl_arg __user *arg)
 {
-	int err;
-
-	err = access_ok(VERIFY_READ, &arg->ca32_svc, sizeof(arg->ca32_svc));
-	err |= get_user(karg->ca_version, &arg->ca32_version);
-	err |= __get_user(karg->ca_svc.svc_port, &arg->ca32_svc.svc32_port);
-	err |= __get_user(karg->ca_svc.svc_nthreads, &arg->ca32_svc.svc32_nthreads);
-	return (err) ? -EFAULT : 0;
-}
-
-static int compat_nfs_clnt_trans(struct nfsctl_arg *karg, struct compat_nfsctl_arg __user *arg)
-{
-	int err;
-
-	err = access_ok(VERIFY_READ, &arg->ca32_client, sizeof(arg->ca32_client));
-	err |= get_user(karg->ca_version, &arg->ca32_version);
-	err |= __copy_from_user(&karg->ca_client.cl_ident[0],
-			  &arg->ca32_client.cl32_ident[0],
-			  NFSCLNT_IDMAX);
-	err |= __get_user(karg->ca_client.cl_naddr, &arg->ca32_client.cl32_naddr);
-	err |= __copy_from_user(&karg->ca_client.cl_addrlist[0],
-			  &arg->ca32_client.cl32_addrlist[0],
-			  (sizeof(struct in_addr) * NFSCLNT_ADDRMAX));
-	err |= __get_user(karg->ca_client.cl_fhkeytype,
-		      &arg->ca32_client.cl32_fhkeytype);
-	err |= __get_user(karg->ca_client.cl_fhkeylen,
-		      &arg->ca32_client.cl32_fhkeylen);
-	err |= __copy_from_user(&karg->ca_client.cl_fhkey[0],
-			  &arg->ca32_client.cl32_fhkey[0],
-			  NFSCLNT_KEYMAX);
-
-	return (err) ? -EFAULT : 0;
-}
-
-static int compat_nfs_exp_trans(struct nfsctl_arg *karg, struct compat_nfsctl_arg __user *arg)
-{
-	int err;
-
-	err = access_ok(VERIFY_READ, &arg->ca32_export, sizeof(arg->ca32_export));
-	err |= get_user(karg->ca_version, &arg->ca32_version);
-	err |= __copy_from_user(&karg->ca_export.ex_client[0],
-			  &arg->ca32_export.ex32_client[0],
-			  NFSCLNT_IDMAX);
-	err |= __copy_from_user(&karg->ca_export.ex_path[0],
-			  &arg->ca32_export.ex32_path[0],
-			  NFS_MAXPATHLEN);
-	err |= __get_user(karg->ca_export.ex_dev,
-		      &arg->ca32_export.ex32_dev);
-	err |= __get_user(karg->ca_export.ex_ino,
-		      &arg->ca32_export.ex32_ino);
-	err |= __get_user(karg->ca_export.ex_flags,
-		      &arg->ca32_export.ex32_flags);
-	err |= __get_user(karg->ca_export.ex_anon_uid,
-		      &arg->ca32_export.ex32_anon_uid);
-	err |= __get_user(karg->ca_export.ex_anon_gid,
-		      &arg->ca32_export.ex32_anon_gid);
+	if(!access_ok(VERIFY_READ, &arg->ca32_svc, sizeof(arg->ca32_svc)) ||
+		get_user(karg->ca_version, &arg->ca32_version) ||
+		__get_user(karg->ca_svc.svc_port, &arg->ca32_svc.svc32_port) ||
+		__get_user(karg->ca_svc.svc_nthreads,
+				&arg->ca32_svc.svc32_nthreads))
+		return -EFAULT;
+	return 0;
+}
+
+static int compat_nfs_clnt_trans(struct nfsctl_arg *karg,
+				struct compat_nfsctl_arg __user *arg)
+{
+	if (!access_ok(VERIFY_READ, &arg->ca32_client,
+			sizeof(arg->ca32_client)) ||
+		get_user(karg->ca_version, &arg->ca32_version) ||
+		__copy_from_user(&karg->ca_client.cl_ident[0],
+				&arg->ca32_client.cl32_ident[0],
+				NFSCLNT_IDMAX) ||
+		__get_user(karg->ca_client.cl_naddr,
+				&arg->ca32_client.cl32_naddr) ||
+		__copy_from_user(&karg->ca_client.cl_addrlist[0],
+				&arg->ca32_client.cl32_addrlist[0],
+				(sizeof(struct in_addr) * NFSCLNT_ADDRMAX)) ||
+		__get_user(karg->ca_client.cl_fhkeytype,
+				&arg->ca32_client.cl32_fhkeytype) ||
+		__get_user(karg->ca_client.cl_fhkeylen,
+				&arg->ca32_client.cl32_fhkeylen) ||
+		__copy_from_user(&karg->ca_client.cl_fhkey[0],
+				&arg->ca32_client.cl32_fhkey[0],
+				NFSCLNT_KEYMAX))
+		return -EFAULT;
+
+	return 0;
+}
+
+static int compat_nfs_exp_trans(struct nfsctl_arg *karg,
+				struct compat_nfsctl_arg __user *arg)
+{
+	if (!access_ok(VERIFY_READ, &arg->ca32_export,
+				sizeof(arg->ca32_export)) ||
+		get_user(karg->ca_version, &arg->ca32_version) ||
+		__copy_from_user(&karg->ca_export.ex_client[0],
+				&arg->ca32_export.ex32_client[0],
+				NFSCLNT_IDMAX) ||
+		__copy_from_user(&karg->ca_export.ex_path[0],
+				&arg->ca32_export.ex32_path[0],
+				NFS_MAXPATHLEN) ||
+		__get_user(karg->ca_export.ex_dev,
+				&arg->ca32_export.ex32_dev) ||
+		__get_user(karg->ca_export.ex_ino,
+				&arg->ca32_export.ex32_ino) ||
+		__get_user(karg->ca_export.ex_flags,
+				&arg->ca32_export.ex32_flags) ||
+		__get_user(karg->ca_export.ex_anon_uid,
+				&arg->ca32_export.ex32_anon_uid) ||
+		__get_user(karg->ca_export.ex_anon_gid,
+				&arg->ca32_export.ex32_anon_gid))
+		return -EFAULT;
 	SET_UID(karg->ca_export.ex_anon_uid, karg->ca_export.ex_anon_uid);
 	SET_GID(karg->ca_export.ex_anon_gid, karg->ca_export.ex_anon_gid);
 
-	return (err) ? -EFAULT : 0;
+	return 0;
 }
 
-static int compat_nfs_getfd_trans(struct nfsctl_arg *karg, struct compat_nfsctl_arg __user *arg)
+static int compat_nfs_getfd_trans(struct nfsctl_arg *karg,
+				struct compat_nfsctl_arg __user *arg)
 {
-	int err;
+	if(!access_ok(VERIFY_READ, &arg->ca32_getfd, sizeof(arg->ca32_getfd)) ||
+		get_user(karg->ca_version, &arg->ca32_version) ||
+		__copy_from_user(&karg->ca_getfd.gd_addr,
+				&arg->ca32_getfd.gd32_addr,
+				(sizeof(struct sockaddr))) ||
+		__copy_from_user(&karg->ca_getfd.gd_path,
+				&arg->ca32_getfd.gd32_path,
+				(NFS_MAXPATHLEN+1)) ||
+		__get_user(karg->ca_getfd.gd_version,
+				&arg->ca32_getfd.gd32_version))
+		return -EFAULT;
+
+	return 0;
+}
+
+static int compat_nfs_getfs_trans(struct nfsctl_arg *karg,
+				struct compat_nfsctl_arg __user *arg)
+{
+	if (!access_ok(VERIFY_READ,&arg->ca32_getfs,sizeof(arg->ca32_getfs)) ||
+		get_user(karg->ca_version, &arg->ca32_version) ||
+		__copy_from_user(&karg->ca_getfs.gd_addr,
+				&arg->ca32_getfs.gd32_addr,
+				(sizeof(struct sockaddr))) ||
+		__copy_from_user(&karg->ca_getfs.gd_path,
+				&arg->ca32_getfs.gd32_path,
+				(NFS_MAXPATHLEN+1)) ||
+		__get_user(karg->ca_getfs.gd_maxlen,
+				&arg->ca32_getfs.gd32_maxlen))
+		return -EFAULT;
 
-	err = access_ok(VERIFY_READ, &arg->ca32_getfd, sizeof(arg->ca32_getfd));
-	err |= get_user(karg->ca_version, &arg->ca32_version);
-	err |= __copy_from_user(&karg->ca_getfd.gd_addr,
-			  &arg->ca32_getfd.gd32_addr,
-			  (sizeof(struct sockaddr)));
-	err |= __copy_from_user(&karg->ca_getfd.gd_path,
-			  &arg->ca32_getfd.gd32_path,
-			  (NFS_MAXPATHLEN+1));
-	err |= __get_user(karg->ca_getfd.gd_version,
-		      &arg->ca32_getfd.gd32_version);
-
-	return (err) ? -EFAULT : 0;
-}
-
-static int compat_nfs_getfs_trans(struct nfsctl_arg *karg, struct compat_nfsctl_arg __user *arg)
-{
-	int err;
-
-	err = access_ok(VERIFY_READ, &arg->ca32_getfs, sizeof(arg->ca32_getfs));
-	err |= get_user(karg->ca_version, &arg->ca32_version);
-	err |= __copy_from_user(&karg->ca_getfs.gd_addr,
-			  &arg->ca32_getfs.gd32_addr,
-			  (sizeof(struct sockaddr)));
-	err |= __copy_from_user(&karg->ca_getfs.gd_path,
-			  &arg->ca32_getfs.gd32_path,
-			  (NFS_MAXPATHLEN+1));
-	err |= __get_user(karg->ca_getfs.gd_maxlen,
-		      &arg->ca32_getfs.gd32_maxlen);
-
-	return (err) ? -EFAULT : 0;
+	return 0;
 }
 
 /* This really doesn't need translations, we are only passing
  * back a union which contains opaque nfs file handle data.
  */
-static int compat_nfs_getfh_res_trans(union nfsctl_res *kres, union compat_nfsctl_res __user *res)
+static int compat_nfs_getfh_res_trans(union nfsctl_res *kres,
+				union compat_nfsctl_res __user *res)
 {
 	int err;
 
@@ -2141,8 +2146,9 @@ static int compat_nfs_getfh_res_trans(un
 	return (err) ? -EFAULT : 0;
 }
 
-asmlinkage long compat_sys_nfsservctl(int cmd, struct compat_nfsctl_arg __user *arg,
-					union compat_nfsctl_res __user *res)
+asmlinkage long compat_sys_nfsservctl(int cmd,
+				struct compat_nfsctl_arg __user *arg,
+				union compat_nfsctl_res __user *res)
 {
 	struct nfsctl_arg *karg;
 	union nfsctl_res *kres;
_


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: nfsservctl() compatibility broken on AMD64?
  2006-05-15 11:23 ` Andrew Morton
@ 2006-05-15 12:56   ` Meelis Roos
  0 siblings, 0 replies; 4+ messages in thread
From: Meelis Roos @ 2006-05-15 12:56 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linux-kernel

>> I'm trying to use the latest amd64 kernel (2.6.17-rc3 compiled last
>> week) with Debian Sarge 32-bit userland (is it reasonable to expect it
>> to work?).
>>
>> There's a problem with exportfs. I can export to IP ranges OK but I can
>> not export to single hosts - nfsservctl() returns EFAULT.
>
> Does this fix?

Yes, thanks! With this patch my workarounds are not needed.

-- 
Meelis Roos (mroos@linux.ee)

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2006-05-15 12:56 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-05-15  9:28 nfsservctl() compatibility broken on AMD64? Meelis Roos
2006-05-15 11:21 ` Meelis Roos
2006-05-15 11:23 ` Andrew Morton
2006-05-15 12:56   ` Meelis Roos

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®