.close = ll_vm_close,
};
-int ll_mmap_check_compression(struct file *file, unsigned long off)
+int ll_mmap_check_compression(struct file *file, loff_t off)
{
struct inode *inode = file_inode(file);
struct ll_inode_info *lli = ll_i2info(inode);
int rc = 0;
__u32 gen;
+ /* mmap reads of compressed files are supported */
+ if ((file->f_flags & O_ACCMODE) == O_RDONLY)
+ RETURN(0);
+
rc = ll_layout_refresh(inode, &gen);
if (rc) {
- CERROR("can't refresh layout: rc=%d\n", rc);
+ CERROR("%s: "DFID" cannot refresh layout: rc = %d\n",
+ ll_i2sbi(inode)->ll_fsname, PFID(&lli->lli_fid), rc);
RETURN(rc);
}
if (ll_layout_version_get(lli) == CL_LAYOUT_GEN_EMPTY)
rc = -EOPNOTSUPP;
} else if (rc == 1 || rc == -ENODATA) {
rc = 0;
- } else
- CDEBUG(D_ERROR, "rc=%d\n", rc);
+ } else {
+ CERROR("%s: "DFID" cl_io_rw_init() failed: rc = %d\n",
+ ll_i2sbi(inode)->ll_fsname, PFID(&lli->lli_fid), rc);
+ }
cl_io_fini(env, io);
if (ll_file_nolock(file))
RETURN(-EOPNOTSUPP);
- rc = ll_mmap_check_compression(file, vma->vm_pgoff << PAGE_SHIFT);
+ rc = ll_mmap_check_compression(file, (loff_t)vma->vm_pgoff<<PAGE_SHIFT);
if (rc)
RETURN(rc);
}
break;
case 'M':
+ {
+ int mmap_mode = 0;
+ int fd_flags;
+
if (st.st_size == 0) {
fprintf(stderr,
"mmap without preceeding stat, or on zero length file.\n");
exit(-1);
}
+
+ /* match mmap mode to file open mode */
+ fd_flags = fcntl(fd, F_GETFL);
+ if (fd_flags < 0) {
+ fprintf(stderr,
+ "unable to get file flags for mmap\n");
+ exit (-1);
+ }
+ if (fd_flags & O_RDONLY || fd_flags & O_RDWR)
+ mmap_mode |= PROT_READ;
+
+ if (fd_flags & O_WRONLY || fd_flags & O_RDWR)
+ mmap_mode |= PROT_WRITE;
+
mmap_len = st.st_size;
- mmap_ptr = mmap(NULL, mmap_len, PROT_WRITE | PROT_READ,
- MAP_SHARED, fd, 0);
+ mmap_ptr = mmap(NULL, mmap_len, mmap_mode, MAP_SHARED,
+ fd, 0);
if (mmap_ptr == MAP_FAILED) {
save_errno = errno;
perror("mmap");
exit(save_errno);
}
break;
+ }
case 'n':
oldpath = POP_ARG();
if (!oldpath)
run_test 460d "Check encrypt pools output"
test_460e() {
- (( MDS1_VERSION >= $(version_code 2.14.0.85) )) ||
- skip "Need MDS version at least 2.14.0.85"
+ (( MDS1_VERSION >= $(version_code 2.14.0.91) )) ||
+ skip "Need MDS version at least 2.14.0.91"
local tf=$DIR/$tfile
- stack_trap "rm -Rf $DIR/$tfile; disable_compression"
+ stack_trap "rm -f $tf; disable_compression"
enable_compression
$LFS setstripe -E -1 -Z lz4:5 --compress-chunk=64 $tf ||
error "set a compress component in $tf failed"
- dd if=/dev/zero of=$tf bs=32k count=5 ||
- error "dd to $stored failed"
+ dd if=/dev/zero of=$tf bs=32k count=5 || error "dd to $stored failed"
sync; echo 3 > /proc/sys/vm/drop_caches
$LFS getstripe $tf
- $LFS getstripe $tf | grep lcme_flags.*compress ||
+ $LFS getstripe $tf | grep -q lcme_flags.*compress ||
error "no compressed component"
- $MULTIOP $tf OSMc && error "mmap must be disabled"
+ $MULTIOP $tf OSMc &&
+ error "(0) writeable mmap of compressed files should not work"
+ $MULTIOP $tf oSMc ||
+ error "(1) readonly mmap of compressed files should work"
rm -f $tf
- dd if=/dev/zero of=$tf bs=32k count=5 ||
- error "dd to $stored failed"
- $MULTIOP $tf OSMc || error "mmap must be disabled"
-
- return 0
+ dd if=/dev/zero of=$tf bs=32k count=5 || error "dd(2) to $stored failed"
+ $MULTIOP $tf OSMc ||
+ error "(2) writeable mmap of uncompressed files should work"
+ $MULTIOP $tf oSMc ||
+ error "(3) readonly mmap of uncompressed files should work"
}
run_test 460e "verify mmap is disabled with compressed files"
test_460f() {
- (( MDS1_VERSION >= $(version_code 2.14.0.90) )) ||
- skip "Need MDS version at least 2.14.0.90"
+ (( MDS1_VERSION >= $(version_code 2.14.0.91) )) ||
+ skip "Need MDS version at least 2.14.0.91"
local tf=$DIR/$tfile
- stack_trap "rm -f $DIR/$tfile; disable_compression"
+ stack_trap "rm -f $tf; disable_compression"
enable_compression
$LFS setstripe -E -1 -Z gzip:3 --compress-chunk=64 $tf ||
[[ $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
}