struct inode *inode = file_inode(file);
loff_t retval = offset, eof = 0;
ktime_t kstart = ktime_get();
+ loff_t maxbytes = ll_file_maxbytes(inode);
ENTRY;
CL_FSYNC_LOCAL, 0);
retval = ll_lseek(file, offset, origin);
- if (retval < 0)
- return retval;
- retval = vfs_setpos(file, retval, ll_file_maxbytes(inode));
+ if (retval >= 0)
+ retval = vfs_setpos(file, retval, maxbytes);
+ else if (retval == -EOPNOTSUPP)
+ retval = generic_file_llseek_size(file, offset,
+ origin, maxbytes,
+ i_size_read(inode));
} else {
retval = generic_file_llseek_size(file, offset, origin,
- ll_file_maxbytes(inode), eof);
+ maxbytes, eof);
}
if (retval >= 0)
ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_LLSEEK,
# Non-chunk-aligned writes are only allowed if they are extending the file, ie,
# if they are not overwriting existing data
test_460c() {
- (( MDS1_VERSION >= $(version_code 2.14.0.89) )) ||
- skip "Need MDS version at least 2.14.0.89"
+ (( MDS1_VERSION >= $(version_code 2.14.0.90) )) ||
+ skip "Need MDS version at least 2.14.0.90"
local stored=$DIR/$tdir/foofile
local tmpfile=$TMP/$tdir/footmp
run_test 460c "simple verification of preview write restrictions"
test_460d() {
- (( MDS1_VERSION >= $(version_code 2.14.0.89) )) ||
- skip "Need MDS version at least 2.14.0.89"
+ (( MDS1_VERSION >= $(version_code 2.14.0.90) )) ||
+ skip "Need MDS version at least 2.14.0.90"
verify_yaml_available || skip_env "YAML verification not installed"
$LCTL get_param -n sptlrpc.page_pools
}
run_test 460d "Check encrypt pools output"
+test_460f() {
+ (( MDS1_VERSION >= $(version_code 2.14.0.90) )) ||
+ skip "Need MDS version at least 2.14.0.90"
+
+ local tf=$DIR/$tfile
+
+ stack_trap "rm -f $DIR/$tfile; disable_compression"
+ enable_compression
+
+ $LFS setstripe -E -1 -Z gzip:3 --compress-chunk=64 $tf ||
+ error "set a compress component in $tf failed"
+
+ dd if=/dev/zero of=$tf bs=32k count=2 ||
+ error "first dd failed"
+ dd if=/dev/urandom of=$tf bs=32k count=1 seek=3 ||
+ error "second dd failed"
+ sync; echo 3 > /proc/sys/vm/drop_caches
+
+ $LFS getstripe $tf | grep lcme_flags.*compress ||
+ error "no compressed component"
+
+ printf "Seeking hole from 0 ... "
+ offset=$(lseek_test -l 0 $tf) || error "hole lseek failed"
+ echo $offset
+ [[ $offset == 131072 ]] || error "offset $offset != 131072"
+ printf "Seeking data from $offset ... "
+ lseek_test -d $offset $tf && error "data lseek should fail"
+ rm -f $tf
+
+ return 0
+}
+run_test 460f "verify hole/data lseek is disabled for compressed files"
+
prep_801() {
[[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
[[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&