DEF_CONFIGFS_ATTRIB_SHOW(emulate_tpws);
 DEF_CONFIGFS_ATTRIB_SHOW(emulate_caw);
 DEF_CONFIGFS_ATTRIB_SHOW(emulate_3pc);
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_pr);
 DEF_CONFIGFS_ATTRIB_SHOW(pi_prot_type);
 DEF_CONFIGFS_ATTRIB_SHOW(hw_pi_prot_type);
 DEF_CONFIGFS_ATTRIB_SHOW(pi_prot_format);
 DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_fua_write);
 DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_caw);
 DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_3pc);
+DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_pr);
 DEF_CONFIGFS_ATTRIB_STORE_BOOL(enforce_pr_isids);
 DEF_CONFIGFS_ATTRIB_STORE_BOOL(is_nonrot);
 
 CONFIGFS_ATTR(, emulate_tpws);
 CONFIGFS_ATTR(, emulate_caw);
 CONFIGFS_ATTR(, emulate_3pc);
+CONFIGFS_ATTR(, emulate_pr);
 CONFIGFS_ATTR(, pi_prot_type);
 CONFIGFS_ATTR_RO(, hw_pi_prot_type);
 CONFIGFS_ATTR(, pi_prot_format);
        &attr_emulate_tpws,
        &attr_emulate_caw,
        &attr_emulate_3pc,
+       &attr_emulate_pr,
        &attr_pi_prot_type,
        &attr_hw_pi_prot_type,
        &attr_pi_prot_format,
        struct se_device *dev = pr_to_dev(item);
        int ret;
 
+       if (!dev->dev_attrib.emulate_pr)
+               return sprintf(page, "SPC_RESERVATIONS_DISABLED\n");
+
        if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
                return sprintf(page, "Passthrough\n");
 
 {
        struct se_device *dev = pr_to_dev(item);
 
+       if (!dev->dev_attrib.emulate_pr)
+               return sprintf(page, "SPC_RESERVATIONS_DISABLED\n");
        if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
                return sprintf(page, "SPC_PASSTHROUGH\n");
-       else if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
+       if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
                return sprintf(page, "SPC2_RESERVATIONS\n");
-       else
-               return sprintf(page, "SPC3_PERSISTENT_RESERVATIONS\n");
+
+       return sprintf(page, "SPC3_PERSISTENT_RESERVATIONS\n");
 }
 
 static ssize_t target_pr_res_aptpl_active_show(struct config_item *item,
 {
        struct se_device *dev = pr_to_dev(item);
 
-       if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
+       if (!dev->dev_attrib.emulate_pr ||
+           (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR))
                return 0;
 
        return sprintf(page, "APTPL Bit Status: %s\n",
 {
        struct se_device *dev = pr_to_dev(item);
 
-       if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
+       if (!dev->dev_attrib.emulate_pr ||
+           (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR))
                return 0;
 
        return sprintf(page, "Ready to process PR APTPL metadata..\n");
        u16 tpgt = 0;
        u8 type = 0;
 
-       if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
+       if (!dev->dev_attrib.emulate_pr ||
+           (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR))
                return count;
        if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
                return count;
 
        dev->dev_attrib.emulate_tpws = DA_EMULATE_TPWS;
        dev->dev_attrib.emulate_caw = DA_EMULATE_CAW;
        dev->dev_attrib.emulate_3pc = DA_EMULATE_3PC;
+       dev->dev_attrib.emulate_pr = DA_EMULATE_PR;
        dev->dev_attrib.pi_prot_type = TARGET_DIF_TYPE0_PROT;
        dev->dev_attrib.enforce_pr_isids = DA_ENFORCE_PR_ISIDS;
        dev->dev_attrib.force_pr_aptpl = DA_FORCE_PR_APTPL;
                return TCM_NO_SENSE;
        }
 
+       /*
+        * With emulate_pr disabled, all reservation requests should fail,
+        * regardless of whether or not TRANSPORT_FLAG_PASSTHROUGH_PGR is set.
+        */
+       if (!dev->dev_attrib.emulate_pr &&
+           ((cdb[0] == PERSISTENT_RESERVE_IN) ||
+            (cdb[0] == PERSISTENT_RESERVE_OUT) ||
+            (cdb[0] == RELEASE || cdb[0] == RELEASE_10) ||
+            (cdb[0] == RESERVE || cdb[0] == RESERVE_10))) {
+               return TCM_UNSUPPORTED_SCSI_OPCODE;
+       }
+
        /*
         * For PERSISTENT RESERVE IN/OUT, RELEASE, and RESERVE we need to
         * emulate the response, since tcmu does not have the information