*** PORT/db/recno/rec_open.c.orig 1993/10/13 02:01:31 --- PORT/db/recno/rec_open.c 1993/10/13 02:20:47 *************** *** 159,167 **** --- 159,182 ---- SET(t, R_EOF); else { t->bt_msize = sb.st_size; + /* + * hack : + * + * The Linux kernel mmap() semantics are broken : + * + * Under Linux, read only private mappings cause write only and read/write + * opens to fail with errno=ETXTBSY. Shared read only mappings should work + * fine though, but I'm not familiar enough with the code to ascertain that + * a MAP_SHARED mapping would be safe so I use the non-mmap'd version + * instead. + * + */ + + #if !defined(linux) if ((t->bt_smap = mmap(NULL, t->bt_msize, PROT_READ, MAP_PRIVATE, rfd, (off_t)0)) == (caddr_t)-1) + #endif goto slow; t->bt_cmap = t->bt_smap; t->bt_emap = t->bt_smap + sb.st_size;