xref: /freebsd/tools/test/stress2/misc/datamove5.sh (revision 608c97bff921c8936eb71f4b1a177625cfa60250)
18a272653SPeter Holm#!/bin/sh
28a272653SPeter Holm
38a272653SPeter Holm#
48a272653SPeter Holm# Copyright (c) 2016 EMC Corp.
58a272653SPeter Holm# All rights reserved.
68a272653SPeter Holm#
78a272653SPeter Holm# Redistribution and use in source and binary forms, with or without
88a272653SPeter Holm# modification, are permitted provided that the following conditions
98a272653SPeter Holm# are met:
108a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright
118a272653SPeter Holm#    notice, this list of conditions and the following disclaimer.
128a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright
138a272653SPeter Holm#    notice, this list of conditions and the following disclaimer in the
148a272653SPeter Holm#    documentation and/or other materials provided with the distribution.
158a272653SPeter Holm#
168a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
178a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
188a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
198a272653SPeter Holm# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
208a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
218a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
228a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
238a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
248a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
258a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
268a272653SPeter Holm# SUCH DAMAGE.
278a272653SPeter Holm#
288a272653SPeter Holm
298a272653SPeter Holm# Variation of the datamove2.sh, using NULLFS
308a272653SPeter Holm# No problems seen.
318a272653SPeter Holm
328a272653SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
338a272653SPeter Holm
348a272653SPeter Holm. ../default.cfg
358a272653SPeter Holm
368a272653SPeter Holmhere=`pwd`
378a272653SPeter Holmcd /tmp
388a272653SPeter Holmsed '1,/^EOF/d' < $here/$0 > datamove5.c
398a272653SPeter Holmmycc -o datamove5 -Wall -Wextra -O2 -g datamove5.c
408a272653SPeter Holmrm -f datamove5.c
418a272653SPeter Holm
428a272653SPeter Holmmp1=$mntpoint
438a272653SPeter Holmmp2=${mntpoint}2
448a272653SPeter Holm[ -d $mp2 ] || mkdir $mp2
458a272653SPeter Holm
468a272653SPeter Holmmount | grep -wq $mp2 && umount $mp2
478a272653SPeter Holmmount | grep -wq $mp1 && umount $mp1
488a272653SPeter Holmmdconfig -l | grep -q md$mdstart &&  mdconfig -d -u $mdstart
498a272653SPeter Holmmdconfig -a -t swap -s 2g -u $mdstart || exit 1
50*608c97bfSPeter Holmnewfs $newfs_flags md$mdstart > /dev/null
51*608c97bfSPeter Holmmount /dev/md$mdstart $mp1
528a272653SPeter Holm
538a272653SPeter Holmmount -t nullfs $opt $mp1 $mp2
548a272653SPeter Holmchmod 777 $mp2
558a272653SPeter Holm
568a272653SPeter Holmfor i in `jot 5`; do
578a272653SPeter Holm	su $testuser -c "cd $mp2; /tmp/datamove5"
588a272653SPeter Holmdone
598a272653SPeter Holm
608a272653SPeter Holmwhile mount | grep -wq $mp2;  do
618a272653SPeter Holm	umount $mp2 || sleep 1
628a272653SPeter Holmdone
638a272653SPeter Holmwhile mount | grep $mp1 | grep -q /dev/md; do
648a272653SPeter Holm	umount $mp1 || sleep 1
658a272653SPeter Holmdone
668a272653SPeter Holmmdconfig -d -u $mdstart
678a272653SPeter Holm
688a272653SPeter Holmrm -rf /tmp/datamove5
698a272653SPeter Holmexit 0
708a272653SPeter HolmEOF
718a272653SPeter Holm/*-
728a272653SPeter Holm * Copyright (c) 2006, Stephan Uphoff <ups@freebsd.org>
738a272653SPeter Holm * All rights reserved.
748a272653SPeter Holm *
758a272653SPeter Holm * Redistribution and use in source and binary forms, with or without
768a272653SPeter Holm * modification, are permitted provided that the following conditions
778a272653SPeter Holm * are met:
788a272653SPeter Holm * 1. Redistributions of source code must retain the above copyright
798a272653SPeter Holm *    notice unmodified, this list of conditions, and the following
808a272653SPeter Holm *    disclaimer.
818a272653SPeter Holm * 2. Redistributions in binary form must reproduce the above copyright
828a272653SPeter Holm *    notice, this list of conditions and the following disclaimer in the
838a272653SPeter Holm *    documentation and/or other materials provided with the distribution.
848a272653SPeter Holm *
858a272653SPeter Holm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
868a272653SPeter Holm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
878a272653SPeter Holm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
888a272653SPeter Holm * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
898a272653SPeter Holm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
908a272653SPeter Holm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
918a272653SPeter Holm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
928a272653SPeter Holm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
938a272653SPeter Holm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
948a272653SPeter Holm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
958a272653SPeter Holm */
968a272653SPeter Holm
978a272653SPeter Holm#include <err.h>
988a272653SPeter Holm#include <fcntl.h>
998a272653SPeter Holm#include <stdio.h>
1008a272653SPeter Holm#include <stdlib.h>
1018a272653SPeter Holm#include <sys/mman.h>
1028a272653SPeter Holm#include <sys/stat.h>
1038a272653SPeter Holm#include <sys/types.h>
1048a272653SPeter Holm#include <sys/wait.h>
1058a272653SPeter Holm#include <unistd.h>
1068a272653SPeter Holm
1078a272653SPeter Holmint	prepareFile(char *filename, int *fdp);
1088a272653SPeter Holmint	mapBuffer  (char **bufferp, int fd1, int fd2);
1098a272653SPeter Holmint	startIO    (int fd, char *buffer);
1108a272653SPeter Holm
1118a272653SPeter Holmint	pagesize;
1128a272653SPeter Holm
1138a272653SPeter Holm#define FILESIZE (32*1024)
1148a272653SPeter Holmchar	wbuffer   [FILESIZE];
1158a272653SPeter Holm
1168a272653SPeter Holm/* Create a FILESIZE sized file - then remove file data from the cache */
1178a272653SPeter Holmint
1188a272653SPeter HolmprepareFile(char *filename, int *fdp)
1198a272653SPeter Holm{
1208a272653SPeter Holm	int	fd;
1218a272653SPeter Holm	int	len;
1228a272653SPeter Holm	int	status;
1238a272653SPeter Holm	void	*addr;
1248a272653SPeter Holm
1258a272653SPeter Holm	fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, S_IRWXU);
1268a272653SPeter Holm	if (fd == -1) {
1278a272653SPeter Holm		perror(filename);
1288a272653SPeter Holm		return fd;
1298a272653SPeter Holm	}
1308a272653SPeter Holm	len = write(fd, wbuffer, FILESIZE);
1318a272653SPeter Holm	if (len < 0) {
1328a272653SPeter Holm		perror("Write failed");
1338a272653SPeter Holm		return 1;
1348a272653SPeter Holm	}
1358a272653SPeter Holm	status = fsync(fd);
1368a272653SPeter Holm	if (status != 0) {
1378a272653SPeter Holm		perror("fsync failed");
1388a272653SPeter Holm		return 1;
1398a272653SPeter Holm	}
1408a272653SPeter Holm	addr = mmap(NULL, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1418a272653SPeter Holm	if (addr == MAP_FAILED) {
1428a272653SPeter Holm		perror("Mmap failed");
1438a272653SPeter Holm		return 1;
1448a272653SPeter Holm	}
1458a272653SPeter Holm	status = msync(addr, FILESIZE, MS_INVALIDATE | MS_SYNC);
1468a272653SPeter Holm	if (status != 0) {
1478a272653SPeter Holm		perror("Msync failed");
1488a272653SPeter Holm		return 1;
1498a272653SPeter Holm	}
1508a272653SPeter Holm	if (munmap(addr, FILESIZE) == -1) {
1518a272653SPeter Holm		perror("munmap failed");
1528a272653SPeter Holm		return 1;
1538a272653SPeter Holm	}
1548a272653SPeter Holm
1558a272653SPeter Holm	*fdp = fd;
1568a272653SPeter Holm	return 0;
1578a272653SPeter Holm}
1588a272653SPeter Holm
1598a272653SPeter Holm/* mmap a 2 page buffer - first page is from fd1, second page from fd2 */
1608a272653SPeter Holmint
1618a272653SPeter HolmmapBuffer(char **bufferp, int fd1, int fd2)
1628a272653SPeter Holm{
1638a272653SPeter Holm	void *addr;
1648a272653SPeter Holm	char *buffer;
1658a272653SPeter Holm
1668a272653SPeter Holm	addr = mmap(NULL, pagesize * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd1, 0);
1678a272653SPeter Holm	if (addr == MAP_FAILED) {
1688a272653SPeter Holm		perror("Mmap failed");
1698a272653SPeter Holm		return 1;
1708a272653SPeter Holm	}
1718a272653SPeter Holm	buffer = addr;
1728a272653SPeter Holm	addr = mmap(buffer + pagesize, pagesize, PROT_READ | PROT_WRITE, MAP_FIXED |
1738a272653SPeter Holm		    MAP_SHARED, fd2, 0);
1748a272653SPeter Holm
1758a272653SPeter Holm	if (addr == MAP_FAILED) {
1768a272653SPeter Holm		perror("Mmap2 failed");
1778a272653SPeter Holm		return 1;
1788a272653SPeter Holm	}
1798a272653SPeter Holm	*bufferp = buffer;
1808a272653SPeter Holm	return 0;
1818a272653SPeter Holm}
1828a272653SPeter Holm
1838a272653SPeter Holmvoid
1848a272653SPeter HolmunmapBuffer(char *bufferp)
1858a272653SPeter Holm{
1868a272653SPeter Holm	if (munmap(bufferp, pagesize * 2) == -1)
1878a272653SPeter Holm		err(1, "unmap 1. buffer");
1888a272653SPeter Holm	/*
1898a272653SPeter Holm	   The following unmaps something random, which could trigger:
1908a272653SPeter Holm	   Program received signal SIGSEGV, Segmentation fault.
1918a272653SPeter Holm	   free (cp=0x28070000) at /usr/src/libexec/rtld-elf/malloc.c:311
1928a272653SPeter Holm	*/
1938a272653SPeter Holm
1948a272653SPeter Holm#if 0
1958a272653SPeter Holm	if (munmap(bufferp + pagesize * 2, pagesize * 2) == -1)
1968a272653SPeter Holm		err(1, "unmap 2. buffer");
1978a272653SPeter Holm#endif
1988a272653SPeter Holm}
1998a272653SPeter Holm
2008a272653SPeter Holmint
2018a272653SPeter HolmstartIO(int fd, char *buffer)
2028a272653SPeter Holm{
2038a272653SPeter Holm	ssize_t	len;
2048a272653SPeter Holm
2058a272653SPeter Holm	len = write(fd, buffer, 2 * pagesize);
2068a272653SPeter Holm	if (len == -1) {
2078a272653SPeter Holm		perror("write failed");
2088a272653SPeter Holm		return 1;
2098a272653SPeter Holm	}
2108a272653SPeter Holm	return 0;
2118a272653SPeter Holm}
2128a272653SPeter Holm
2138a272653SPeter Holmint
2148a272653SPeter Holmmain()
2158a272653SPeter Holm{
2168a272653SPeter Holm
2178a272653SPeter Holm	int	fdA, fdB, fdDelayA, fdDelayB;
2188a272653SPeter Holm	int	status;
2198a272653SPeter Holm	int	i;
2208a272653SPeter Holm	char	*bufferA, *bufferB;
2218a272653SPeter Holm	pid_t	pid;
2228a272653SPeter Holm
2238a272653SPeter Holm	pagesize = getpagesize();
2248a272653SPeter Holm
2258a272653SPeter Holm	for (i = 0; i < 1000; i++) {
2268a272653SPeter Holm		if ((prepareFile("A", &fdA))
2278a272653SPeter Holm		    || (prepareFile("B", &fdB))
2288a272653SPeter Holm		    || (prepareFile("DelayA", &fdDelayA))
2298a272653SPeter Holm		    || (prepareFile("DelayB", &fdDelayB))
2308a272653SPeter Holm		    || (mapBuffer(&bufferA, fdDelayA, fdB))
2318a272653SPeter Holm		    || (mapBuffer(&bufferB, fdDelayB, fdA)))
2328a272653SPeter Holm			exit(1);
2338a272653SPeter Holm
2348a272653SPeter Holm		pid = fork();
2358a272653SPeter Holm
2368a272653SPeter Holm		if (pid == 0) {
2378a272653SPeter Holm			status = startIO(fdA, bufferA);
2388a272653SPeter Holm			exit(status);
2398a272653SPeter Holm		}
2408a272653SPeter Holm		if (pid == -1) {
2418a272653SPeter Holm			perror("fork");
2428a272653SPeter Holm			exit(1);
2438a272653SPeter Holm		}
2448a272653SPeter Holm		status = startIO(fdB, bufferB);
2458a272653SPeter Holm		if (wait(&status) == -1)
2468a272653SPeter Holm			err(1, "wait");
2478a272653SPeter Holm
2488a272653SPeter Holm		close(fdA);
2498a272653SPeter Holm		close(fdB);
2508a272653SPeter Holm		close(fdDelayA);
2518a272653SPeter Holm		close(fdDelayB);
2528a272653SPeter Holm		unmapBuffer(bufferA);
2538a272653SPeter Holm		unmapBuffer(bufferB);
2548a272653SPeter Holm		unlink("A");
2558a272653SPeter Holm		unlink("B");
2568a272653SPeter Holm		unlink("DelayA");
2578a272653SPeter Holm		unlink("DelayB");
2588a272653SPeter Holm	}
2598a272653SPeter Holm	exit(status);
2608a272653SPeter Holm
2618a272653SPeter Holm}
262