sub->sub_io_initialized = 0;
sub->sub_borrowed = 0;
- /*
- * First sub-io. Use ->lis_single_subio and current environment, to
- * avoid dynamic allocation.
- */
- if (lio->lis_active_subios == 0) {
- sub->sub_io = &lio->lis_single_subio;
- lio->lis_single_subio_index = stripe;
- sub->sub_env = cl_env_get(&sub->sub_refcheck);
- LASSERT(sub->sub_env == env);
- } else if (lio->lis_mem_frozen) {
+ if (lio->lis_mem_frozen) {
LASSERT(mutex_is_locked(&ld->ld_mutex));
sub->sub_io = &ld->ld_emrg[stripe]->emrg_subio;
sub->sub_env = ld->ld_emrg[stripe]->emrg_env;
cookie = cl_env_reenter();
sub->sub_env = cl_env_get(&sub->sub_refcheck);
cl_env_reexit(cookie);
-
- OBD_ALLOC_PTR(sub->sub_io);
if (IS_ERR(sub->sub_env))
result = PTR_ERR(sub->sub_env);
- else if (sub->sub_io == NULL)
- result = -ENOMEM;
+
+ if (result == 0) {
+ /*
+ * First sub-io. Use ->lis_single_subio to
+ * avoid dynamic allocation.
+ */
+ if (lio->lis_active_subios == 0) {
+ sub->sub_io = &lio->lis_single_subio;
+ lio->lis_single_subio_index = stripe;
+ } else {
+ OBD_ALLOC_PTR(sub->sub_io);
+ if (sub->sub_io == NULL)
+ result = -ENOMEM;
+ }
+ }
}
if (result == 0) {
* they are not initialized at all. As a temp fix, in this case,
* we still borrow the parent's env to call sublock operations.
*/
- if (!cl_object_same(io->ci_obj, parent->cll_descr.cld_obj)) {
+ if (!io || !cl_object_same(io->ci_obj, parent->cll_descr.cld_obj)) {
subenv->lse_env = env;
subenv->lse_io = io;
subenv->lse_sub = NULL;