Index: sys/dev/mpi3mr/mpi3mr.h =================================================================== --- sys/dev/mpi3mr/mpi3mr.h +++ sys/dev/mpi3mr/mpi3mr.h @@ -900,6 +900,21 @@ return (i + j); } +static __inline void +mpi3mr_atomic_dec_if_not_zero(mpi3mr_atomic_t *counter) +{ + int count; + + count = mpi3mr_atomic_read(counter); + for (;;) { + if (count == 0) + break; + + if (atomic_fcmpset_int(&counter->val, &count, count - 1)) + break; + } +} + #define MPI3MR_DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) void Index: sys/dev/mpi3mr/mpi3mr_app.c =================================================================== --- sys/dev/mpi3mr/mpi3mr_app.c +++ sys/dev/mpi3mr/mpi3mr_app.c @@ -1193,7 +1193,7 @@ out_failed: if (tgtdev) - mpi3mr_atomic_dec(&tgtdev->block_io); + mpi3mr_atomic_dec_if_not_zero(&tgtdev->block_io); sc->ioctl_cmds.is_senseprst = 0; sc->ioctl_cmds.sensebuf = NULL;