Home | History | Annotate | Download | only in ext4-nsec-timestamps
      1 #!/bin/bash
      2 
      3 ################################################################################
      4 ##                                                                            ##
      5 ## Copyright (c) 2009 FUJITSU LIMITED                                         ##
      6 ##                                                                            ##
      7 ## This program is free software;  you can redistribute it and#or modify      ##
      8 ## it under the terms of the GNU General Public License as published by       ##
      9 ## the Free Software Foundation; either version 2 of the License, or          ##
     10 ## (at your option) any later version.                                        ##
     11 ##                                                                            ##
     12 ## This program is distributed in the hope that it will be useful, but        ##
     13 ## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
     14 ## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
     15 ## for more details.                                                          ##
     16 ##                                                                            ##
     17 ## You should have received a copy of the GNU General Public License          ##
     18 ## along with this program;  if not, write to the Free Software               ##
     19 ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
     20 ##                                                                            ##
     21 ## Author: Li Zefan <lizf (at] cn.fujitsu.com>                                     ##
     22 ##         Miao Xie <miaox (at] cn.fujitsu.com>                                    ##
     23 ##                                                                            ##
     24 ################################################################################
     25 
     26 export TCID="ext4-nsec-timestamps"
     27 export TST_TOTAL=2
     28 
     29 . ext4_funcs.sh
     30 
     31 # Test that file timestamps is second with 128 inode size
     32 ext4_test_sec_timestamps()
     33 {
     34 	tst_resm TINFO "Test timestamps with 128 inode size"
     35 
     36 	mkfs.ext4 -I 128 $EXT4_DEV >/dev/null 2>&1
     37 	if [ $? -ne 0 ]; then
     38 		tst_resm TFAIL "failed to create ext4 filesystem"
     39 		return
     40 	fi
     41 
     42 	tune2fs -O extents $EXT4_DEV >/dev/null 2>&1
     43 
     44 	mount -t ext4 $EXT4_DEV mnt_point
     45 	if [ $? -ne 0 ]; then
     46 		tst_resm TFAIL "failed to mount ext4 filesystem"
     47 		return
     48 	fi
     49 
     50 	touch mnt_point/tmp_file
     51 
     52 	atime=`ext4_file_time mnt_point/tmp_file atime nsec`
     53 	mtime=`ext4_file_time mnt_point/tmp_file mtime nsec`
     54 	ctime=`ext4_file_time mnt_point/tmp_file ctime nsec`
     55 
     56 	if [ $atime -ne 0 -o $mtime -ne 0 -o $ctime -ne 0 ]; then
     57 		tst_resm TFAIL "Timestamp is not second(atime: $atime, mtime: \
     58 				$mtime, ctime: $ctime)"
     59 		umount mnt_point
     60 		return
     61 	fi
     62 
     63 	umount mnt_point
     64 	if [ $? -ne 0 ]; then
     65 		tst_resm TFAIL "failed to umount ext4 filesystem"
     66 		return
     67 	fi
     68 
     69 	tst_resm TPASS "Ext4 nanosecond timestamps test with 128 inode size pass"
     70 }
     71 
     72 # Test file timestamps is nanosecond with 256 inode size
     73 ext4_test_nsec_timestamps()
     74 {
     75 	tst_resm TINFO "Test timestamps with 256 inode size"
     76 
     77 	mkfs.ext3 -I 256 $EXT4_DEV >/dev/null 2>&1
     78 	if [ $? -ne 0 ]; then
     79 		tst_resm TFAIL "failed to create ext4 filesystem"
     80 		return
     81 	fi
     82 
     83 	mount -t ext4 $EXT4_DEV mnt_point
     84 	if [ $? -ne 0 ]; then
     85 		tst_resm TFAIL "failed to mount ext4 filesystem"
     86 		return
     87 	fi
     88 
     89 	# Create file
     90 	touch mnt_point/tmp_file
     91 	sleep 1
     92 
     93 	# Change atime, ctime and mtime of the file
     94 	touch mnt_point/tmp_file
     95 
     96 	cur_time=`date '+%s %N'`
     97 	sec=`echo $cur_time | awk {'print $1'}`
     98 	nsec=`echo $cur_time | awk {'print $2'}`
     99 
    100 	sec_atime=`ext4_file_time mnt_point/tmp_file atime sec`
    101 	sec_mtime=`ext4_file_time mnt_point/tmp_file mtime sec`
    102 	sec_ctime=`ext4_file_time mnt_point/tmp_file ctime sec`
    103 	nsec_atime=`ext4_file_time mnt_point/tmp_file atime nsec`
    104 	nsec_mtime=`ext4_file_time mnt_point/tmp_file mtime nsec`
    105 	nsec_ctime=`ext4_file_time mnt_point/tmp_file ctime nsec`
    106 
    107 	# Test nanosecond
    108 	if [ $nsec_atime -eq 0 -a $nsec_mtime -eq 0 -a $nsec_ctime -eq 0 ]
    109 	then
    110 		tst_resm TFAIL "The timestamp is not nanosecond(nsec_atime: $nsec_atime, nsec_mtime: $nsec_mtime, nsec_ctime: $nsec_ctime)"
    111 		umount mnt_point
    112 		return
    113 	fi
    114 
    115 	diff1=$(( $sec_atime - $sec ))
    116 	diff2=$(( $sec_mtime - $sec ))
    117 	diff3=$(( $sec_ctime - $sec ))
    118 
    119 	# Test difference between file time and current time
    120 	if [ $diff1 -gt 1 -o $diff2 -gt 1 -o $diff2 -gt 1 ]; then
    121 		tst_resm TFAIL "The timestamp is wrong, it must be earlier \
    122 			than the current time we got.(sec_atime: $sec_atime, \
    123 			sec_mtime: $sec_mtime, sec_ctime: $sec_ctime, \
    124 			cur_time[s]: $sec)"
    125 		umount mnt_point
    126 		return
    127 	fi
    128 
    129 	umount mnt_point
    130 	if [ $? -ne 0 ]; then
    131 		tst_resm TFAIL "failed to umount ext4 filesystem"
    132 		return
    133 	fi
    134 
    135 	# Test mount to ext3 and then mount back to ext4
    136 	mount -t ext3 $EXT4_DEV mnt_point
    137 	if [ $? -ne 0 ]; then
    138 		tst_resm TFAIL "failed to mount to ext3"
    139 		return
    140 	fi
    141 	umount mnt_point
    142 
    143 	mount -t ext4 $EXT4_DEV mnt_point
    144 	if [ $? -ne 0 ]; then
    145 		tst_resm TFAIL "failed to mount back to ext4"
    146 		return
    147 	fi
    148 
    149 	nsec_atime2=`ext4_file_time mnt_point/tmp_file atime nsec`
    150 	nsec_mtime2=`ext4_file_time mnt_point/tmp_file mtime nsec`
    151 	nsec_ctime2=`ext4_file_time mnt_point/tmp_file mtime nsec`
    152 
    153 	if [ $nsec_atime -ne $nsec_atime2 -o $nsec_ctime -ne $nsec_ctime2 -o \
    154 	     $nsec_mtime -ne $nsec_mtime2 ]; then
    155 		tst_resm TFAIL "File nanosecond timestamp has changed \
    156 			unexpected. Before[atime mtime ctime]: $nsec_atime \
    157 			$nsec_mtime $nsec_ctime, After[atime mtime ctime]: \
    158 			$nsec_atime2 $nsec_mtime2 $nsec_ctime2)"
    159 		umount mnt_point
    160 		return
    161 	fi
    162 
    163 	umount mnt_point
    164 	tst_resm TPASS "Ext4 nanosecond timestamps test with 256 inode size pass"
    165 }
    166 
    167 # main
    168 ext4_setup
    169 
    170 ext4_test_sec_timestamps
    171 ext4_test_nsec_timestamps
    172 
    173 tst_exit
    174