Subject: munmap(2) fails on previously mmaped large files
To: NetBSD current <current-users@NetBSD.org>
From: Nicolas Joly <njoly@pasteur.fr>
List: current-users
Date: 05/11/2007 21:08:44
--VS++wcV0S1rZb1Fb
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline


Hi,

I just encountered a problem where munmap(2) fails for large files
that were successfully mmaped ...

njoly@lanfeust [embl/blastwu]> uname -a
NetBSD lanfeust.sis.pasteur.fr 4.99.19 NetBSD 4.99.19 (LANFEUST_DEVEL) #156: Thu May 10 11:15:46 CEST 2007  njoly@lanfeust.sis.pasteur.fr:/local/src/NetBSD/obj/amd64/sys/arch/amd64/compile/LANFEUST_DEVEL amd64

njoly@lanfeust [embl/blastwu]> ls -l embl.*
-rw-r--r--  1 997  997  12882733250 May  9 00:17 embl.xnd
-rw-r--r--  1 997  997  42205936685 May  9 00:17 embl.xns
-rw-r--r--  1 997  997    914661870 May  9 00:17 embl.xnt

njoly@lanfeust [embl/blastwu]> ~/mmap ./embl.xnt 
njoly@lanfeust [embl/blastwu]> ~/mmap ./embl.xnd
mmap: munmap failed: Invalid argument
njoly@lanfeust [embl/blastwu]> ~/mmap ./embl.xns
mmap: munmap failed: Invalid argument

Here follow the ktrace output for the last command:

  8950      1 mmap     CALL  open(0x7f7fffffed19,0,0x7f7fffffeba0)
  8950      1 mmap     NAMI  "./embl.xns"
  8950      1 mmap     RET   open 3
  8950      1 mmap     CALL  __fstat30(3,0x7f7fffffeaa0)
  8950      1 mmap     RET   __fstat30 0
  8950      1 mmap     CALL  mmap(0,0x9d3ab7c2d,1,1,3,0,0)
  8950      1 mmap     RET   mmap 140145487806464/0x7f762a048000
  8950      1 mmap     CALL  munmap(0x7f762a048000,0x9d3ab7c2d)
  8950      1 mmap     RET   munmap -1 errno 22 Invalid argument

Thanks in advance.

NB: Just in case, this is a NFS mounted directory.

-- 
Nicolas Joly

Biological Software and Databanks.
Institut Pasteur, Paris.

--VS++wcV0S1rZb1Fb
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="mmap.c"


#include <sys/mman.h>
#include <sys/stat.h>

#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv) {
  int i, f;
  void *v;
  struct stat st;

  if (argc != 2) {
    errx(1, "%s <file>", argv[0]); }

  f = open(argv[1], O_RDONLY);
  if (f == -1) {
    err(1, "open failed"); }

  i = fstat(f, &st);
  if (i == -1) {
    err(1, "fstat failed"); }

  v = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, f, 0);
  if (v == MAP_FAILED) {
    err(1, "mmap failed"); }

  i = munmap(v, st.st_size);
  if (i == -1) {
    err(1, "munmap failed"); }

  close(f);

  return 0; }

--VS++wcV0S1rZb1Fb--