svn commit: r310298 - head/sys/cam/ctl

Alexander Motin mav at FreeBSD.org
Mon Dec 19 21:27:19 UTC 2016


Author: mav
Date: Mon Dec 19 21:27:18 2016
New Revision: 310298
URL: https://svnweb.freebsd.org/changeset/base/310298

Log:
  Improve error handling when I/O split between several BIOs.
  
  If we get several error codes, handle one with lowest offset.
  
  MFC after:	2 weeks

Modified:
  head/sys/cam/ctl/ctl_backend_block.c

Modified: head/sys/cam/ctl/ctl_backend_block.c
==============================================================================
--- head/sys/cam/ctl/ctl_backend_block.c	Mon Dec 19 20:34:05 2016	(r310297)
+++ head/sys/cam/ctl/ctl_backend_block.c	Mon Dec 19 21:27:18 2016	(r310298)
@@ -201,7 +201,8 @@ struct ctl_be_block_io {
 	int				num_bios_sent;
 	int				num_bios_done;
 	int				send_complete;
-	int				num_errors;
+	int				first_error;
+	uint64_t			first_error_offset;
 	struct bintime			ds_t0;
 	devstat_tag_type		ds_tag_type;
 	devstat_trans_flags		ds_trans_type;
@@ -486,8 +487,12 @@ ctl_be_block_biodone(struct bio *bio)
 
 	error = bio->bio_error;
 	mtx_lock(&be_lun->io_lock);
-	if (error != 0)
-		beio->num_errors++;
+	if (error != 0 &&
+	    (beio->first_error == 0 ||
+	     bio->bio_offset < beio->first_error_offset)) {
+		beio->first_error = error;
+		beio->first_error_offset = bio->bio_offset;
+	}
 
 	beio->num_bios_done++;
 
@@ -520,7 +525,8 @@ ctl_be_block_biodone(struct bio *bio)
 	 * If there are any errors from the backing device, we fail the
 	 * entire I/O with a medium error.
 	 */
-	if (beio->num_errors > 0) {
+	error = beio->first_error;
+	if (error != 0) {
 		if (error == EOPNOTSUPP) {
 			ctl_set_invalid_opcode(&io->scsiio);
 		} else if (error == ENOSPC || error == EDQUOT) {


More information about the svn-src-head mailing list