1*ef777be9SPeter Holm#!/bin/sh 2*ef777be9SPeter Holm 3*ef777be9SPeter Holm# Test scenario from Bug 64816: [nfs] [patch] mmap and/or ftruncate does not work correctly on nfs mounted file systems 4*ef777be9SPeter Holm 5*ef777be9SPeter Holm. ../default.cfg 6*ef777be9SPeter Holm 7*ef777be9SPeter Holmset -u 8*ef777be9SPeter Holmgrep -q $mntpoint /etc/exports || 9*ef777be9SPeter Holm { echo "$mntpoint missing from /etc/exports"; exit 0; } 10*ef777be9SPeter Holmrpcinfo 2>/dev/null | grep -q mountd || exit 0 11*ef777be9SPeter Holm 12*ef777be9SPeter Holmprog=$(basename "$0" .sh) 13*ef777be9SPeter Holmcat > /tmp/$prog.c <<EOF 14*ef777be9SPeter Holm#include <sys/types.h> 15*ef777be9SPeter Holm#include <sys/mman.h> 16*ef777be9SPeter Holm#include <sys/stat.h> 17*ef777be9SPeter Holm#include <errno.h> 18*ef777be9SPeter Holm#include <fcntl.h> 19*ef777be9SPeter Holm#include <stdio.h> 20*ef777be9SPeter Holm#include <stdlib.h> 21*ef777be9SPeter Holm#include <string.h> 22*ef777be9SPeter Holm#include <unistd.h> 23*ef777be9SPeter Holm 24*ef777be9SPeter Holmvoid error(char *msg) 25*ef777be9SPeter Holm{ 26*ef777be9SPeter Holm fprintf(stderr, "Error: %s\nSystem error %d: %s\n", msg, errno, strerror(errno)); 27*ef777be9SPeter Holm exit(-1); 28*ef777be9SPeter Holm} 29*ef777be9SPeter Holm 30*ef777be9SPeter Holm#define SZ 1024 // Less than page size 31*ef777be9SPeter Holm 32*ef777be9SPeter Holmint main(int argn, char *argv[]) 33*ef777be9SPeter Holm{ 34*ef777be9SPeter Holm int fd, s; 35*ef777be9SPeter Holm char buffer[SZ]; 36*ef777be9SPeter Holm char *map; 37*ef777be9SPeter Holm 38*ef777be9SPeter Holm if (argn!=2) 39*ef777be9SPeter Holm { 40*ef777be9SPeter Holm fprintf(stderr, "Usage:\n %s [filename]\n", argv[0]); 41*ef777be9SPeter Holm _exit(-1); 42*ef777be9SPeter Holm } 43*ef777be9SPeter Holm 44*ef777be9SPeter Holm memset(buffer, 0, SZ); 45*ef777be9SPeter Holm s = 0; 46*ef777be9SPeter Holm 47*ef777be9SPeter Holm fd=open(argv[1], O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR); 48*ef777be9SPeter Holm if (fd==-1) 49*ef777be9SPeter Holm error("Could not create file"); 50*ef777be9SPeter Holm 51*ef777be9SPeter Holm if (write(fd, buffer, SZ)!=SZ) 52*ef777be9SPeter Holm error("Could not write buffer"); 53*ef777be9SPeter Holm 54*ef777be9SPeter Holm map=mmap(NULL, SZ, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 55*ef777be9SPeter Holm if (map==MAP_FAILED) 56*ef777be9SPeter Holm error("Map failed"); 57*ef777be9SPeter Holm map[SZ-1]=1; 58*ef777be9SPeter Holm 59*ef777be9SPeter Holm if (ftruncate(fd, SZ+1)!=0) 60*ef777be9SPeter Holm error("Could not truncate file"); 61*ef777be9SPeter Holm 62*ef777be9SPeter Holm if (map[SZ-1]==1) 63*ef777be9SPeter Holm printf("Test passed\n"); 64*ef777be9SPeter Holm else { 65*ef777be9SPeter Holm printf("Test failed\n"); 66*ef777be9SPeter Holm s = 1; 67*ef777be9SPeter Holm } 68*ef777be9SPeter Holm 69*ef777be9SPeter Holm exit(s); 70*ef777be9SPeter Holm} 71*ef777be9SPeter HolmEOF 72*ef777be9SPeter Holmmycc -o /tmp/$prog -Wall -Wextra -O0 -g /tmp/$prog.c || exit 1 73*ef777be9SPeter Holm 74*ef777be9SPeter Holmmount | grep -q "on $mntpoint " && umount -f $mntpoint 75*ef777be9SPeter Holmmdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart 76*ef777be9SPeter Holmmdconfig -s 1g -u $mdstart 77*ef777be9SPeter Holmnewfs -n $newfs_flags /dev/md$mdstart > /dev/null 78*ef777be9SPeter Holmmount /dev/md$mdstart $mntpoint 79*ef777be9SPeter Holm 80*ef777be9SPeter Holmmp2=${mntpoint}2 81*ef777be9SPeter Holmmkdir -p $mp2 82*ef777be9SPeter Holmmount | grep -q "on $mp2 " && umount -f $mp2 83*ef777be9SPeter Holmmount -t nfs -o retrycnt=3 127.0.0.1:$mntpoint $mp2 || exit 1 84*ef777be9SPeter Holmsleep .2 85*ef777be9SPeter Holmmount | grep $mntpoint 86*ef777be9SPeter Holm 87*ef777be9SPeter Holmcd $mp2 88*ef777be9SPeter Holm/tmp/$prog $prog.data; s=$? 89*ef777be9SPeter Holmls -ls $mp2/$prog.data 90*ef777be9SPeter Holmcd - 91*ef777be9SPeter Holm 92*ef777be9SPeter Holmumount $mp2 93*ef777be9SPeter Holmumount $mntpoint 94*ef777be9SPeter Holmmdconfig -d -u $mdstart 95*ef777be9SPeter Holmrm -f /tmp/$prog /tmp/$prog.c 96*ef777be9SPeter Holmexit $s 97