if (rc)
                return rc;
 
-       if (commit)
+       if (commit) {
                rc = cxl_region_decode_commit(cxlr);
-       else {
+               if (rc == 0)
+                       p->state = CXL_CONFIG_COMMIT;
+       } else {
                p->state = CXL_CONFIG_RESET_PENDING;
                up_write(&cxl_region_rwsem);
                device_release_driver(&cxlr->dev);
                 * The lock was dropped, so need to revalidate that the reset is
                 * still pending.
                 */
-               if (p->state == CXL_CONFIG_RESET_PENDING)
+               if (p->state == CXL_CONFIG_RESET_PENDING) {
                        rc = cxl_region_decode_reset(cxlr, p->interleave_ways);
+                       /*
+                        * Revert to committed since there may still be active
+                        * decoders associated with this region, or move forward
+                        * to active to mark the reset successful
+                        */
+                       if (rc)
+                               p->state = CXL_CONFIG_COMMIT;
+                       else
+                               p->state = CXL_CONFIG_ACTIVE;
+               }
        }
 
-       if (rc)
-               goto out;
-
-       if (commit)
-               p->state = CXL_CONFIG_COMMIT;
-       else if (p->state == CXL_CONFIG_RESET_PENDING)
-               p->state = CXL_CONFIG_ACTIVE;
-
 out:
        up_write(&cxl_region_rwsem);