diff options
Diffstat (limited to 'drivers/target/target_core_pr.c')
| -rw-r--r-- | drivers/target/target_core_pr.c | 91 | 
1 files changed, 47 insertions, 44 deletions
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index d1ae4c5c3ff..df357862286 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c @@ -474,7 +474,7 @@ static int core_scsi3_pr_seq_non_holder(  	 * statement.  	 */  	if (!ret && !other_cdb) { -		pr_debug("Allowing explict CDB: 0x%02x for %s" +		pr_debug("Allowing explicit CDB: 0x%02x for %s"  			" reservation holder\n", cdb[0],  			core_scsi3_pr_dump_type(pr_reg_type)); @@ -507,7 +507,7 @@ static int core_scsi3_pr_seq_non_holder(  			 */  			if (!registered_nexus) { -				pr_debug("Allowing implict CDB: 0x%02x" +				pr_debug("Allowing implicit CDB: 0x%02x"  					" for %s reservation on unregistered"  					" nexus\n", cdb[0],  					core_scsi3_pr_dump_type(pr_reg_type)); @@ -522,7 +522,7 @@ static int core_scsi3_pr_seq_non_holder(  			 * allow commands from registered nexuses.  			 */ -			pr_debug("Allowing implict CDB: 0x%02x for %s" +			pr_debug("Allowing implicit CDB: 0x%02x for %s"  				" reservation\n", cdb[0],  				core_scsi3_pr_dump_type(pr_reg_type)); @@ -675,7 +675,7 @@ static struct t10_pr_registration *__core_scsi3_alloc_registration(  	spin_lock(&dev->se_port_lock);  	list_for_each_entry_safe(port, port_tmp, &dev->dev_sep_list, sep_list) {  		atomic_inc(&port->sep_tg_pt_ref_cnt); -		smp_mb__after_atomic_inc(); +		smp_mb__after_atomic();  		spin_unlock(&dev->se_port_lock);  		spin_lock_bh(&port->sep_alua_lock); @@ -683,7 +683,7 @@ static struct t10_pr_registration *__core_scsi3_alloc_registration(  					alua_port_list) {  			/*  			 * This pointer will be NULL for demo mode MappedLUNs -			 * that have not been make explict via a ConfigFS +			 * that have not been make explicit via a ConfigFS  			 * MappedLUN group for the SCSI Initiator Node ACL.  			 */  			if (!deve_tmp->se_lun_acl) @@ -710,7 +710,7 @@ static struct t10_pr_registration *__core_scsi3_alloc_registration(  				continue;  			atomic_inc(&deve_tmp->pr_ref_count); -			smp_mb__after_atomic_inc(); +			smp_mb__after_atomic();  			spin_unlock_bh(&port->sep_alua_lock);  			/*  			 * Grab a configfs group dependency that is released @@ -723,9 +723,9 @@ static struct t10_pr_registration *__core_scsi3_alloc_registration(  				pr_err("core_scsi3_lunacl_depend"  						"_item() failed\n");  				atomic_dec(&port->sep_tg_pt_ref_cnt); -				smp_mb__after_atomic_dec(); +				smp_mb__after_atomic();  				atomic_dec(&deve_tmp->pr_ref_count); -				smp_mb__after_atomic_dec(); +				smp_mb__after_atomic();  				goto out;  			}  			/* @@ -740,9 +740,9 @@ static struct t10_pr_registration *__core_scsi3_alloc_registration(  						sa_res_key, all_tg_pt, aptpl);  			if (!pr_reg_atp) {  				atomic_dec(&port->sep_tg_pt_ref_cnt); -				smp_mb__after_atomic_dec(); +				smp_mb__after_atomic();  				atomic_dec(&deve_tmp->pr_ref_count); -				smp_mb__after_atomic_dec(); +				smp_mb__after_atomic();  				core_scsi3_lunacl_undepend_item(deve_tmp);  				goto out;  			} @@ -755,7 +755,7 @@ static struct t10_pr_registration *__core_scsi3_alloc_registration(  		spin_lock(&dev->se_port_lock);  		atomic_dec(&port->sep_tg_pt_ref_cnt); -		smp_mb__after_atomic_dec(); +		smp_mb__after_atomic();  	}  	spin_unlock(&dev->se_port_lock); @@ -1110,7 +1110,7 @@ static struct t10_pr_registration *__core_scsi3_locate_pr_reg(  					continue;  			}  			atomic_inc(&pr_reg->pr_res_holders); -			smp_mb__after_atomic_inc(); +			smp_mb__after_atomic();  			spin_unlock(&pr_tmpl->registration_lock);  			return pr_reg;  		} @@ -1125,7 +1125,7 @@ static struct t10_pr_registration *__core_scsi3_locate_pr_reg(  			continue;  		atomic_inc(&pr_reg->pr_res_holders); -		smp_mb__after_atomic_inc(); +		smp_mb__after_atomic();  		spin_unlock(&pr_tmpl->registration_lock);  		return pr_reg;  	} @@ -1155,10 +1155,10 @@ static struct t10_pr_registration *core_scsi3_locate_pr_reg(  static void core_scsi3_put_pr_reg(struct t10_pr_registration *pr_reg)  {  	atomic_dec(&pr_reg->pr_res_holders); -	smp_mb__after_atomic_dec(); +	smp_mb__after_atomic();  } -static int core_scsi3_check_implict_release( +static int core_scsi3_check_implicit_release(  	struct se_device *dev,  	struct t10_pr_registration *pr_reg)  { @@ -1174,7 +1174,7 @@ static int core_scsi3_check_implict_release(  	}  	if (pr_res_holder == pr_reg) {  		/* -		 * Perform an implict RELEASE if the registration that +		 * Perform an implicit RELEASE if the registration that  		 * is being released is holding the reservation.  		 *  		 * From spc4r17, section 5.7.11.1: @@ -1192,7 +1192,7 @@ static int core_scsi3_check_implict_release(  		 * For 'All Registrants' reservation types, all existing  		 * registrations are still processed as reservation holders  		 * in core_scsi3_pr_seq_non_holder() after the initial -		 * reservation holder is implictly released here. +		 * reservation holder is implicitly released here.  		 */  	} else if (pr_reg->pr_reg_all_tg_pt &&  		  (!strcmp(pr_res_holder->pr_reg_nacl->initiatorname, @@ -1349,7 +1349,7 @@ static void core_scsi3_tpg_undepend_item(struct se_portal_group *tpg)  			&tpg->tpg_group.cg_item);  	atomic_dec(&tpg->tpg_pr_ref_count); -	smp_mb__after_atomic_dec(); +	smp_mb__after_atomic();  }  static int core_scsi3_nodeacl_depend_item(struct se_node_acl *nacl) @@ -1369,7 +1369,7 @@ static void core_scsi3_nodeacl_undepend_item(struct se_node_acl *nacl)  	if (nacl->dynamic_node_acl) {  		atomic_dec(&nacl->acl_pr_ref_count); -		smp_mb__after_atomic_dec(); +		smp_mb__after_atomic();  		return;  	} @@ -1377,7 +1377,7 @@ static void core_scsi3_nodeacl_undepend_item(struct se_node_acl *nacl)  			&nacl->acl_group.cg_item);  	atomic_dec(&nacl->acl_pr_ref_count); -	smp_mb__after_atomic_dec(); +	smp_mb__after_atomic();  }  static int core_scsi3_lunacl_depend_item(struct se_dev_entry *se_deve) @@ -1408,7 +1408,7 @@ static void core_scsi3_lunacl_undepend_item(struct se_dev_entry *se_deve)  	 */  	if (!lun_acl) {  		atomic_dec(&se_deve->pr_ref_count); -		smp_mb__after_atomic_dec(); +		smp_mb__after_atomic();  		return;  	}  	nacl = lun_acl->se_lun_nacl; @@ -1418,7 +1418,7 @@ static void core_scsi3_lunacl_undepend_item(struct se_dev_entry *se_deve)  			&lun_acl->se_lun_group.cg_item);  	atomic_dec(&se_deve->pr_ref_count); -	smp_mb__after_atomic_dec(); +	smp_mb__after_atomic();  }  static sense_reason_t @@ -1552,14 +1552,14 @@ core_scsi3_decode_spec_i_port(  				continue;  			atomic_inc(&tmp_tpg->tpg_pr_ref_count); -			smp_mb__after_atomic_inc(); +			smp_mb__after_atomic();  			spin_unlock(&dev->se_port_lock);  			if (core_scsi3_tpg_depend_item(tmp_tpg)) {  				pr_err(" core_scsi3_tpg_depend_item()"  					" for tmp_tpg\n");  				atomic_dec(&tmp_tpg->tpg_pr_ref_count); -				smp_mb__after_atomic_dec(); +				smp_mb__after_atomic();  				ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;  				goto out_unmap;  			} @@ -1573,7 +1573,7 @@ core_scsi3_decode_spec_i_port(  						tmp_tpg, i_str);  			if (dest_node_acl) {  				atomic_inc(&dest_node_acl->acl_pr_ref_count); -				smp_mb__after_atomic_inc(); +				smp_mb__after_atomic();  			}  			spin_unlock_irq(&tmp_tpg->acl_node_lock); @@ -1587,7 +1587,7 @@ core_scsi3_decode_spec_i_port(  				pr_err("configfs_depend_item() failed"  					" for dest_node_acl->acl_group\n");  				atomic_dec(&dest_node_acl->acl_pr_ref_count); -				smp_mb__after_atomic_dec(); +				smp_mb__after_atomic();  				core_scsi3_tpg_undepend_item(tmp_tpg);  				ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;  				goto out_unmap; @@ -1647,7 +1647,7 @@ core_scsi3_decode_spec_i_port(  			pr_err("core_scsi3_lunacl_depend_item()"  					" failed\n");  			atomic_dec(&dest_se_deve->pr_ref_count); -			smp_mb__after_atomic_dec(); +			smp_mb__after_atomic();  			core_scsi3_nodeacl_undepend_item(dest_node_acl);  			core_scsi3_tpg_undepend_item(dest_tpg);  			ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; @@ -2009,7 +2009,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,  	struct t10_reservation *pr_tmpl = &dev->t10_pr;  	unsigned char isid_buf[PR_REG_ISID_LEN], *isid_ptr = NULL;  	sense_reason_t ret = TCM_NO_SENSE; -	int pr_holder = 0; +	int pr_holder = 0, type;  	if (!se_sess || !se_lun) {  		pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n"); @@ -2125,12 +2125,13 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,  		/*  		 * sa_res_key=0 Unregister Reservation Key for registered I_T Nexus.  		 */ -		pr_holder = core_scsi3_check_implict_release( +		pr_holder = core_scsi3_check_implicit_release(  				cmd->se_dev, pr_reg);  		if (pr_holder < 0) {  			ret = TCM_RESERVATION_CONFLICT;  			goto out;  		} +		type = pr_reg->pr_res_type;  		spin_lock(&pr_tmpl->registration_lock);  		/* @@ -2161,6 +2162,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,  		 * Release the calling I_T Nexus registration now..  		 */  		__core_scsi3_free_registration(cmd->se_dev, pr_reg, NULL, 1); +		pr_reg = NULL;  		/*  		 * From spc4r17, section 5.7.11.3 Unregistering @@ -2174,8 +2176,8 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,  		 * RESERVATIONS RELEASED.  		 */  		if (pr_holder && -		    (pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY || -		     pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY)) { +		    (type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY || +		     type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY)) {  			list_for_each_entry(pr_reg_p,  					&pr_tmpl->registration_list,  					pr_reg_list) { @@ -2194,7 +2196,8 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,  	ret = core_scsi3_update_and_write_aptpl(dev, aptpl);  out: -	core_scsi3_put_pr_reg(pr_reg); +	if (pr_reg) +		core_scsi3_put_pr_reg(pr_reg);  	return ret;  } @@ -2402,7 +2405,7 @@ static void __core_scsi3_complete_pro_release(  	struct se_device *dev,  	struct se_node_acl *se_nacl,  	struct t10_pr_registration *pr_reg, -	int explict) +	int explicit)  {  	struct target_core_fabric_ops *tfo = se_nacl->se_tpg->se_tpg_tfo;  	char i_buf[PR_REG_ISID_ID_LEN]; @@ -2416,7 +2419,7 @@ static void __core_scsi3_complete_pro_release(  	pr_debug("SPC-3 PR [%s] Service Action: %s RELEASE cleared"  		" reservation holder TYPE: %s ALL_TG_PT: %d\n", -		tfo->get_fabric_name(), (explict) ? "explict" : "implict", +		tfo->get_fabric_name(), (explicit) ? "explicit" : "implicit",  		core_scsi3_pr_dump_type(pr_reg->pr_res_type),  		(pr_reg->pr_reg_all_tg_pt) ? 1 : 0);  	pr_debug("SPC-3 PR [%s] RELEASE Node: %s%s\n", @@ -2692,7 +2695,7 @@ static void __core_scsi3_complete_pro_preempt(  	memset(i_buf, 0, PR_REG_ISID_ID_LEN);  	core_pr_dump_initiator_port(pr_reg, i_buf, PR_REG_ISID_ID_LEN);  	/* -	 * Do an implict RELEASE of the existing reservation. +	 * Do an implicit RELEASE of the existing reservation.  	 */  	if (dev->dev_pr_res_holder)  		__core_scsi3_complete_pro_release(dev, nacl, @@ -2845,7 +2848,7 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key,  				 * 5.7.11.4 Preempting, Table 52 and Figure 7.  				 *  				 * For a ZERO SA Reservation key, release -				 * all other registrations and do an implict +				 * all other registrations and do an implicit  				 * release of active persistent reservation.  				 *  				 * For a non-ZERO SA Reservation key, only @@ -3165,14 +3168,14 @@ core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,  			continue;  		atomic_inc(&dest_se_tpg->tpg_pr_ref_count); -		smp_mb__after_atomic_inc(); +		smp_mb__after_atomic();  		spin_unlock(&dev->se_port_lock);  		if (core_scsi3_tpg_depend_item(dest_se_tpg)) {  			pr_err("core_scsi3_tpg_depend_item() failed"  				" for dest_se_tpg\n");  			atomic_dec(&dest_se_tpg->tpg_pr_ref_count); -			smp_mb__after_atomic_dec(); +			smp_mb__after_atomic();  			ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;  			goto out_put_pr_reg;  		} @@ -3270,7 +3273,7 @@ after_iport_check:  				initiator_str);  	if (dest_node_acl) {  		atomic_inc(&dest_node_acl->acl_pr_ref_count); -		smp_mb__after_atomic_inc(); +		smp_mb__after_atomic();  	}  	spin_unlock_irq(&dest_se_tpg->acl_node_lock); @@ -3286,7 +3289,7 @@ after_iport_check:  		pr_err("core_scsi3_nodeacl_depend_item() for"  			" dest_node_acl\n");  		atomic_dec(&dest_node_acl->acl_pr_ref_count); -		smp_mb__after_atomic_dec(); +		smp_mb__after_atomic();  		dest_node_acl = NULL;  		ret = TCM_INVALID_PARAMETER_LIST;  		goto out; @@ -3311,7 +3314,7 @@ after_iport_check:  	if (core_scsi3_lunacl_depend_item(dest_se_deve)) {  		pr_err("core_scsi3_lunacl_depend_item() failed\n");  		atomic_dec(&dest_se_deve->pr_ref_count); -		smp_mb__after_atomic_dec(); +		smp_mb__after_atomic();  		dest_se_deve = NULL;  		ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;  		goto out; @@ -3877,7 +3880,7 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd)  		add_desc_len = 0;  		atomic_inc(&pr_reg->pr_res_holders); -		smp_mb__after_atomic_inc(); +		smp_mb__after_atomic();  		spin_unlock(&pr_tmpl->registration_lock);  		/*  		 * Determine expected length of $FABRIC_MOD specific @@ -3891,7 +3894,7 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd)  				" out of buffer: %d\n", cmd->data_length);  			spin_lock(&pr_tmpl->registration_lock);  			atomic_dec(&pr_reg->pr_res_holders); -			smp_mb__after_atomic_dec(); +			smp_mb__after_atomic();  			break;  		}  		/* @@ -3953,7 +3956,7 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd)  		spin_lock(&pr_tmpl->registration_lock);  		atomic_dec(&pr_reg->pr_res_holders); -		smp_mb__after_atomic_dec(); +		smp_mb__after_atomic();  		/*  		 * Set the ADDITIONAL DESCRIPTOR LENGTH  		 */  | 
