NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/38531: mmap(2) on ntfs should return MAP_FAILED but doesn't

I took some time to find out the function which returns errno 22
in the error trace of /bin/cp:

 615      1 cp       RET   write -1 errno 22 Invalid argument

With a debug kernel or i386cd.iso (netbsd-5), I get two console
messages with errno=22 from ubc_uiomove.

ubc_uiomove is defind in src/sys/uvm/uvm_bio.c and handels buffered
i/o mapping. For files less than 8 MiB in size mmap is called in src/bin/cp/utils.c and a look at the same file in FreeBSD shows
that mmap is only used if VM_AND_BUFFER_CACHE_SYNCHRONIZED is
defined. This might be a hint that indeed a missing synchronization
is triggering this error.

The relevant parts of the FreeBSD code:

                if (S_ISREG(fs->st_mode) && fs->st_size > 0 &&
                    fs->st_size <= 8 * 1024 * 1024 &&
                    (p = mmap(NULL, (size_t)fs->st_size, PROT_READ,
                    MAP_SHARED, from_fd, (off_t)0)) != MAP_FAILED) {

NetBSD, utils.c, rev. 1.34:

if (fs->st_size <= 8 * 1048576) {
                        size_t fsize = (size_t)fs->st_size;
                        p = mmap(NULL, fsize, PROT_READ, MAP_FILE|MAP_SHARED,
                            from_fd, (off_t)0);
                        if (p == MAP_FAILED) {
                                goto mmap_failed;

I dont have enough insight into UVM to figure out a solution. So some
of the experts should take a look, please.

Kai-Uwe Eckhardt

Home | Main Index | Thread Index | Old Index