{
case AIO_WRITE_DONE:
NOTE ("Finalizing write");
- st_write_done_worker (au->pdt);
+ st_write_done_worker (au->pdt, false);
UNLOCK (&au->io_lock);
break;
case AIO_READ_DONE:
NOTE ("Finalizing read");
- st_read_done_worker (au->pdt);
+ st_read_done_worker (au->pdt, false);
UNLOCK (&au->io_lock);
break;
#endif
extern void
-st_write_done_worker (st_parameter_dt *);
+st_write_done_worker (st_parameter_dt *, bool);
internal_proto (st_write_done_worker);
extern void
-st_read_done_worker (st_parameter_dt *);
+st_read_done_worker (st_parameter_dt *, bool);
internal_proto (st_read_done_worker);
extern void
export_proto(st_read_done);
void
-st_read_done_worker (st_parameter_dt *dtp)
+st_read_done_worker (st_parameter_dt *dtp, bool unlock)
{
bool free_newunit = false;
finalize_transfer (dtp);
free_format (dtp);
}
}
- unlock_unit (dtp->u.p.current_unit);
+ if (unlock)
+ unlock_unit (dtp->u.p.current_unit);
if (free_newunit)
{
/* Avoid inverse lock issues by placing after unlock_unit. */
unlock_unit (dtp->u.p.current_unit);
}
else
- st_read_done_worker (dtp); /* Calls unlock_unit. */
+ st_read_done_worker (dtp, true); /* Calls unlock_unit. */
}
library_end ();
void
-st_write_done_worker (st_parameter_dt *dtp)
+st_write_done_worker (st_parameter_dt *dtp, bool unlock)
{
bool free_newunit = false;
finalize_transfer (dtp);
free_format (dtp);
}
}
- unlock_unit (dtp->u.p.current_unit);
+ if (unlock)
+ unlock_unit (dtp->u.p.current_unit);
if (free_newunit)
{
/* Avoid inverse lock issues by placing after unlock_unit. */
unlock_unit (dtp->u.p.current_unit);
}
else
- st_write_done_worker (dtp); /* Calls unlock_unit. */
+ st_write_done_worker (dtp, true); /* Calls unlock_unit. */
}
library_end ();