xref: /freebsd/tools/test/stress2/misc/ftruncate3.sh (revision ef777be98543f7daae90bd123d4fc1ec4a54efc2)
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