- rc = seq_client_alloc_seq(env, seq, &seqnr);
- if (rc) {
- CERROR("%s: Can't allocate new sequence, "
- "rc %d\n", seq->lcs_name, rc);
- seq_fid_alloc_fini(seq);
+ /* Release seq::lcs_mutex via seq_fid_alloc_prep() to avoid
+ * deadlock during seq_client_alloc_seq(). */
+ rc = seq_fid_alloc_prep(seq, &link);
+ if (rc)
+ continue;
+
+ rc = seq_client_alloc_seq(env, seq, &seqnr);
+ /* Re-take seq::lcs_mutex via seq_fid_alloc_fini(). */
+ seq_fid_alloc_fini(seq, rc ? 0 : seqnr, false);
+ if (rc) {
+ if (rc != -EINPROGRESS)
+ CERROR("%s: Can't allocate new sequence: "
+ "rc = %d\n", seq->lcs_name, rc);