From Bugzilla Helper: User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.2) Gecko/20040415 Description of problem: programs which mmap large files, but in small chunks using offset and length, in rw mode cause kernel panic Version-Release number of selected component (if applicable): 2.4.21-15.EL How reproducible: Always Steps to Reproduce: 1. create a large file [ahoward@harp ahoward]$ dd if=/dev/zero of=1gb bs=8192 count=131072 131072+0 records in 131072+0 records out 2. compile this program #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <sys/mman.h> #include <fcntl.h> #define TILE_SIZE 1048576 /* * * ~ > gcc filemap_bug.c -o filemap_bug * ~ > filemap_bug big_file * */ int main (argc, argv) int argc; char **argv; { int ret; char *path; struct stat buf; off_t size, offset, length, tn; int fd; void *mem; unsigned char *start; unsigned char *byte; int i; if (argc < 2) { fprintf (stderr, "%s huge_input_file\n", __FILE__); return (EXIT_FAILURE); } path = *(argv + 1); ret = stat (path, &buf); size = buf.st_size; fd = open (path, O_RDWR); for (offset = 0, tn = 0; offset < size; offset += TILE_SIZE, tn++) { length = size - offset; length = length > TILE_SIZE ? TILE_SIZE : length; fprintf (stdout, "<%s>[%d,%d] - tile_number <%d>\n", path, offset, length, tn); mem = mmap (NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset); start = (unsigned char *)mem; madvise (start, length, MADV_SEQUENTIAL); for (byte = start; byte - start < length; byte++) { *byte = 42; } msync (start, length, MS_SYNC); munmap (start, length); } close (fd); return (EXIT_SUCCESS); } 3. run the program on created file ./a.out 1gb 4. watch the kernel panic (for me around tile 140) Actual Results: kernel panic Expected Results: every byte of the input file == 42 Additional info:
*** This bug has been marked as a duplicate of 124624 ***
Changed to 'CLOSED' state since 'RESOLVED' has been deprecated.