struct ll_sb_info *sbi;
struct lu_env *env;
u16 refcheck;
+ struct cl_object *clob;
};
static void vvp_pgcache_id_unpack(loff_t pos, struct vvp_pgcache_id *id)
return NULL;
}
-static loff_t vvp_pgcache_find(const struct lu_env *env,
- struct lu_device *dev, loff_t pos)
+static struct page *vvp_pgcache_find(const struct lu_env *env,
+ struct lu_device *dev,
+ struct cl_object **clobp, loff_t *pos)
{
struct cl_object *clob;
struct lu_site *site;
struct vvp_pgcache_id id;
site = dev->ld_site;
- vvp_pgcache_id_unpack(pos, &id);
+ vvp_pgcache_id_unpack(*pos, &id);
while (1) {
if (id.vpi_bucket >= CFS_HASH_NHLIST(site->ls_obj_hash))
- return ~0ULL;
+ return NULL;
clob = vvp_pgcache_obj(env, dev, &id);
if (clob) {
struct inode *inode = vvp_object_inode(clob);
if (nr > 0) {
id.vpi_index = vmpage->index;
/* Cant support over 16T file */
- nr = !(vmpage->index > 0xffffffff);
+ if (vmpage->index <= 0xffffffff) {
+ *clobp = clob;
+ *pos = vvp_pgcache_id_pack(&id);
+ return vmpage;
+ }
put_page(vmpage);
}
lu_object_ref_del(&clob->co_lu, "dump", current);
cl_object_put(env, clob);
- if (nr > 0)
- return vvp_pgcache_id_pack(&id);
}
/* to the next object. */
++id.vpi_depth;
id.vpi_depth &= 0xf;
if (id.vpi_depth == 0 && ++id.vpi_bucket == 0)
- return ~0ULL;
+ return NULL;
id.vpi_index = 0;
}
}
static int vvp_pgcache_show(struct seq_file *f, void *v)
{
struct seq_private *priv = f->private;
- loff_t pos;
- struct cl_object *clob;
- struct vvp_pgcache_id id;
-
- pos = *(loff_t *)v;
- vvp_pgcache_id_unpack(pos, &id);
- clob = vvp_pgcache_obj(priv->env, &priv->sbi->ll_cl->cd_lu_dev, &id);
- if (clob) {
- struct inode *inode = vvp_object_inode(clob);
- struct cl_page *page = NULL;
- struct page *vmpage;
- int result;
-
- result = find_get_pages_contig(inode->i_mapping,
- id.vpi_index, 1,
- &vmpage);
- if (result > 0) {
- lock_page(vmpage);
- page = cl_vmpage_page(vmpage, clob);
- unlock_page(vmpage);
- put_page(vmpage);
- }
-
- seq_printf(f, "%8x@" DFID ": ", id.vpi_index,
- PFID(lu_object_fid(&clob->co_lu)));
- if (page) {
- vvp_pgcache_page_show(priv->env, f, page);
- cl_page_put(priv->env, page);
- } else {
- seq_puts(f, "missing\n");
- }
- lu_object_ref_del(&clob->co_lu, "dump", current);
- cl_object_put(priv->env, clob);
+ struct page *vmpage = v;
+ struct cl_page *page;
+
+ seq_printf(f, "%8lx@" DFID ": ", vmpage->index,
+ PFID(lu_object_fid(&priv->clob->co_lu)));
+ lock_page(vmpage);
+ page = cl_vmpage_page(vmpage, priv->clob);
+ unlock_page(vmpage);
+ put_page(vmpage);
+
+ if (page) {
+ vvp_pgcache_page_show(priv->env, f, page);
+ cl_page_put(priv->env, page);
} else {
- seq_printf(f, "%llx missing\n", pos);
+ seq_puts(f, "missing\n");
}
+ lu_object_ref_del(&priv->clob->co_lu, "dump", current);
+ cl_object_put(priv->env, priv->clob);
+
return 0;
}
static void *vvp_pgcache_start(struct seq_file *f, loff_t *pos)
{
struct seq_private *priv = f->private;
+ struct page *ret;
if (priv->sbi->ll_site->ls_obj_hash->hs_cur_bits >
- 64 - PGC_OBJ_SHIFT) {
- pos = ERR_PTR(-EFBIG);
- } else {
- *pos = vvp_pgcache_find(priv->env, &priv->sbi->ll_cl->cd_lu_dev,
- *pos);
- if (*pos == ~0ULL)
- pos = NULL;
- }
+ 64 - PGC_OBJ_SHIFT)
+ ret = ERR_PTR(-EFBIG);
+ else
+ ret = vvp_pgcache_find(priv->env, &priv->sbi->ll_cl->cd_lu_dev,
+ &priv->clob, pos);
- return pos;
+ return ret;
}
static void *vvp_pgcache_next(struct seq_file *f, void *v, loff_t *pos)
{
struct seq_private *priv = f->private;
+ struct page *ret;
- *pos = vvp_pgcache_find(priv->env, &priv->sbi->ll_cl->cd_lu_dev,
- *pos + 1);
- if (*pos == ~0ULL)
- pos = NULL;
-
- return pos;
+ *pos += 1;
+ ret = vvp_pgcache_find(priv->env, &priv->sbi->ll_cl->cd_lu_dev,
+ &priv->clob, pos);
+ return ret;
}
static void vvp_pgcache_stop(struct seq_file *f, void *v)