Test using extsize to create a file with multiple extent in one PAGE. This show an error in the block conversion from unwritten to real. As a result we tag raw disk block as valid(3-4) and valid data as unwritten(5-6) On an x86_64 machine the page should look like this. buffer content 0 empty b_state = 0 1 DATA b_state = 0x1023 2 DATA b_state = 0x1023 3 empty b_state = 0 4 empty b_state = 0 5 DATA b_state = 0x1023 6 DATA b_state = 0x1023 7 empty b_state = 0 Signed-off-by: Alain Renaud <arenaud@xxxxxxx> --- .gitignore | 1 1 + 0 - 0 ! 287 | 74 74 + 0 - 0 ! 287.out | 1 1 + 0 - 0 ! group | 1 1 + 0 - 0 ! src/Makefile | 2 1 + 1 - 0 ! src/extsize_page.c | 113 113 + 0 - 0 ! 6 files changed, 191 insertions(+), 1 deletion(-) create mode 100755 287 create mode 100644 287.out create mode 100644 src/extsize_page.c Index: b/.gitignore =================================================================== --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,7 @@ src/dirperf src/dirstress src/dmiperf +src/extsize_page src/fault src/feature src/fiemap-tester Index: b/287 =================================================================== --- /dev/null +++ b/287 @@ -0,0 +1,74 @@ +#! /bin/bash +# FS QA Test No. 287 +# +# File coruption with multi extent in one page. +# +#----------------------------------------------------------------------- +# Copyright (c) 2012 SGI. 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=arenaud@xxxxxxx + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.dump + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch + +_scratch_mkfs_xfs -b size=512 >> $seq.full 2>&1 +_scratch_mount + +TDIR=${SCRATCH_MNT}/testdir +PAGE=$(getconf PAGE_SIZE) +mkdir ${TDIR} + +# Create the template file to compare with. +$here/src/extsize_page ${PAGE} 512 1 ${TDIR}/template + +# Create test file and compare to template. +for i in $(seq -w 0 20) +do + $here/src/extsize_page ${PAGE} 512 0 ${TDIR}/zfile-${i} + # clean FS cache + _scratch_unmount + _scratch_mount + if ! cmp ${TDIR}/template ${TDIR}/zfile-${i} + then + echo "ERROR: compare failed" + xfs_bmap -vp ${TDIR}/zfile-${i} + hexdump -c ${TDIR}/zfile-${i} + status=1 + exit 1 + fi +done + +# success, all done +status=0 +exit Index: b/287.out =================================================================== --- /dev/null +++ b/287.out @@ -0,0 +1 @@ +QA output created by 287 Index: b/group =================================================================== --- a/group +++ b/group @@ -405,3 +405,4 @@ 284 auto 285 auto rw 286 other +287 auto rw Index: b/src/Makefile =================================================================== --- a/src/Makefile +++ b/src/Makefile @@ -18,7 +18,7 @@ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ stale_handle pwrite_mmap_blocked fstrim t_dir_offset2 seek_sanity_test \ - seek_copy_test + seek_copy_test extsize_page SUBDIRS = Index: b/src/extsize_page.c =================================================================== --- /dev/null +++ b/src/extsize_page.c @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2012 SGI. + * 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 + */ + +/* + * Tested on a 86_64 node with filesystem blocksize of 512 + * + *meta-data=/dev/sdb1 isize=256 agcount=4, agsize=58609664 blks + * = sectsz=512 attr=2 + *data = bsize=512 blocks=234438656, imaxpct=25 + * = sunit=0 swidth=0 blks + *naming =version 2 bsize=512 ascii-ci=0 + *log =internal bsize=512 blocks=114472, version=2 + * = sectsz=512 sunit=0 blks, lazy-count=0 + *realtime =none extsz=4096 blocks=0, rtextents=0 + * + * + * PAGE 1 will look like this. + * block content + * 0 empty + * 1 B + * 2 B + * 3 empty + * 4 empty + * 5 C + * 6 C + * 7 empty + */ +#include <sys/file.h> +#include <sys/types.h> +#include <xfs/xfs.h> +#include <errno.h> +#include <unistd.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +int +main(int argc, char **argv) +{ + int fd; + int pagesz, blocksz, template; + char *pathname; + char buf[65536]; + + if ( argc != 5 ) { + printf("usage: %s <pagesz> <blocksz> <flag> <file>\n",argv[0]); + exit(1); + } + pagesz = atoi(argv[1]); + blocksz = atoi(argv[2]); + template = atoi(argv[3]); + pathname = argv[4]; + + if ( pagesz <= blocksz || ((pagesz % pagesz) != 0)) { + printf("Error invalid page/block size combination\n"); + exit(1); + } + + fd = open(pathname,O_RDWR|O_CREAT|O_TRUNC,0666); + if (fd < 0) { + perror("open"); + exit(1); + } + + if (!template) { + /* set the XFS_XFLAG_EXTSIZE on the file */ + struct fsxattr fattr; + memset(&fattr,0,sizeof(fattr)); + fattr.fsx_extsize = pagesz*10; + fattr.fsx_xflags = XFS_XFLAG_EXTSIZE; + + if (ioctl( fd, XFS_IOC_FSSETXATTR, &fattr) < 0) { + perror("Ioctl"); + exit(1); + } + } + + /* goto page 1 block 1 */ + lseek(fd, (pagesz * 1) + (blocksz * 1), SEEK_SET); + + /* write 'B' in page 1 block 1 and 2 */ + memset(buf,'B',65536); + write(fd, buf, blocksz * 2); + + /* goto page 1 block 5 */ + lseek(fd, (pagesz * 1) + (blocksz * 5), SEEK_SET); + + /* write 'C' in page 1 block 5 and 6 */ + memset(buf,'C',65536); + write(fd, buf, blocksz * 2); + + /* move eof after end of page 1 */ + ftruncate(fd, pagesz * 3); + close(fd); + + exit(0); +} _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs