if (ptlrpc_connection_is_local(exp->exp_connection))
dbt |= DT_BUFS_TYPE_LOCAL;
+ if (chunk_size)
+ dbt |= DT_BUFS_TYPE_COMPRESSION;
+
begin = -1;
end = 0;
GOTO(out, rc = -ENOENT);
}
+ if (chunk_size)
+ dbt |= DT_BUFS_TYPE_COMPRESSION;
+
if (ptlrpc_connection_is_local(exp->exp_connection))
dbt |= DT_BUFS_TYPE_LOCAL;
}
static struct page *osd_get_page(const struct lu_env *env, struct dt_object *dt,
- loff_t offset, gfp_t gfp_mask, bool cache)
+ loff_t offset, gfp_t gfp_mask, bool cache,
+ bool compression)
{
struct osd_thread_info *oti = osd_oti_get(env);
struct inode *inode = osd_dt_obj(dt)->oo_inode;
LASSERT(inode);
if (cache) {
+ LASSERT(!compression);
page = find_or_create_page(inode->i_mapping,
offset >> PAGE_SHIFT, gfp_mask);
page = find_lock_page(inode->i_mapping, offset >> PAGE_SHIFT);
if (page) {
wait_on_page_writeback(page);
- return page;
+ if (!compression)
+ return page;
+ /* ldiskfs truncate creates a single page in the page
+ * cache, so if we're in that case, we must force it
+ * out (there is no data in it, so this is safe)
+ */
+ CDEBUG(D_SEC,
+ "compression, found page at %llu, removing\n",
+ offset);
+ generic_error_remove_page(inode->i_mapping, page);
}
}
iosize = fsize - lnb[0].lnb_file_offset;
fsize = max(fsize, i_size_read(obj->oo_inode));
+ if (rw & DT_BUFS_TYPE_COMPRESSION) {
+ CDEBUG(D_INODE,
+ "Compression - not using page cache for IO at %lld, %ld bytes\n",
+ pos, len);
+ cache = false;
+ goto bypass_checks;
+ }
cache = rw & DT_BUFS_TYPE_READAHEAD;
if (cache)
goto bypass_checks;
GFP_HIGHUSER;
for (i = 0; i < npages; i++, lnb++) {
lnb->lnb_page = osd_get_page(env, dt, lnb->lnb_file_offset,
- gfp_mask, cache);
+ gfp_mask, cache,
+ rw & DT_BUFS_TYPE_COMPRESSION);
if (lnb->lnb_page == NULL)
GOTO(cleanup, rc = -ENOMEM);