scsi: Refactor scsi sense interpreting code
So that it can be reused outside of iscsi.c. Also update MAINTAINERS to include the new files in SCSI section. Signed-off-by: Fam Zheng <famz@redhat.com> Message-Id: <20170821141008.19383-2-famz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									b07fbce634
								
							
						
					
					
						commit
						2875135807
					
				| @ -968,7 +968,9 @@ SCSI | ||||
| M: Paolo Bonzini <pbonzini@redhat.com> | ||||
| S: Supported | ||||
| F: include/hw/scsi/* | ||||
| F: include/scsi/* | ||||
| F: hw/scsi/* | ||||
| F: util/scsi* | ||||
| F: tests/virtio-scsi-test.c | ||||
| T: git git://github.com/bonzini/qemu.git scsi-next | ||||
| 
 | ||||
|  | ||||
| @ -40,6 +40,7 @@ | ||||
| #include "qmp-commands.h" | ||||
| #include "qapi/qmp/qstring.h" | ||||
| #include "crypto/secret.h" | ||||
| #include "scsi/scsi.h" | ||||
| 
 | ||||
| #include <iscsi/iscsi.h> | ||||
| #include <iscsi/scsi-lowlevel.h> | ||||
| @ -209,47 +210,9 @@ static inline unsigned exp_random(double mean) | ||||
| 
 | ||||
| static int iscsi_translate_sense(struct scsi_sense *sense) | ||||
| { | ||||
|     int ret; | ||||
| 
 | ||||
|     switch (sense->key) { | ||||
|     case SCSI_SENSE_NOT_READY: | ||||
|         return -EBUSY; | ||||
|     case SCSI_SENSE_DATA_PROTECTION: | ||||
|         return -EACCES; | ||||
|     case SCSI_SENSE_COMMAND_ABORTED: | ||||
|         return -ECANCELED; | ||||
|     case SCSI_SENSE_ILLEGAL_REQUEST: | ||||
|         /* Parse ASCQ */ | ||||
|         break; | ||||
|     default: | ||||
|         return -EIO; | ||||
|     } | ||||
|     switch (sense->ascq) { | ||||
|     case SCSI_SENSE_ASCQ_PARAMETER_LIST_LENGTH_ERROR: | ||||
|     case SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE: | ||||
|     case SCSI_SENSE_ASCQ_INVALID_FIELD_IN_CDB: | ||||
|     case SCSI_SENSE_ASCQ_INVALID_FIELD_IN_PARAMETER_LIST: | ||||
|         ret = -EINVAL; | ||||
|         break; | ||||
|     case SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE: | ||||
|         ret = -ENOSPC; | ||||
|         break; | ||||
|     case SCSI_SENSE_ASCQ_LOGICAL_UNIT_NOT_SUPPORTED: | ||||
|         ret = -ENOTSUP; | ||||
|         break; | ||||
|     case SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT: | ||||
|     case SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_CLOSED: | ||||
|     case SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_OPEN: | ||||
|         ret = -ENOMEDIUM; | ||||
|         break; | ||||
|     case SCSI_SENSE_ASCQ_WRITE_PROTECTED: | ||||
|         ret = -EACCES; | ||||
|         break; | ||||
|     default: | ||||
|         ret = -EIO; | ||||
|         break; | ||||
|     } | ||||
|     return ret; | ||||
|     return - scsi_sense_to_errno(sense->key, | ||||
|                                  (sense->ascq & 0xFF00) >> 8, | ||||
|                                  sense->ascq & 0xFF); | ||||
| } | ||||
| 
 | ||||
| /* Called (via iscsi_service) with QemuMutex held.  */ | ||||
|  | ||||
							
								
								
									
										19
									
								
								include/scsi/scsi.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								include/scsi/scsi.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| /*
 | ||||
|  *  SCSI helpers | ||||
|  * | ||||
|  *  Copyright 2017 Red Hat, Inc. | ||||
|  * | ||||
|  *  Authors: | ||||
|  *   Fam Zheng <famz@redhat.com> | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU General Public License as published by the Free | ||||
|  * Software Foundation; either version 2 of the License, or (at your option) | ||||
|  * any later version. | ||||
|  */ | ||||
| #ifndef QEMU_SCSI_H | ||||
| #define QEMU_SCSI_H | ||||
| 
 | ||||
| int scsi_sense_to_errno(int key, int asc, int ascq); | ||||
| 
 | ||||
| #endif | ||||
| @ -45,3 +45,4 @@ util-obj-y += qht.o | ||||
| util-obj-y += range.o | ||||
| util-obj-y += stats64.o | ||||
| util-obj-y += systemd.o | ||||
| util-obj-y += scsi.o | ||||
|  | ||||
							
								
								
									
										52
									
								
								util/scsi.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								util/scsi.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | ||||
| /*
 | ||||
|  *  SCSI helpers | ||||
|  * | ||||
|  *  Copyright 2017 Red Hat, Inc. | ||||
|  * | ||||
|  *  Authors: | ||||
|  *   Fam Zheng <famz@redhat.com> | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU General Public License as published by the Free | ||||
|  * Software Foundation; either version 2 of the License, or (at your option) | ||||
|  * any later version. | ||||
|  */ | ||||
| 
 | ||||
| #include "qemu/osdep.h" | ||||
| #include "scsi/scsi.h" | ||||
| 
 | ||||
| int scsi_sense_to_errno(int key, int asc, int ascq) | ||||
| { | ||||
|     switch (key) { | ||||
|     case 0x02: /* NOT READY */ | ||||
|         return EBUSY; | ||||
|     case 0x07: /* DATA PROTECTION */ | ||||
|         return EACCES; | ||||
|     case 0x0b: /* COMMAND ABORTED */ | ||||
|         return ECANCELED; | ||||
|     case 0x05: /* ILLEGAL REQUEST */ | ||||
|         /* Parse ASCQ */ | ||||
|         break; | ||||
|     default: | ||||
|         return EIO; | ||||
|     } | ||||
|     switch ((asc << 8) | ascq) { | ||||
|     case 0x1a00: /* PARAMETER LIST LENGTH ERROR */ | ||||
|     case 0x2000: /* INVALID OPERATION CODE */ | ||||
|     case 0x2400: /* INVALID FIELD IN CDB */ | ||||
|     case 0x2600: /* INVALID FIELD IN PARAMETER LIST */ | ||||
|         return EINVAL; | ||||
|     case 0x2100: /* LBA OUT OF RANGE */ | ||||
|         return ENOSPC; | ||||
|     case 0x2500: /* LOGICAL UNIT NOT SUPPORTED */ | ||||
|         return ENOTSUP; | ||||
|     case 0x3a00: /* MEDIUM NOT PRESENT */ | ||||
|     case 0x3a01: /* MEDIUM NOT PRESENT TRAY CLOSED */ | ||||
|     case 0x3a02: /* MEDIUM NOT PRESENT TRAY OPEN */ | ||||
|         return ENOMEDIUM; | ||||
|     case 0x2700: /* WRITE PROTECTED */ | ||||
|         return EACCES; | ||||
|     default: | ||||
|         return EIO; | ||||
|     } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Fam Zheng
						Fam Zheng