Whamcloud - gitweb
b=10555
authorkalpak <kalpak>
Fri, 8 Aug 2008 08:27:14 +0000 (08:27 +0000)
committerkalpak <kalpak>
Fri, 8 Aug 2008 08:27:14 +0000 (08:27 +0000)
i=adilger
i=green
i=girish

add ldiskfs patches and lustre support for FIEMAP ioctl

lustre/tests/sanity.sh

index 1da1fc4..380d48a 100644 (file)
@@ -5150,6 +5150,224 @@ test_129() {
 }
 run_test 129 "test directory size limit ========================"
 
+test_130a() {
+       filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
+       [ -n "$filefrag_op" ] && skip '"filefrag does not support FIEMAP" && return'
+
+       local fm_file=$DIR/$tfile
+       lfs setstripe -s 65536 -c 1 $fm_file || error "setstripe failed on $fm_file"
+       dd if=/dev/zero of=$fm_file bs=65536 count=1 || error "dd failed for $fm_file"
+
+       filefrag -ves $fm_file || error "filefrag $fm_file failed"
+       filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" | grep -v "ext:" | grep -v "found"`
+
+       lun=`$GETSTRIPE $fm_file  | grep -A 10 obdidx | awk '{print $1}' | grep -v "obdidx"`
+
+       start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
+       IFS=$'\n'
+       tot_len=0
+       for line in $filefrag_op
+       do
+               frag_lun=`echo $line | cut -d: -f5`
+               ext_len=`echo $line | cut -d: -f4`
+               if (( $frag_lun != $lun )); then
+                       error "FIEMAP on 1-stripe file($fm_file) failed"
+                       return
+               fi
+               (( tot_len += ext_len ))
+       done
+
+       if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
+               error "FIEMAP on 1-stripe file($fm_file) failed;"
+               return
+       fi
+       echo "FIEMAP on single striped file succeeded"
+}
+run_test 130a "FIEMAP (1-stripe file)"
+
+test_130b() {
+       [ "$OSTCOUNT" -lt "2" ] && skip "skipping FIEMAP on 2-stripe file test" && return
+
+       filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
+       [ -n "$filefrag_op" ] && skip '"filefrag does not support FIEMAP" && return'
+
+       local fm_file=$DIR/$tfile
+       lfs setstripe -s 65536 -c 2 $fm_file || error "setstripe failed on $fm_file"
+       dd if=/dev/zero of=$fm_file bs=1M count=2 || error "dd failed on $fm_file"
+
+       filefrag -ves $fm_file || error "filefrag $fm_file failed"
+       filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" | grep -v "ext:" | grep -v "found"`
+
+       last_lun=`echo $filefrag_op | cut -d: -f5`
+
+       IFS=$'\n'
+       tot_len=0
+       num_luns=1
+       for line in $filefrag_op
+       do
+               frag_lun=`echo $line | cut -d: -f5`
+               ext_len=`echo $line | cut -d: -f4`
+               if (( $frag_lun != $last_lun )); then
+                       if (( tot_len != 1024 )); then
+                               error "FIEMAP on $fm_file failed; returned len $tot_len for OST $last_lun instead of 256"
+                               return
+                       else
+                               (( num_luns += 1 ))
+                               tot_len=0
+                       fi
+               fi
+               (( tot_len += ext_len ))
+               last_lun=$frag_lun
+       done
+       if (( num_luns != 2 || tot_len != 1024 )); then
+               error "FIEMAP on $fm_file failed; returned wrong number of luns or wrong len for OST $last_lun"
+               return
+       fi
+
+       echo "FIEMAP on 2-stripe file succeeded"
+}
+run_test 130b "FIEMAP (2-stripe file)"
+
+test_130c() {
+       [ "$OSTCOUNT" -lt "2" ] && skip "skipping FIEMAP on 2-stripe file with hole test" && return
+
+       filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
+       [ -n "$filefrag_op" ] && skip '"filefrag does not support FIEMAP" && return'
+
+       local fm_file=$DIR/$tfile
+       lfs setstripe -s 65536 -c 2 $fm_file || error "setstripe failed on $fm_file"
+       dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 || error "dd failed on $fm_file"
+
+       filefrag -ves $fm_file || error "filefrag $fm_file failed"
+       filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" | grep -v "ext:" | grep -v "found"`
+
+       last_lun=`echo $filefrag_op | cut -d: -f5`
+
+       IFS=$'\n'
+       tot_len=0
+       num_luns=1
+       for line in $filefrag_op
+       do
+               frag_lun=`echo $line | cut -d: -f5`
+               ext_len=`echo $line | cut -d: -f4`
+               if (( $frag_lun != $last_lun )); then
+                       logical=`echo $line | cut -d: -f2 | cut -d. -f1`
+                       if (( logical != 512 )); then
+                               error "FIEMAP on $fm_file failed; returned logical start for lun $logical instead of 512"
+                               return
+                       fi
+                       if (( tot_len != 512 )); then
+                               error "FIEMAP on $fm_file failed; returned len $tot_len for OST $last_lun instead of 1024"
+                               return
+                       else
+                               (( num_luns += 1 ))
+                               tot_len=0
+                       fi
+               fi
+               (( tot_len += ext_len ))
+               last_lun=$frag_lun
+       done
+       if (( num_luns != 2 || tot_len != 512 )); then
+               error "FIEMAP on $fm_file failed; returned wrong number of luns or wrong len for OST $last_lun"
+               return
+       fi
+
+       echo "FIEMAP on 2-stripe file with hole succeeded"
+}
+run_test 130c "FIEMAP (2-stripe file with hole)"
+
+test_130d() {
+       [ "$OSTCOUNT" -lt "3" ] && skip "skipping FIEMAP on N-stripe file test" && return
+
+       filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
+       [ -n "$filefrag_op" ] && skip '"filefrag does not support FIEMAP" && return'
+
+       local fm_file=$DIR/$tfile
+       lfs setstripe -s 65536 -c $OSTCOUNT $fm_file || error "setstripe failed on $fm_file"
+       dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT || error "dd failed on $fm_file"
+
+       filefrag -ves $fm_file || error "filefrag $fm_file failed"
+       filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" | grep -v "ext:" | grep -v "found"`
+
+       last_lun=`echo $filefrag_op | cut -d: -f5`
+
+       IFS=$'\n'
+       tot_len=0
+       num_luns=1
+       for line in $filefrag_op
+       do
+               frag_lun=`echo $line | cut -d: -f5`
+               ext_len=`echo $line | cut -d: -f4`
+               if (( $frag_lun != $last_lun )); then
+                       if (( tot_len != 1024 )); then
+                               error "FIEMAP on $fm_file failed; returned len $tot_len for OST $last_lun instead of 1024"
+                               return
+                       else
+                               (( num_luns += 1 ))
+                               tot_len=0
+                       fi
+               fi
+               (( tot_len += ext_len ))
+               last_lun=$frag_lun
+       done
+       if (( num_luns != OSTCOUNT || tot_len != 1024 )); then
+               error "FIEMAP on $fm_file failed; returned wrong number of luns or wrong len for OST $last_lun"
+               return
+       fi
+
+       echo "FIEMAP on N-stripe file succeeded"
+}
+run_test 130d "FIEMAP (N-stripe file)"
+
+test_130e() {
+       [ "$OSTCOUNT" -lt "2" ] && skip "skipping continuation FIEMAP test" && return
+
+       filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
+       [ -n "$filefrag_op" ] && skip '"filefrag does not support FIEMAP" && return'
+
+       local fm_file=$DIR/$tfile
+       lfs setstripe -s 65536 -c 2 $fm_file || error "setstripe failed on $fm_file"
+       NUM_BLKS=512
+       EXPECTED_LEN=$(( (NUM_BLKS / 2) * 4 ))
+       for ((i = 0; i < $NUM_BLKS; i++))
+       do
+               dd if=/dev/zero of=$fm_file count=1 bs=4096 seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
+       done
+
+       filefrag -ves $fm_file || error "filefrag $fm_file failed"
+       filefrag_op=`filefrag -ve $fm_file | grep -A 750 "ext:" | grep -v "ext:" | grep -v "found"`
+
+       last_lun=`echo $filefrag_op | cut -d: -f5`
+
+       IFS=$'\n'
+       tot_len=0
+       num_luns=1
+       for line in $filefrag_op
+       do
+               frag_lun=`echo $line | cut -d: -f5`
+               ext_len=`echo $line | cut -d: -f4`
+               if (( $frag_lun != $last_lun )); then
+                       if (( tot_len != $EXPECTED_LEN )); then
+                               error "FIEMAP on $fm_file failed; returned len $tot_len for OST $last_lun instead of $EXPECTED_LEN"
+                               return
+                       else
+                               (( num_luns += 1 ))
+                               tot_len=0
+                       fi
+               fi
+               (( tot_len += ext_len ))
+               last_lun=$frag_lun
+       done
+       if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
+               echo "$num_luns $tot_len"
+               error "FIEMAP on $fm_file failed; returned wrong number of luns or wrong len for OST $last_lun"
+               return
+       fi
+
+       echo "FIEMAP with continuation calls succeeded"
+}
+run_test 130e "FIEMAP (test continuation FIEMAP calls)"
+
 TMPDIR=$OLDTMPDIR
 TMP=$OLDTMP
 HOME=$OLDHOME