static struct lu_device *lov_device_free(const struct lu_env *env, struct lu_device *d) { struct lov_device *ld = lu2lov_dev(d); const int nr = ld->ld_target_nr; cl_device_fini(lu2cl_dev(d)); kfree(ld->ld_target); if (ld->ld_emrg != NULL) lov_emerg_free(ld->ld_emrg, nr); kfree(ld); return NULL; }
static int lov_expand_targets(const struct lu_env *env, struct lov_device *dev) { int result; __u32 tgt_size; __u32 sub_size; result = 0; tgt_size = dev->ld_lov->lov_tgt_size; sub_size = dev->ld_target_nr; if (sub_size < tgt_size) { struct lovsub_device **newd; struct lov_device_emerg **emerg; const size_t sz = sizeof(newd[0]); emerg = lov_emerg_alloc(tgt_size); if (IS_ERR(emerg)) return PTR_ERR(emerg); newd = kcalloc(tgt_size, sz, GFP_NOFS); if (newd != NULL) { mutex_lock(&dev->ld_mutex); if (sub_size > 0) { memcpy(newd, dev->ld_target, sub_size * sz); kfree(dev->ld_target); } dev->ld_target = newd; dev->ld_target_nr = tgt_size; if (dev->ld_emrg != NULL) lov_emerg_free(dev->ld_emrg, sub_size); dev->ld_emrg = emerg; mutex_unlock(&dev->ld_mutex); } else { lov_emerg_free(emerg, tgt_size); result = -ENOMEM; } } return result; }
static struct lu_device *lov_device_free(const struct lu_env *env, struct lu_device *d) { struct lov_device *ld = lu2lov_dev(d); const int nr = ld->ld_target_nr; cl_device_fini(lu2cl_dev(d)); if (ld->ld_target != NULL) OBD_FREE(ld->ld_target, nr * sizeof(ld->ld_target[0])); if (ld->ld_emrg != NULL) lov_emerg_free(ld->ld_emrg, nr); OBD_FREE_PTR(ld); return NULL; }