static struct lu_device *vvp_device_free(const struct lu_env *env, struct lu_device *d) { struct vvp_device *vdv = lu2vvp_dev(d); struct cl_site *site = lu2cl_site(d->ld_site); struct lu_device *next = cl2lu_dev(vdv->vdv_next); if (d->ld_site) { cl_site_fini(site); kfree(site); } cl_device_fini(lu2cl_dev(d)); kfree(vdv); return next; }
static int vvp_device_init(const struct lu_env *env, struct lu_device *d, const char *name, struct lu_device *next) { struct vvp_device *vdv; int rc; vdv = lu2vvp_dev(d); vdv->vdv_next = lu2cl_dev(next); LASSERT(d->ld_site && next->ld_type); next->ld_site = d->ld_site; rc = next->ld_type->ldt_ops->ldto_device_init(env, next, next->ld_type->ldt_name, NULL); if (rc == 0) { lu_device_get(next); lu_ref_add(&next->ld_reference, "lu-stack", &lu_site_init); } return rc; }
static int vvp_object_init(const struct lu_env *env, struct lu_object *obj, const struct lu_object_conf *conf) { struct vvp_device *dev = lu2vvp_dev(obj->lo_dev); struct vvp_object *vob = lu2vvp(obj); struct lu_object *below; struct lu_device *under; int result; under = &dev->vdv_next->cd_lu_dev; below = under->ld_ops->ldo_object_alloc(env, obj->lo_header, under); if (below != NULL) { const struct cl_object_conf *cconf; cconf = lu2cl_conf(conf); lu_object_add(obj, below); result = vvp_object_init0(env, vob, cconf); } else result = -ENOMEM; return result; }
static struct lu_device *vvp_device_fini(const struct lu_env *env, struct lu_device *d) { return cl2lu_dev(lu2vvp_dev(d)->vdv_next); }