- struct mgs_export_data *data = &exp->u.eu_mgs_data;
- struct mgs_fsc *fsc, *tmp;
- CFS_LIST_HEAD(head);
-
- cfs_spin_lock(&data->med_lock);
- cfs_list_splice_init(&data->med_clients, &head);
- cfs_spin_unlock(&data->med_lock);
-
- cfs_list_for_each_entry_safe(fsc, tmp, &head, mfc_export_list) {
- struct fs_db *fsdb = fsc->mfc_fsdb;
-
- LASSERT(fsc->mfc_export == exp);
-
- cfs_mutex_lock(&fsdb->fsdb_mutex);
- cfs_list_del_init(&fsc->mfc_fsdb_list);
- if (fsc->mfc_ir_capable == 0) {
- --fsdb->fsdb_nonir_clients;
- LASSERT(fsdb->fsdb_ir_state != IR_FULL);
- if (fsdb->fsdb_nonir_clients == 0 &&
- fsdb->fsdb_ir_state == IR_PARTIAL)
- fsdb->fsdb_ir_state = IR_FULL;
- }
- cfs_mutex_unlock(&fsdb->fsdb_mutex);
- cfs_list_del_init(&fsc->mfc_export_list);
- class_export_put(fsc->mfc_export);
- OBD_FREE_PTR(fsc);
- }
+ struct mgs_export_data *data = &exp->u.eu_mgs_data;
+ struct mgs_fsc *fsc, *tmp;
+ struct list_head head = LIST_HEAD_INIT(head);
+
+ spin_lock(&data->med_lock);
+ list_splice_init(&data->med_clients, &head);
+ spin_unlock(&data->med_lock);
+
+ list_for_each_entry_safe(fsc, tmp, &head, mfc_export_list) {
+ struct fs_db *fsdb = fsc->mfc_fsdb;
+
+ LASSERT(fsc->mfc_export == exp);
+
+ mutex_lock(&fsdb->fsdb_mutex);
+ list_del_init(&fsc->mfc_fsdb_list);
+ if (fsc->mfc_ir_capable == 0) {
+ --fsdb->fsdb_nonir_clients;
+ LASSERT(fsdb->fsdb_ir_state != IR_FULL);
+ if (fsdb->fsdb_nonir_clients == 0 &&
+ fsdb->fsdb_ir_state == IR_PARTIAL)
+ fsdb->fsdb_ir_state = IR_FULL;
+ }
+ mutex_unlock(&fsdb->fsdb_mutex);
+ list_del_init(&fsc->mfc_export_list);
+ class_export_put(fsc->mfc_export);
+ OBD_FREE_PTR(fsc);
+ }