--- /dev/null
+#! /bin/bash
+# FS QA Test No. 240
+#
+# Test that non-block-aligned aio+dio into holes does not leave
+# zero'd out portions of the file
+#
+# QEMU IO to a file-backed device with misaligned partitions
+# can send this sort of IO
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2010 Red Hat, Inc. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#-----------------------------------------------------------------------
+#
+# creator
+owner=sandeen@sandeen.net
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+
+_supported_fs generic
+_supported_os Linux
+
+echo "Silence is golden."
+
+# real QA test starts here
+rm -f $seq.full
+
+rm -f $TEST_DIR/aiodio_sparse
+
+# 2 threads, 4k writes, 16k filesize, stride throug file by 4k, start at 512 offset
+$here/src/aio-dio-regress/aiodio_sparse2 -i 2 -w 4k -s 16k -n 4k -o 512 "$TEST_DIR/aiodio_sparse"
+
+status=$?
+exit
/*
* do async DIO writes to a sparse file
*/
-void aiodio_sparse(char *filename, int align, int writesize, int filesize, int num_aio, int step, int sparse, int direct, int keep)
+void aiodio_sparse(char *filename, int align, int writesize, int startoffset, int filesize,
+ int num_aio, int step, int sparse, int direct, int keep)
{
int fd;
void *bufptr;
/*
* allocate the iocbs array and iocbs with buffers
*/
- offset = 0;
+ offset = startoffset;
for (i = 0; i < num_aio; i++) {
void *bufptr;
exit(1);
bufptr = malloc(writesize);
- for (offset = 0; offset < filesize; offset += step) {
+ for (offset = startoffset; offset < filesize; offset += step) {
unsigned char *badbuf;
+ if (debug)
+ fprintf(stderr, "seek to %ld and read %d\n", offset, writesize);
lseek(fd, offset, SEEK_SET);
if (read(fd, bufptr, writesize) < writesize) {
fprintf(stderr, "short read() at offset %lld\n",
void usage()
{
fprintf(stderr, "usage: dio_sparse [-n step] [-s filesize]"
- " [-w writesize] [-r readsize] filename\n");
+ " [-w writesize] [-o startoffset] [-r readsize] filename\n");
exit(1);
}
/*
* usage:
- * aiodio_sparse [-r readsize] [-w writesize] [-n step] [-a align] [-i num_aio] filename
+ * aiodio_sparse [-r readsize] [-w writesize] [-o startoffset] [-n step] [-a align] [-i num_aio] filename
*/
int main(int argc, char **argv)
long alignment = 512;
int readsize = 65536;
int writesize = 65536;
+ int startoffset = 0;
int filesize = 100*1024*1024;
int num_aio = 16;
int step = 5*1024*1024;
extern char *optarg;
extern int optind, optopt, opterr;
- while ((c = getopt(argc, argv, "dr:w:n:a:s:i:DkS")) != -1) {
+ while ((c = getopt(argc, argv, "dr:w:n:o:a:s:i:DkS")) != -1) {
char *endp;
switch (c) {
case 'D':
step = strtol(optarg, &endp, 0);
step = (int)scale_by_kmg((long long)step, *endp);
break;
+ case 'o':
+ startoffset = strtol(optarg, &endp, 0);
+ startoffset = (int)scale_by_kmg((long long)startoffset, *endp);
+ break;
case '?':
usage();
break;
* Parent write to a hole in a file using async direct i/o
*/
- aiodio_sparse(filename, alignment, writesize, filesize, num_aio, step, sparse, direct, keep);
+ aiodio_sparse(filename, alignment, writesize, startoffset, filesize, num_aio, step, sparse, direct, keep);
return 0;
}