Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Mar 95 14:12:40 +0100
From:      Jurgen <jali@oce.nl>
To:        freebsd-bugs@FreeBSD.org
Subject:   Endless kernel error message loop
Message-ID:  <199503241312.AA18798@oce-rd1.oce.nl>

next in thread | raw e-mail | index | archive | help

/*-----------------------------------------------------
 * mmap() results in endless kernel error message loop.
 *-----------------------------------------------------
 *
 * The program below, straight from Steven's "Advanced Programming In The
 * Unix Environment", crashes FreeBSD 1.1.5.1 and FreeBSD 2.0-RELEASE.
 *
 * When compiled and run as 'a.out a.out z', it results in an endless loop
 * in the kernel, printing the message: 'vnode pager write error: 5'.
 * A forced reset and a reboot is needed.
 *
 * Funny thing is that if the file to copy is within a pagesize (4K) it
 * works fine. If the file is bigger than 4K, things go wrong.
 *
 * I tried it on Solaris 2.x, SunOS 4.1.3. and HP-UX B.09.00, no problems.
 *
 * What is the situation in FreeBSD-CURRENT?
 */

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>


#ifndef MAP_FILE
#define MAP_FILE 0
#endif


int
main (argc, argv)
int argc;
char **argv;
{
    int fdin, fdout;
    char *src, *dst;
    struct stat statbuf;

    if ((fdin = open (argv[1], O_RDONLY)) < 0)
    {
	perror ("open source file failed");
	exit (1);
    }
    if ((fdout = open (argv[2], O_RDWR | O_CREAT | O_TRUNC, 0644)) < 0)
    {
	perror ("open destination file failed");
	exit (1);
    }

    (void) fstat (fdin, &statbuf);
    (void) lseek (fdout, statbuf.st_size-1, SEEK_SET);
    (void) write (fdout, "", 1);

    src = (char *) mmap (0, statbuf.st_size, PROT_READ, MAP_FILE | MAP_PRIVATE, fdin, 0);
    if (src == (caddr_t) -1)
    {
	perror ("mmap source file failed");
	exit (1);
    }

    dst = (char *) mmap (0, statbuf.st_size, PROT_READ | PROT_WRITE, 
                                    MAP_FILE | MAP_SHARED, fdout, 0);
    if (dst == (caddr_t) -1)
    {
	perror ("mmap destination file failed");
	exit (1);
    }
    (void) memcpy (dst, src, statbuf.st_size);
    return (0);
}

 
================================================================================


						JALI.

      ###########################################################
      #  This note does not necessarily represent the position  #
      #     of Oce-Nederland B.V. Therefore no liability or     #
      #      responsibility for whatever will be accepted.      #
      ###########################################################



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199503241312.AA18798>