+ set = ptlrpc_prep_set();
+ if (set == NULL)
+ RETURN(-ENOMEM);
+
+ lr->lr_active = LT_LAYOUT;
+ laia->laia_com = com;
+ laia->laia_lr = lr;
+ switch (lr->lr_event) {
+ case LE_START:
+ ltds = &lfsck->li_ost_descs;
+ laia->laia_ltds = ltds;
+ down_read(<ds->ltd_rw_sem);
+ cfs_foreach_bit(ltds->ltd_tgts_bitmap, idx) {
+ ltd = lfsck_tgt_get(ltds, idx);
+ LASSERT(ltd != NULL);
+
+ laia->laia_ltd = ltd;
+ rc = lfsck_async_request(env, ltd->ltd_exp, lr, set,
+ lfsck_layout_master_async_interpret,
+ laia, LFSCK_NOTIFY);
+ if (rc != 0) {
+ CERROR("%s: fail to notify OST %x for layout "
+ "start: rc = %d\n",
+ lfsck_lfsck2name(lfsck), idx, rc);
+ lfsck_tgt_put(ltd);
+ lo->ll_flags |= LF_INCOMPLETE;
+ } else {
+ cnt++;
+ }
+ }
+ up_read(<ds->ltd_rw_sem);
+ break;
+ case LE_STOP:
+ case LE_PHASE2_DONE:
+ ltds = &lfsck->li_ost_descs;
+ laia->laia_ltds = ltds;
+ spin_lock(<ds->ltd_lock);
+ while (!list_empty(&llmd->llmd_ost_list)) {
+ ltd = list_entry(llmd->llmd_ost_list.next,
+ struct lfsck_tgt_desc,
+ ltd_layout_list);
+ list_del_init(<d->ltd_layout_phase_list);
+ list_del_init(<d->ltd_layout_list);
+ laia->laia_ltd = ltd;
+ spin_unlock(<ds->ltd_lock);
+ rc = lfsck_async_request(env, ltd->ltd_exp, lr, set,
+ lfsck_layout_master_async_interpret,
+ laia, LFSCK_NOTIFY);
+ if (rc != 0)
+ CERROR("%s: fail to notify OST %x for layout "
+ "stop/done: rc = %d\n",
+ lfsck_lfsck2name(lfsck),
+ ltd->ltd_index, rc);
+ else
+ cnt++;
+ spin_lock(<ds->ltd_lock);
+ }
+ spin_unlock(<ds->ltd_lock);
+ break;
+ case LE_PHASE1_DONE:
+ break;
+ default:
+ CERROR("%s: unexpected LFSCK event: rc = %d\n",
+ lfsck_lfsck2name(lfsck), lr->lr_event);
+ rc = -EINVAL;
+ break;
+ }
+
+ if (cnt > 0)
+ rc = ptlrpc_set_wait(set);
+ ptlrpc_set_destroy(set);
+
+ if (rc == 0 && lr->lr_event == LE_START &&
+ list_empty(&llmd->llmd_ost_list))
+ rc = -ENODEV;
+
+ RETURN(rc);