1*a629ded1SLOLi#!/bin/ksh -p 2*a629ded1SLOLi# 3*a629ded1SLOLi# This file and its contents are supplied under the terms of the 4*a629ded1SLOLi# Common Development and Distribution License ("CDDL"), version 1.0. 5*a629ded1SLOLi# You may only use this file in accordance with the terms of version 6*a629ded1SLOLi# 1.0 of the CDDL. 7*a629ded1SLOLi# 8*a629ded1SLOLi# A full copy of the text of the CDDL should have accompanied this 9*a629ded1SLOLi# source. A copy of the CDDL is also available via the Internet at 10*a629ded1SLOLi# http://www.illumos.org/license/CDDL. 11*a629ded1SLOLi# 12*a629ded1SLOLi 13*a629ded1SLOLi# 14*a629ded1SLOLi# Copyright 2017, loli10K <ezomori.nozomu@gmail.com>. All rights reserved. 15*a629ded1SLOLi# 16*a629ded1SLOLi 17*a629ded1SLOLi. $STF_SUITE/include/libtest.shlib 18*a629ded1SLOLi 19*a629ded1SLOLi# 20*a629ded1SLOLi# DESCRIPTION: 21*a629ded1SLOLi# 'zfs diff -t' should display inode change time correctly. 22*a629ded1SLOLi# 23*a629ded1SLOLi# STRATEGY: 24*a629ded1SLOLi# 1. Create a snapshot 25*a629ded1SLOLi# 2. Create some files with a random delay and snapshot the filesystem again 26*a629ded1SLOLi# 3. Verify 'zfs diff -t' correctly display timestamps 27*a629ded1SLOLi# 28*a629ded1SLOLi 29*a629ded1SLOLiverify_runnable "both" 30*a629ded1SLOLi 31*a629ded1SLOLifunction cleanup 32*a629ded1SLOLi{ 33*a629ded1SLOLi for snap in $TESTSNAP1 $TESTSNAP2; do 34*a629ded1SLOLi if snapexists "$snap"; then 35*a629ded1SLOLi log_must zfs destroy "$snap" 36*a629ded1SLOLi fi 37*a629ded1SLOLi done 38*a629ded1SLOLi find "$MNTPOINT" -type f -delete 39*a629ded1SLOLi rm -f "$FILEDIFF" 40*a629ded1SLOLi} 41*a629ded1SLOLi 42*a629ded1SLOLi# 43*a629ded1SLOLi# Creates $count files in $fspath. Waits a random delay between each file. 44*a629ded1SLOLi# 45*a629ded1SLOLifunction create_random # <fspath> <count> 46*a629ded1SLOLi{ 47*a629ded1SLOLi fspath="$1" 48*a629ded1SLOLi typeset -i count="$2" 49*a629ded1SLOLi typeset -i i=0 50*a629ded1SLOLi 51*a629ded1SLOLi while (( i < count )); do 52*a629ded1SLOLi log_must touch "$fspath/file$i" 53*a629ded1SLOLi sleep $(random 3) 54*a629ded1SLOLi (( i = i + 1 )) 55*a629ded1SLOLi done 56*a629ded1SLOLi} 57*a629ded1SLOLi 58*a629ded1SLOLilog_assert "'zfs diff -t' should display inode change time correctly." 59*a629ded1SLOLilog_onexit cleanup 60*a629ded1SLOLi 61*a629ded1SLOLiDATASET="$TESTPOOL/$TESTFS" 62*a629ded1SLOLiTESTSNAP1="$DATASET@snap1" 63*a629ded1SLOLiTESTSNAP2="$DATASET@snap2" 64*a629ded1SLOLiMNTPOINT="$(get_prop mountpoint $DATASET)" 65*a629ded1SLOLiFILEDIFF="$TESTDIR/zfs-diff.txt" 66*a629ded1SLOLiFILENUM=5 67*a629ded1SLOLi 68*a629ded1SLOLi# 1. Create a snapshot 69*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP1" 70*a629ded1SLOLi 71*a629ded1SLOLi# 2. Create some files with a random delay and snapshot the filesystem again 72*a629ded1SLOLicreate_random "$MNTPOINT" $FILENUM 73*a629ded1SLOLilog_must zfs snapshot "$TESTSNAP2" 74*a629ded1SLOLi 75*a629ded1SLOLi# 3. Verify 'zfs diff -t' correctly display timestamps 76*a629ded1SLOLitypeset -i count=0 77*a629ded1SLOLilog_must eval "zfs diff -t $TESTSNAP1 $TESTSNAP2 > $FILEDIFF" 78*a629ded1SLOLinawk '{print substr($1,1,index($1,".")-1)" "$NF}' < "$FILEDIFF" | while read line 79*a629ded1SLOLido 80*a629ded1SLOLi read ctime file <<< "$line" 81*a629ded1SLOLi 82*a629ded1SLOLi # If path from 'zfs diff' is not a file (could be xattr object) skip it 83*a629ded1SLOLi if [[ ! -f "$file" ]]; then 84*a629ded1SLOLi continue; 85*a629ded1SLOLi fi 86*a629ded1SLOLi 87*a629ded1SLOLi filetime="$(stat -c '%Z' $file)" 88*a629ded1SLOLi if [[ "$filetime" != "$ctime" ]]; then 89*a629ded1SLOLi log_fail "Unexpected ctime for file $file ($filetime != $ctime)" 90*a629ded1SLOLi else 91*a629ded1SLOLi log_note "Correct ctime read on $file: $ctime" 92*a629ded1SLOLi fi 93*a629ded1SLOLi 94*a629ded1SLOLi (( i = i + 1 )) 95*a629ded1SLOLidone 96*a629ded1SLOLiif [[ $i != $FILENUM ]]; then 97*a629ded1SLOLi log_fail "Wrong number of files verified ($i != $FILENUM)" 98*a629ded1SLOLifi 99*a629ded1SLOLi 100*a629ded1SLOLilog_pass "'zfs diff -t' displays inode change time correctly." 101