Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 868ed5a5 authored by Damien Le Moal's avatar Damien Le Moal Committed by Martin K. Petersen
Browse files

scsi: sd_zbc: Do not write lock zones for reset



Resetting a zone write pointer is equivalent to discarding sectors:
after a reset, the zone sectors will contain zeros (or the format
pattern). So there is no need for mutual exclusion between a zone reset
and write. Similarly to discard, make it the responsability of the user
to properly synchronize between reset and write (as is done now for
discard and write).

Signed-off-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent f7053240
Loading
Loading
Loading
Loading
+16 −26
Original line number Original line Diff line number Diff line
@@ -237,7 +237,6 @@ int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
	struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
	struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
	sector_t sector = blk_rq_pos(rq);
	sector_t sector = blk_rq_pos(rq);
	sector_t block = sectors_to_logical(sdkp->device, sector);
	sector_t block = sectors_to_logical(sdkp->device, sector);
	unsigned int zno = block >> sdkp->zone_shift;


	if (!sd_is_zoned(sdkp))
	if (!sd_is_zoned(sdkp))
		/* Not a zoned device */
		/* Not a zoned device */
@@ -250,11 +249,6 @@ int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
		/* Unaligned request */
		/* Unaligned request */
		return BLKPREP_KILL;
		return BLKPREP_KILL;


	/* Do not allow concurrent reset and writes */
	if (sdkp->zones_wlock &&
	    test_and_set_bit(zno, sdkp->zones_wlock))
		return BLKPREP_DEFER;

	cmd->cmd_len = 16;
	cmd->cmd_len = 16;
	memset(cmd->cmnd, 0, cmd->cmd_len);
	memset(cmd->cmnd, 0, cmd->cmd_len);
	cmd->cmnd[0] = ZBC_OUT;
	cmd->cmnd[0] = ZBC_OUT;
@@ -324,29 +318,28 @@ void sd_zbc_complete(struct scsi_cmnd *cmd,
	struct request *rq = cmd->request;
	struct request *rq = cmd->request;


	switch (req_op(rq)) {
	switch (req_op(rq)) {
	case REQ_OP_WRITE:
	case REQ_OP_WRITE_SAME:
	case REQ_OP_ZONE_RESET:
	case REQ_OP_ZONE_RESET:


		/* Unlock the zone */
		if (result &&
		sd_zbc_write_unlock_zone(cmd);
		    sshdr->sense_key == ILLEGAL_REQUEST &&

		    sshdr->asc == 0x24)
		if (!result ||
		    sshdr->sense_key != ILLEGAL_REQUEST)
			break;

		switch (sshdr->asc) {
		case 0x24:
			/*
			/*
			 * INVALID FIELD IN CDB error: For a zone reset,
			 * INVALID FIELD IN CDB error: reset of a conventional
			 * this means that a reset of a conventional
			 * zone was attempted. Nothing to worry about, so be
			 * zone was attempted. Nothing to worry about in
			 * quiet about the error.
			 * this case, so be quiet about the error.
			 */
			 */
			if (req_op(rq) == REQ_OP_ZONE_RESET)
			rq->rq_flags |= RQF_QUIET;
			rq->rq_flags |= RQF_QUIET;
		break;
		break;
		case 0x21:

	case REQ_OP_WRITE:
	case REQ_OP_WRITE_SAME:

		/* Unlock the zone */
		sd_zbc_write_unlock_zone(cmd);

		if (result &&
		    sshdr->sense_key == ILLEGAL_REQUEST &&
		    sshdr->asc == 0x21)
			/*
			/*
			 * INVALID ADDRESS FOR WRITE error: It is unlikely that
			 * INVALID ADDRESS FOR WRITE error: It is unlikely that
			 * retrying write requests failed with any kind of
			 * retrying write requests failed with any kind of
@@ -354,9 +347,6 @@ void sd_zbc_complete(struct scsi_cmnd *cmd,
			 */
			 */
			cmd->allowed = 0;
			cmd->allowed = 0;
		break;
		break;
		}

		break;


	case REQ_OP_ZONE_REPORT:
	case REQ_OP_ZONE_REPORT: