mirror of
https://git.openafs.org/openafs.git
synced 2025-01-18 15:00:12 +00:00
SOLARIS: support mmap() over 4GiB
When mmap() is issued for exactly 4GiB of a large AFS-resident file, mmap() fails with ENOMEM. This is because the AFS code is handling the requested length as u_int instead of size_t, resulting in a 0 being passed back to the caller. When mmap() is issued for non-multiples of 4GiB, the subsequent mapping will not contain all the requested pages, and for the same reason - the mapped size has been truncated to 32 bits. This results in SIGSEGV when accessing the non-mapped page(s). Fix the signature of afs_map() to specify the correct type for the length. Thanks to Robert Milkowski for the report and diagnosis. Change-Id: I8a9f0cb04ff9b80de5516e14d0679b06ef0b3f9a Reviewed-on: https://gerrit.openafs.org/12291 Tested-by: BuildBot <buildbot@rampaginggeek.com> Tested-by: Mark Vitale <mvitale@sinenomine.net> Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
This commit is contained in:
parent
19ffa2b7f0
commit
75325fc9ab
@ -931,7 +931,7 @@ afs_nfsrdwr(struct vcache *avc, struct uio *auio, enum uio_rw arw,
|
||||
}
|
||||
|
||||
int
|
||||
afs_map(struct vnode *vp, offset_t off, struct as *as, caddr_t *addr, u_int len, u_char prot, u_char maxprot, u_int flags, afs_ucred_t *cred)
|
||||
afs_map(struct vnode *vp, offset_t off, struct as *as, caddr_t *addr, size_t len, u_char prot, u_char maxprot, u_int flags, afs_ucred_t *cred)
|
||||
{
|
||||
struct segvn_crargs crargs;
|
||||
afs_int32 code;
|
||||
|
Loading…
Reference in New Issue
Block a user