* [PATCH v3 part3 1/7] sg_io: complete transition to per-class lists of allowed commands
[not found] <1369317575-4236-1-git-send-email-pbonzini@redhat.com>
@ 2013-05-23 13:59 ` Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 2/7] sg_io: create separate entries for conflicting commands Paolo Bonzini
` (5 subsequent siblings)
6 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2013-05-23 13:59 UTC (permalink / raw)
To: linux-kernel; +Cc: tj, James E.J. Bottomley, linux-scsi, Jens Axboe
After this patch, a few commands are forbidden for devices of type other than
TYPE_ROM, where they are reserved, vendor-specific. This avoids that
future version of the standards introduce unwanted conficts.
One command (READ CAPACITY) was listed twice in the old table (once
as READ_CAPACITY, once as GPCMD_READ_CDVD_CAPACITY), hence the new table
has one entry less than the old one. The old table has 72 entries, the
new one has 71.
Note that TYPE_SCANNER is not subject to the whitelist, so it is not
included at all.
Of course, checkpatch hates this table. It has long lines and
non-standard spacing. IMO the improved readability trumps the problems
reported by checkpatch.
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: linux-scsi@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/scsi_ioctl.c | 207 +++++++++++++++++++++++++++++++---------------------
include/scsi/scsi.h | 3 +
2 files changed, 128 insertions(+), 82 deletions(-)
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
index 0af98fe..5d2143f 100644
--- a/block/scsi_ioctl.c
+++ b/block/scsi_ioctl.c
@@ -116,88 +116,131 @@ static int sg_emulated_host(struct request_queue *q, int __user *p)
static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
{
-#define sgio_bitmap_set(cmd, rw) \
- filter->rw##_ok[(cmd)] = ~0;
-
- /* Basic read-only commands */
- sgio_bitmap_set(TEST_UNIT_READY, read);
- sgio_bitmap_set(REQUEST_SENSE, read);
- sgio_bitmap_set(READ_6, read);
- sgio_bitmap_set(READ_10, read);
- sgio_bitmap_set(READ_12, read);
- sgio_bitmap_set(READ_16, read);
- sgio_bitmap_set(READ_BUFFER, read);
- sgio_bitmap_set(READ_DEFECT_DATA, read);
- sgio_bitmap_set(READ_CAPACITY, read);
- sgio_bitmap_set(READ_LONG, read);
- sgio_bitmap_set(INQUIRY, read);
- sgio_bitmap_set(MODE_SENSE, read);
- sgio_bitmap_set(MODE_SENSE_10, read);
- sgio_bitmap_set(LOG_SENSE, read);
- sgio_bitmap_set(START_STOP, read);
- sgio_bitmap_set(GPCMD_VERIFY_10, read);
- sgio_bitmap_set(VERIFY_16, read);
- sgio_bitmap_set(REPORT_LUNS, read);
- sgio_bitmap_set(SERVICE_ACTION_IN, read);
- sgio_bitmap_set(RECEIVE_DIAGNOSTIC, read);
- sgio_bitmap_set(MAINTENANCE_IN, read);
- sgio_bitmap_set(GPCMD_READ_BUFFER_CAPACITY, read);
-
- /* Audio CD commands */
- sgio_bitmap_set(GPCMD_PLAY_CD, read);
- sgio_bitmap_set(GPCMD_PLAY_AUDIO_10, read);
- sgio_bitmap_set(GPCMD_PLAY_AUDIO_MSF, read);
- sgio_bitmap_set(GPCMD_PLAY_AUDIO_TI, read);
- sgio_bitmap_set(GPCMD_PAUSE_RESUME, read);
-
- /* CD/DVD data reading */
- sgio_bitmap_set(GPCMD_READ_CD, read);
- sgio_bitmap_set(GPCMD_READ_CD_MSF, read);
- sgio_bitmap_set(GPCMD_READ_DISC_INFO, read);
- sgio_bitmap_set(GPCMD_READ_CDVD_CAPACITY, read);
- sgio_bitmap_set(GPCMD_READ_DVD_STRUCTURE, read);
- sgio_bitmap_set(GPCMD_READ_HEADER, read);
- sgio_bitmap_set(GPCMD_READ_TRACK_RZONE_INFO, read);
- sgio_bitmap_set(GPCMD_READ_SUBCHANNEL, read);
- sgio_bitmap_set(GPCMD_READ_TOC_PMA_ATIP, read);
- sgio_bitmap_set(GPCMD_REPORT_KEY, read);
- sgio_bitmap_set(GPCMD_SCAN, read);
- sgio_bitmap_set(GPCMD_GET_CONFIGURATION, read);
- sgio_bitmap_set(GPCMD_READ_FORMAT_CAPACITIES, read);
- sgio_bitmap_set(GPCMD_GET_EVENT_STATUS_NOTIFICATION, read);
- sgio_bitmap_set(GPCMD_GET_PERFORMANCE, read);
- sgio_bitmap_set(GPCMD_SEEK, read);
- sgio_bitmap_set(GPCMD_STOP_PLAY_SCAN, read);
-
- /* Basic writing commands */
- sgio_bitmap_set(WRITE_6, write);
- sgio_bitmap_set(WRITE_10, write);
- sgio_bitmap_set(WRITE_VERIFY, write);
- sgio_bitmap_set(WRITE_12, write);
- sgio_bitmap_set(WRITE_VERIFY_12, write);
- sgio_bitmap_set(WRITE_16, write);
- sgio_bitmap_set(WRITE_LONG, write);
- sgio_bitmap_set(WRITE_LONG_2, write);
- sgio_bitmap_set(ERASE, write);
- sgio_bitmap_set(GPCMD_MODE_SELECT_10, write);
- sgio_bitmap_set(MODE_SELECT, write);
- sgio_bitmap_set(LOG_SELECT, write);
- sgio_bitmap_set(GPCMD_BLANK, write);
- sgio_bitmap_set(GPCMD_CLOSE_TRACK, write);
- sgio_bitmap_set(GPCMD_FLUSH_CACHE, write);
- sgio_bitmap_set(GPCMD_FORMAT_UNIT, write);
- sgio_bitmap_set(GPCMD_REPAIR_RZONE_TRACK, write);
- sgio_bitmap_set(GPCMD_RESERVE_RZONE_TRACK, write);
- sgio_bitmap_set(GPCMD_SEND_DVD_STRUCTURE, write);
- sgio_bitmap_set(GPCMD_SEND_EVENT, write);
- sgio_bitmap_set(GPCMD_SEND_KEY, write);
- sgio_bitmap_set(GPCMD_SEND_OPC, write);
- sgio_bitmap_set(GPCMD_SEND_CUE_SHEET, write);
- sgio_bitmap_set(GPCMD_SET_SPEED, write);
- sgio_bitmap_set(GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL, write);
- sgio_bitmap_set(GPCMD_LOAD_UNLOAD, write);
- sgio_bitmap_set(GPCMD_SET_STREAMING, write);
- sgio_bitmap_set(GPCMD_SET_READ_AHEAD, write);
+#define sgio_bitmap_set(cmd, mask, rw) \
+ filter->rw##_ok[(cmd)] |= (mask);
+
+#define D (1u << TYPE_DISK) /* Direct Access Block Device (SBC-3) */
+#define T (1u << TYPE_TAPE) /* Sequential Access Device (SSC-3) */
+#define L (1u << TYPE_PRINTER) /* Printer Device (SSC) */
+#define P (1u << TYPE_PROCESSOR) /* Processor Device (SPC-2) */
+#define W (1u << TYPE_WORM) /* Write Once Block Device (SBC) */
+#define R (1u << TYPE_ROM) /* C/DVD Device (MMC-6) */
+#define O (1u << TYPE_MOD) /* Optical Memory Block Device (SBC) */
+#define M (1u << TYPE_MEDIUM_CHANGER) /* Media Changer Device (SMC-3) */
+#define A (1u << TYPE_RAID) /* Storage Array Device (SCC-2) */
+#define E (1u << TYPE_ENCLOSURE) /* SCSI Enclosure Services device (SES-2) */
+#define B (1u << TYPE_RBC) /* Simplified Direct-Access (Reduced Block) device (RBC) */
+#define K (1u << TYPE_OCRW) /* Optical Card Reader/Writer device (OCRW) */
+#define V (1u << TYPE_ADC) /* Automation/Device Interface device (ADC-2) */
+#define F (1u << TYPE_OSD) /* Object-based Storage Device (OSD-2) */
+
+#define C (1u << TYPE_COMM) /* Communication devices (obsolete) */
+
+ /* control, read */
+
+ sgio_bitmap_set(0x00, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* TEST UNIT READY */
+ sgio_bitmap_set(0x03, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* REQUEST SENSE */
+ sgio_bitmap_set(0x12, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* INQUIRY */
+ sgio_bitmap_set(0x1A, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* MODE SENSE(6) */
+ sgio_bitmap_set(0x1B, D|T|L| W|R|O|M|A| B|K|V|F , read); /* START STOP UNIT */
+ sgio_bitmap_set(0x1C, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* RECEIVE DIAGNOSTIC RESULTS */
+ sgio_bitmap_set(0x2B, D|T| W|R|O|M| K , read); /* SEEK(10) */
+ sgio_bitmap_set(0x3C, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* READ BUFFER */
+ sgio_bitmap_set(0x4D, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* LOG SENSE */
+ sgio_bitmap_set(0x5A, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* MODE SENSE(10) */
+ sgio_bitmap_set(0x9E, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* SERVICE ACTION IN(16) */
+ sgio_bitmap_set(0xA0, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* REPORT LUNS */
+ sgio_bitmap_set(0xA3, D|T|L| W| O|M|A|E|B|K|V , read); /* MAINTENANCE IN */
+
+ /* control, write */
+
+ sgio_bitmap_set(0x15, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, write); /* MODE SELECT(6) */
+ sgio_bitmap_set(0x4C, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, write); /* LOG SELECT */
+ sgio_bitmap_set(0x55, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, write); /* MODE SELECT(10) */
+ sgio_bitmap_set(0x1E, D|T| W|R|O|M| K| F , write); /* PREVENT ALLOW MEDIUM REMOVAL */
+
+ /* read */
+
+ sgio_bitmap_set(0x08, D|T| P|W| O| C, read); /* READ(6) */
+ sgio_bitmap_set(0x25, D| W|R|O| B|K , read); /* READ CAPACITY(10) */
+ sgio_bitmap_set(0x28, D| W|R|O| B|K| C, read); /* READ(10) */
+ sgio_bitmap_set(0x2F, D| W|R|O , read); /* VERIFY(10) */
+ sgio_bitmap_set(0x37, D| O|M , read); /* READ DEFECT DATA(10) */
+ sgio_bitmap_set(0x3E, D| W| O , read); /* READ LONG(10) */
+ sgio_bitmap_set(0x88, D|T| W| O| B , read); /* READ(16) */
+ sgio_bitmap_set(0x8F, D|T| W| O| B , read); /* VERIFY(16) */
+ sgio_bitmap_set(0xA8, D| W|R|O| C, read); /* READ(12) */
+
+ /* write */
+
+ sgio_bitmap_set(0x04, D|T|L| R|O , write); /* FORMAT UNIT */
+ sgio_bitmap_set(0x0A, D|T|L|P|W| O| C, write); /* WRITE(6) */
+ sgio_bitmap_set(0x2A, D| W|R|O| B|K| C, write); /* WRITE(10) */
+ sgio_bitmap_set(0x2E, D| W|R|O| B|K , write); /* WRITE AND VERIFY(10) */
+ sgio_bitmap_set(0x35, D| W|R|O| B|K , write); /* SYNCHRONIZE CACHE(10) */
+ sgio_bitmap_set(0x3F, D| W| O , write); /* WRITE LONG(10) */
+ sgio_bitmap_set(0x8A, D|T| W| O| B , write); /* WRITE(16) */
+ sgio_bitmap_set(0xAA, D| W|R|O| C, write); /* WRITE(12) */
+ sgio_bitmap_set(0xAE, D| W| O , write); /* WRITE AND VERIFY(12) */
+ sgio_bitmap_set(0xEA, D| W| O , write); /* WRITE_LONG_2 ?? */
+
+ /* MMC */
+
+ sgio_bitmap_set(0x23, R , read); /* READ FORMAT CAPACITIES */
+ sgio_bitmap_set(0x42, D| R , read); /* READ SUB-CHANNEL / UNMAP !! */
+ sgio_bitmap_set(0x43, R , read); /* READ TOC/PMA/ATIP */
+ sgio_bitmap_set(0x44, T| R , read); /* READ HEADER */
+ sgio_bitmap_set(0x45, R , read); /* PLAY AUDIO(10) */
+ sgio_bitmap_set(0x46, R , read); /* GET CONFIGURATION */
+ sgio_bitmap_set(0x47, R , read); /* PLAY AUDIO MSF */
+ sgio_bitmap_set(0x48, D| R| B , read); /* PLAY AUDIO TI / SANITIZE !! */
+ sgio_bitmap_set(0x4A, R , read); /* GET EVENT STATUS NOTIFICATION */
+ sgio_bitmap_set(0x4B, R , read); /* PAUSE/RESUME */
+ sgio_bitmap_set(0x4E, R , read); /* STOP PLAY/SCAN */
+ sgio_bitmap_set(0x51, D| R , read); /* READ DISC INFORMATION / XPWRITE(10) !! */
+ sgio_bitmap_set(0x52, R , read); /* READ TRACK INFORMATION */
+ sgio_bitmap_set(0x5C, R , read); /* READ BUFFER CAPACITY */
+ sgio_bitmap_set(0xA4, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* REPORT KEY / 0xA4 service actions !! */
+ sgio_bitmap_set(0xAC, R|O , read); /* GET PERFORMANCE / ERASE !! */
+ sgio_bitmap_set(0xAD, R , read); /* READ DVD STRUCTURE */
+ sgio_bitmap_set(0xB9, R , read); /* READ CD MSF */
+ sgio_bitmap_set(0xBA, R , read); /* SCAN */
+ sgio_bitmap_set(0xBC, R , read); /* PLAY CD */
+ sgio_bitmap_set(0xBE, R , read); /* READ CD */
+
+ sgio_bitmap_set(0x53, D| R , write); /* RESERVE TRACK / XDWRITEREAD(10) */
+ sgio_bitmap_set(0x54, R , write); /* SEND OPC INFORMATION */
+ sgio_bitmap_set(0x58, R , write); /* REPAIR TRACK */
+ sgio_bitmap_set(0x5B, R , write); /* CLOSE TRACK/SESSION */
+ sgio_bitmap_set(0x5D, R , write); /* SEND CUE SHEET */
+ sgio_bitmap_set(0xA1, D| R| B , write); /* BLANK / ATA PASS-THROUGH(12) */
+ sgio_bitmap_set(0xA2, R , write); /* SEND EVENT */
+ sgio_bitmap_set(0xA3, R , write); /* SEND KEY */
+ sgio_bitmap_set(0xA6, R| M , write); /* LOAD/UNLOAD C/DVD */
+ sgio_bitmap_set(0xA7, R , write); /* SET READ AHEAD */
+ sgio_bitmap_set(0xB6, R| M , write); /* SET STREAMING */
+ sgio_bitmap_set(0xBB, R , write); /* SET CD SPEED */
+ sgio_bitmap_set(0xBF, R , write); /* SEND DVD STRUCTURE */
+
+ /* tape */
+
+ sgio_bitmap_set(0x19, T , write); /* ERASE(6) */
+
+#undef D
+#undef T
+#undef L
+#undef P
+#undef W
+#undef R
+#undef O
+#undef M
+#undef C
+#undef A
+#undef E
+#undef B
+#undef K
+#undef V
+#undef F
#undef sgio_bitmap_set
/*
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h
index 66216c1..06cc93e 100644
--- a/include/scsi/scsi.h
+++ b/include/scsi/scsi.h
@@ -324,7 +324,10 @@ static inline int scsi_status_is_good(int status)
#define TYPE_RAID 0x0c
#define TYPE_ENCLOSURE 0x0d /* Enclosure Services Device */
#define TYPE_RBC 0x0e
+#define TYPE_OCRW 0x0f
+#define TYPE_ADC 0x10
#define TYPE_OSD 0x11
+#define TYPE_MAX 0x1f
#define TYPE_NO_LUN 0x7f
/* SCSI protocols; these are taken from SPC-3 section 7.5 */
--
1.8.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 part3 2/7] sg_io: create separate entries for conflicting commands
[not found] <1369317575-4236-1-git-send-email-pbonzini@redhat.com>
2013-05-23 13:59 ` [PATCH v3 part3 1/7] sg_io: complete transition to per-class lists of allowed commands Paolo Bonzini
@ 2013-05-23 13:59 ` Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 3/7] sg_io: cleanup and complete whitelist for rare device types Paolo Bonzini
` (4 subsequent siblings)
6 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2013-05-23 13:59 UTC (permalink / raw)
To: linux-kernel; +Cc: tj, James E.J. Bottomley, linux-scsi, Jens Axboe
Some SCSI commands were special cased at the end of the table because
they overlapped across SCSI device classes, with different meanings for
different classes.
Instead of hacking the bits manually, use separate entries in the table.
The 0xA4 opcode is blocked for non-MMC devices, even when open read-write.
The other four conflicting commands have their bitmap entries split in
two parts, one read-only for MMC and one read-write for the other classes.
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: linux-scsi@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/scsi_ioctl.c | 40 +++++++++-------------------------------
1 file changed, 9 insertions(+), 31 deletions(-)
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
index 5d2143f..8f0344f 100644
--- a/block/scsi_ioctl.c
+++ b/block/scsi_ioctl.c
@@ -179,29 +179,33 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x2E, D| W|R|O| B|K , write); /* WRITE AND VERIFY(10) */
sgio_bitmap_set(0x35, D| W|R|O| B|K , write); /* SYNCHRONIZE CACHE(10) */
sgio_bitmap_set(0x3F, D| W| O , write); /* WRITE LONG(10) */
+ sgio_bitmap_set(0x42, D , write); /* UNMAP */
+ sgio_bitmap_set(0x48, D| B , write); /* SANITIZE */
+ sgio_bitmap_set(0x51, D , write); /* XPWRITE(10) */
sgio_bitmap_set(0x8A, D|T| W| O| B , write); /* WRITE(16) */
sgio_bitmap_set(0xAA, D| W|R|O| C, write); /* WRITE(12) */
+ sgio_bitmap_set(0xAC, O , write); /* ERASE(12) */
sgio_bitmap_set(0xAE, D| W| O , write); /* WRITE AND VERIFY(12) */
sgio_bitmap_set(0xEA, D| W| O , write); /* WRITE_LONG_2 ?? */
/* MMC */
sgio_bitmap_set(0x23, R , read); /* READ FORMAT CAPACITIES */
- sgio_bitmap_set(0x42, D| R , read); /* READ SUB-CHANNEL / UNMAP !! */
+ sgio_bitmap_set(0x42, R , read); /* READ SUB-CHANNEL */
sgio_bitmap_set(0x43, R , read); /* READ TOC/PMA/ATIP */
sgio_bitmap_set(0x44, T| R , read); /* READ HEADER */
sgio_bitmap_set(0x45, R , read); /* PLAY AUDIO(10) */
sgio_bitmap_set(0x46, R , read); /* GET CONFIGURATION */
sgio_bitmap_set(0x47, R , read); /* PLAY AUDIO MSF */
- sgio_bitmap_set(0x48, D| R| B , read); /* PLAY AUDIO TI / SANITIZE !! */
+ sgio_bitmap_set(0x48, R , read); /* PLAY AUDIO TI */
sgio_bitmap_set(0x4A, R , read); /* GET EVENT STATUS NOTIFICATION */
sgio_bitmap_set(0x4B, R , read); /* PAUSE/RESUME */
sgio_bitmap_set(0x4E, R , read); /* STOP PLAY/SCAN */
- sgio_bitmap_set(0x51, D| R , read); /* READ DISC INFORMATION / XPWRITE(10) !! */
+ sgio_bitmap_set(0x51, R , read); /* READ DISC INFORMATION */
sgio_bitmap_set(0x52, R , read); /* READ TRACK INFORMATION */
sgio_bitmap_set(0x5C, R , read); /* READ BUFFER CAPACITY */
- sgio_bitmap_set(0xA4, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* REPORT KEY / 0xA4 service actions !! */
- sgio_bitmap_set(0xAC, R|O , read); /* GET PERFORMANCE / ERASE !! */
+ sgio_bitmap_set(0xA4, R , read); /* REPORT KEY */
+ sgio_bitmap_set(0xAC, R , read); /* GET PERFORMANCE */
sgio_bitmap_set(0xAD, R , read); /* READ DVD STRUCTURE */
sgio_bitmap_set(0xB9, R , read); /* READ CD MSF */
sgio_bitmap_set(0xBA, R , read); /* SCAN */
@@ -242,32 +246,6 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
#undef V
#undef F
#undef sgio_bitmap_set
-
- /*
- * Treat specially those commands that have a different meaning
- * for disks: READ SUBCHANNEL conflicts with UNMAP.
- */
- filter->read_ok[GPCMD_READ_SUBCHANNEL] &= ~(1 << TYPE_DISK);
- filter->write_ok[GPCMD_READ_SUBCHANNEL] |= (1 << TYPE_DISK);
-
- /* PLAY AUDIO TI conflicts with SANITIZE. */
- filter->read_ok[GPCMD_PLAY_AUDIO_TI] &= ~((1 << TYPE_DISK) | (1 << TYPE_RBC));
- filter->write_ok[GPCMD_PLAY_AUDIO_TI] |= (1 << TYPE_DISK) | (1 << TYPE_RBC);
-
- /* READ DISC INFORMATION conflicts with XPWRITE. */
- filter->read_ok[GPCMD_READ_DISC_INFO] &= ~(1 << TYPE_DISK);
- filter->write_ok[GPCMD_READ_DISC_INFO] |= (1 << TYPE_DISK);
-
- /* GET PERFORMANCE conflicts with ERASE. */
- filter->read_ok[GPCMD_GET_PERFORMANCE] &= ~(1 << TYPE_MOD);
- filter->write_ok[GPCMD_GET_PERFORMANCE] |= (1 << TYPE_MOD);
-
- /*
- * REPORT KEY conflicts with many management commands under operation
- * code 0xA4, enable it only for MMC devices.
- */
- filter->read_ok[GPCMD_REPORT_KEY] = (1 << TYPE_ROM);
- filter->write_ok[GPCMD_REPORT_KEY] = (1 << TYPE_ROM);
}
int blk_verify_command(struct request_queue *q,
--
1.8.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 part3 3/7] sg_io: cleanup and complete whitelist for rare device types
[not found] <1369317575-4236-1-git-send-email-pbonzini@redhat.com>
2013-05-23 13:59 ` [PATCH v3 part3 1/7] sg_io: complete transition to per-class lists of allowed commands Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 2/7] sg_io: create separate entries for conflicting commands Paolo Bonzini
@ 2013-05-23 13:59 ` Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 4/7] sg_io: whitelist another command for multimedia devices Paolo Bonzini
` (3 subsequent siblings)
6 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2013-05-23 13:59 UTC (permalink / raw)
To: linux-kernel; +Cc: tj, James E.J. Bottomley, linux-scsi, Jens Axboe
Start cleaning up the table, moving out of the way four rare & obsolete
device types: printers, communication devices (network cards), and
processor devices.
This patch is included mostly for tidiness, so that flags for obsolete
device types do not clutter the other entries. However, it adds two
commands for printers: SLEW AND PRINT and SYNCHRONIZE BUFFER. These are
present even in SCSI-2 (dated 1994).
Processor devices could also do EXTENDED COPY operations, but these
should not be allowed for unprivileged users because they can read/write
to other devices.
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: linux-scsi@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/scsi_ioctl.c | 41 ++++++++++++++++++++++++++++++++---------
1 file changed, 32 insertions(+), 9 deletions(-)
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
index 8f0344f..41bbd93 100644
--- a/block/scsi_ioctl.c
+++ b/block/scsi_ioctl.c
@@ -142,7 +142,7 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x03, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* REQUEST SENSE */
sgio_bitmap_set(0x12, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* INQUIRY */
sgio_bitmap_set(0x1A, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* MODE SENSE(6) */
- sgio_bitmap_set(0x1B, D|T|L| W|R|O|M|A| B|K|V|F , read); /* START STOP UNIT */
+ sgio_bitmap_set(0x1B, D|T| W|R|O|M|A| B|K|V|F , read); /* START STOP UNIT */
sgio_bitmap_set(0x1C, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* RECEIVE DIAGNOSTIC RESULTS */
sgio_bitmap_set(0x2B, D|T| W|R|O|M| K , read); /* SEEK(10) */
sgio_bitmap_set(0x3C, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* READ BUFFER */
@@ -161,21 +161,21 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
/* read */
- sgio_bitmap_set(0x08, D|T| P|W| O| C, read); /* READ(6) */
+ sgio_bitmap_set(0x08, D|T| W| O , read); /* READ(6) */
sgio_bitmap_set(0x25, D| W|R|O| B|K , read); /* READ CAPACITY(10) */
- sgio_bitmap_set(0x28, D| W|R|O| B|K| C, read); /* READ(10) */
+ sgio_bitmap_set(0x28, D| W|R|O| B|K , read); /* READ(10) */
sgio_bitmap_set(0x2F, D| W|R|O , read); /* VERIFY(10) */
sgio_bitmap_set(0x37, D| O|M , read); /* READ DEFECT DATA(10) */
sgio_bitmap_set(0x3E, D| W| O , read); /* READ LONG(10) */
sgio_bitmap_set(0x88, D|T| W| O| B , read); /* READ(16) */
sgio_bitmap_set(0x8F, D|T| W| O| B , read); /* VERIFY(16) */
- sgio_bitmap_set(0xA8, D| W|R|O| C, read); /* READ(12) */
+ sgio_bitmap_set(0xA8, D| W|R|O , read); /* READ(12) */
/* write */
- sgio_bitmap_set(0x04, D|T|L| R|O , write); /* FORMAT UNIT */
- sgio_bitmap_set(0x0A, D|T|L|P|W| O| C, write); /* WRITE(6) */
- sgio_bitmap_set(0x2A, D| W|R|O| B|K| C, write); /* WRITE(10) */
+ sgio_bitmap_set(0x04, D|T| R|O , write); /* FORMAT UNIT */
+ sgio_bitmap_set(0x0A, D|T| W| O , write); /* WRITE(6) */
+ sgio_bitmap_set(0x2A, D| W|R|O| B|K , write); /* WRITE(10) */
sgio_bitmap_set(0x2E, D| W|R|O| B|K , write); /* WRITE AND VERIFY(10) */
sgio_bitmap_set(0x35, D| W|R|O| B|K , write); /* SYNCHRONIZE CACHE(10) */
sgio_bitmap_set(0x3F, D| W| O , write); /* WRITE LONG(10) */
@@ -183,11 +183,20 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x48, D| B , write); /* SANITIZE */
sgio_bitmap_set(0x51, D , write); /* XPWRITE(10) */
sgio_bitmap_set(0x8A, D|T| W| O| B , write); /* WRITE(16) */
- sgio_bitmap_set(0xAA, D| W|R|O| C, write); /* WRITE(12) */
+ sgio_bitmap_set(0xAA, D| W|R|O , write); /* WRITE(12) */
sgio_bitmap_set(0xAC, O , write); /* ERASE(12) */
sgio_bitmap_set(0xAE, D| W| O , write); /* WRITE AND VERIFY(12) */
sgio_bitmap_set(0xEA, D| W| O , write); /* WRITE_LONG_2 ?? */
+ /* printer */
+
+ sgio_bitmap_set(0x04, L , write); /* FORMAT */
+ sgio_bitmap_set(0x0A, L , write); /* PRINT */
+ sgio_bitmap_set(0x0B, L , write); /* SLEW AND PRINT */
+ sgio_bitmap_set(0x10, L , write); /* SYNCHRONIZE BUFFER */
+ sgio_bitmap_set(0x14, L , write); /* RECOVER BUFFERED DATA */
+ sgio_bitmap_set(0x1B, L , write); /* STOP PRINT */
+
/* MMC */
sgio_bitmap_set(0x23, R , read); /* READ FORMAT CAPACITIES */
@@ -230,6 +239,20 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x19, T , write); /* ERASE(6) */
+ /* communication devices (obsolete) */
+
+ sgio_bitmap_set(0x08, C, read); /* GET MESSAGE(6) */
+ sgio_bitmap_set(0x28, C, read); /* GET MESSAGE(10) */
+ sgio_bitmap_set(0xA8, C, read); /* GET MESSAGE(12) */
+ sgio_bitmap_set(0x0A, C, write); /* SEND MESSAGE(6) */
+ sgio_bitmap_set(0x2A, C, write); /* SEND MESSAGE(10) */
+ sgio_bitmap_set(0xAA, C, write); /* SEND MESSAGE(12) */
+
+ /* processor devices (mostly obsolete, SPC-2) */
+
+ sgio_bitmap_set(0x08, P , read); /* RECEIVE(6) */
+ sgio_bitmap_set(0x0A, P , write); /* SEND(6) */
+
#undef D
#undef T
#undef L
--
1.8.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 part3 4/7] sg_io: whitelist another command for multimedia devices
[not found] <1369317575-4236-1-git-send-email-pbonzini@redhat.com>
` (2 preceding siblings ...)
2013-05-23 13:59 ` [PATCH v3 part3 3/7] sg_io: cleanup and complete whitelist for rare device types Paolo Bonzini
@ 2013-05-23 13:59 ` Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 5/7] sg_io: cleanup and complete whitelist for media changers Paolo Bonzini
` (2 subsequent siblings)
6 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2013-05-23 13:59 UTC (permalink / raw)
To: linux-kernel; +Cc: tj, James E.J. Bottomley, linux-scsi, Jens Axboe
Three MMC commands were never included: PLAY AUDIO(12), SERVICE ACTION
IN(12), MECHANISM STATUS. Add MECHANISM STATUS, the only one that has
not been obsoleted in recent versions of the standard. QEMU implements
it, so it is reasonable to assume that someone is using it.
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: linux-scsi@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/scsi_ioctl.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
index 41bbd93..b11ad49 100644
--- a/block/scsi_ioctl.c
+++ b/block/scsi_ioctl.c
@@ -219,6 +219,7 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0xB9, R , read); /* READ CD MSF */
sgio_bitmap_set(0xBA, R , read); /* SCAN */
sgio_bitmap_set(0xBC, R , read); /* PLAY CD */
+ sgio_bitmap_set(0xBD, R , read); /* MECHANISM STATUS */
sgio_bitmap_set(0xBE, R , read); /* READ CD */
sgio_bitmap_set(0x53, D| R , write); /* RESERVE TRACK / XDWRITEREAD(10) */
--
1.8.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 part3 5/7] sg_io: cleanup and complete whitelist for media changers
[not found] <1369317575-4236-1-git-send-email-pbonzini@redhat.com>
` (3 preceding siblings ...)
2013-05-23 13:59 ` [PATCH v3 part3 4/7] sg_io: whitelist another command for multimedia devices Paolo Bonzini
@ 2013-05-23 13:59 ` Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 6/7] sg_io: cleanup and complete whitelist for tapes Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 7/7] sg_io: cleanup and complete whitelist for disks Paolo Bonzini
6 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2013-05-23 13:59 UTC (permalink / raw)
To: linux-kernel; +Cc: tj, James E.J. Bottomley, linux-scsi, Jens Axboe
Besides CD-ROMs, three more device types are interesting for SG_IO:
media changers, tapes and of course disks.
Starting with this patch, we will whitelist a few more commands for
these devices. For media changers, enable "INITIALIZE ELEMENT STATUS"
and "REQUEST VOLUME ELEMENT ADDRESS". A few changer-specific commands
were already enabled by chance because they overlapped commands that
are valid for other classes: "EXCHANGE MEDIUM", "SEND VOLUME TAG",
"INITIALIZE ELEMENT STATUS WITH RANGE".
In addition, some changers are still using an old pre-standard command
for "INITIALIZE ELEMENT STATUS WITH RANGE", which is enabled as well.
This makes media changers usable by unprivileged users that have access
to the device node.
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: linux-scsi@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/scsi_ioctl.c | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
index b11ad49..f9e719e 100644
--- a/block/scsi_ioctl.c
+++ b/block/scsi_ioctl.c
@@ -142,9 +142,9 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x03, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* REQUEST SENSE */
sgio_bitmap_set(0x12, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* INQUIRY */
sgio_bitmap_set(0x1A, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* MODE SENSE(6) */
- sgio_bitmap_set(0x1B, D|T| W|R|O|M|A| B|K|V|F , read); /* START STOP UNIT */
+ sgio_bitmap_set(0x1B, D|T| W|R|O| A| B|K|V|F , read); /* START STOP UNIT */
sgio_bitmap_set(0x1C, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* RECEIVE DIAGNOSTIC RESULTS */
- sgio_bitmap_set(0x2B, D|T| W|R|O|M| K , read); /* SEEK(10) */
+ sgio_bitmap_set(0x2B, D|T| W|R|O| K , read); /* SEEK(10) */
sgio_bitmap_set(0x3C, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* READ BUFFER */
sgio_bitmap_set(0x4D, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* LOG SENSE */
sgio_bitmap_set(0x5A, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* MODE SENSE(10) */
@@ -165,7 +165,7 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x25, D| W|R|O| B|K , read); /* READ CAPACITY(10) */
sgio_bitmap_set(0x28, D| W|R|O| B|K , read); /* READ(10) */
sgio_bitmap_set(0x2F, D| W|R|O , read); /* VERIFY(10) */
- sgio_bitmap_set(0x37, D| O|M , read); /* READ DEFECT DATA(10) */
+ sgio_bitmap_set(0x37, D| O , read); /* READ DEFECT DATA(10) */
sgio_bitmap_set(0x3E, D| W| O , read); /* READ LONG(10) */
sgio_bitmap_set(0x88, D|T| W| O| B , read); /* READ(16) */
sgio_bitmap_set(0x8F, D|T| W| O| B , read); /* VERIFY(16) */
@@ -197,6 +197,23 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x14, L , write); /* RECOVER BUFFERED DATA */
sgio_bitmap_set(0x1B, L , write); /* STOP PRINT */
+ /* media changer */
+
+ sgio_bitmap_set(0x07, M , read); /* INITIALIZE ELEMENT STATUS */
+ sgio_bitmap_set(0x1B, M , read); /* OPEN/CLOSE IMPORT/EXPORT ELEMENT */
+ sgio_bitmap_set(0x2B, M , read); /* POSITION TO ELEMENT */
+ sgio_bitmap_set(0x37, M , read); /* INITIALIZE ELEMENT STATUS WITH RANGE */
+ sgio_bitmap_set(0xB5, M , read); /* REQUEST VOLUME ELEMENT ADDRESS */
+
+ sgio_bitmap_set(0xA6, M , write); /* EXCHANGE MEDIUM */
+ sgio_bitmap_set(0xB6, M , write); /* SEND VOLUME TAG */
+
+ /*
+ * The standard says that INITIALIZE ELEMENT STATUS WITH RANGE was
+ * mapped to 0xE7 (vendor-specific) before being standardized.
+ */
+ sgio_bitmap_set(0xE7, M , read);
+
/* MMC */
sgio_bitmap_set(0x23, R , read); /* READ FORMAT CAPACITIES */
@@ -230,9 +247,9 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0xA1, D| R| B , write); /* BLANK / ATA PASS-THROUGH(12) */
sgio_bitmap_set(0xA2, R , write); /* SEND EVENT */
sgio_bitmap_set(0xA3, R , write); /* SEND KEY */
- sgio_bitmap_set(0xA6, R| M , write); /* LOAD/UNLOAD C/DVD */
+ sgio_bitmap_set(0xA6, R , write); /* LOAD/UNLOAD C/DVD */
sgio_bitmap_set(0xA7, R , write); /* SET READ AHEAD */
- sgio_bitmap_set(0xB6, R| M , write); /* SET STREAMING */
+ sgio_bitmap_set(0xB6, R , write); /* SET STREAMING */
sgio_bitmap_set(0xBB, R , write); /* SET CD SPEED */
sgio_bitmap_set(0xBF, R , write); /* SEND DVD STRUCTURE */
--
1.8.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 part3 6/7] sg_io: cleanup and complete whitelist for tapes
[not found] <1369317575-4236-1-git-send-email-pbonzini@redhat.com>
` (4 preceding siblings ...)
2013-05-23 13:59 ` [PATCH v3 part3 5/7] sg_io: cleanup and complete whitelist for media changers Paolo Bonzini
@ 2013-05-23 13:59 ` Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 7/7] sg_io: cleanup and complete whitelist for disks Paolo Bonzini
6 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2013-05-23 13:59 UTC (permalink / raw)
To: linux-kernel; +Cc: tj, James E.J. Bottomley, linux-scsi, Jens Axboe
Tapes have no problematic overlap, but quite a few commands are missing
that are useful when operating tapes with /dev/sg.
This patch adds commands from the SSC standards to the list. I added
everything because the current whitelist is totally inapplicable to
those devices; the command set is almost completely different from that
of disks. The SSC standard is relatively small and does not really have
the kitchen sink in them.
Commands with similar meanings often have different names or slightly
different characteristics for tapes vs. block devices; for example, tapes
have no 10- or 12-byte CDBs for READ and WRITE. For this reason I'm
separating block devices for tapes entirely.
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: linux-scsi@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/scsi_ioctl.c | 47 ++++++++++++++++++++++++++++++++++++-----------
1 file changed, 36 insertions(+), 11 deletions(-)
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
index f9e719e..0bf0820 100644
--- a/block/scsi_ioctl.c
+++ b/block/scsi_ioctl.c
@@ -142,9 +142,9 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x03, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* REQUEST SENSE */
sgio_bitmap_set(0x12, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* INQUIRY */
sgio_bitmap_set(0x1A, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* MODE SENSE(6) */
- sgio_bitmap_set(0x1B, D|T| W|R|O| A| B|K|V|F , read); /* START STOP UNIT */
+ sgio_bitmap_set(0x1B, D| W|R|O| A| B|K|V|F , read); /* START STOP UNIT */
sgio_bitmap_set(0x1C, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* RECEIVE DIAGNOSTIC RESULTS */
- sgio_bitmap_set(0x2B, D|T| W|R|O| K , read); /* SEEK(10) */
+ sgio_bitmap_set(0x2B, D| W|R|O| K , read); /* SEEK(10) */
sgio_bitmap_set(0x3C, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* READ BUFFER */
sgio_bitmap_set(0x4D, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* LOG SENSE */
sgio_bitmap_set(0x5A, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, read); /* MODE SENSE(10) */
@@ -159,22 +159,22 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x55, D|T|L|P|W|R|O|M|A|E|B|K|V|F|C, write); /* MODE SELECT(10) */
sgio_bitmap_set(0x1E, D|T| W|R|O|M| K| F , write); /* PREVENT ALLOW MEDIUM REMOVAL */
- /* read */
+ /* block devices, read */
- sgio_bitmap_set(0x08, D|T| W| O , read); /* READ(6) */
+ sgio_bitmap_set(0x08, D| W| O , read); /* READ(6) */
sgio_bitmap_set(0x25, D| W|R|O| B|K , read); /* READ CAPACITY(10) */
sgio_bitmap_set(0x28, D| W|R|O| B|K , read); /* READ(10) */
sgio_bitmap_set(0x2F, D| W|R|O , read); /* VERIFY(10) */
sgio_bitmap_set(0x37, D| O , read); /* READ DEFECT DATA(10) */
sgio_bitmap_set(0x3E, D| W| O , read); /* READ LONG(10) */
- sgio_bitmap_set(0x88, D|T| W| O| B , read); /* READ(16) */
- sgio_bitmap_set(0x8F, D|T| W| O| B , read); /* VERIFY(16) */
+ sgio_bitmap_set(0x88, D| W| O| B , read); /* READ(16) */
+ sgio_bitmap_set(0x8F, D| W| O| B , read); /* VERIFY(16) */
sgio_bitmap_set(0xA8, D| W|R|O , read); /* READ(12) */
- /* write */
+ /* block devices, write */
- sgio_bitmap_set(0x04, D|T| R|O , write); /* FORMAT UNIT */
- sgio_bitmap_set(0x0A, D|T| W| O , write); /* WRITE(6) */
+ sgio_bitmap_set(0x04, D| R|O , write); /* FORMAT UNIT */
+ sgio_bitmap_set(0x0A, D| W| O , write); /* WRITE(6) */
sgio_bitmap_set(0x2A, D| W|R|O| B|K , write); /* WRITE(10) */
sgio_bitmap_set(0x2E, D| W|R|O| B|K , write); /* WRITE AND VERIFY(10) */
sgio_bitmap_set(0x35, D| W|R|O| B|K , write); /* SYNCHRONIZE CACHE(10) */
@@ -182,7 +182,7 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x42, D , write); /* UNMAP */
sgio_bitmap_set(0x48, D| B , write); /* SANITIZE */
sgio_bitmap_set(0x51, D , write); /* XPWRITE(10) */
- sgio_bitmap_set(0x8A, D|T| W| O| B , write); /* WRITE(16) */
+ sgio_bitmap_set(0x8A, D| W| O| B , write); /* WRITE(16) */
sgio_bitmap_set(0xAA, D| W|R|O , write); /* WRITE(12) */
sgio_bitmap_set(0xAC, O , write); /* ERASE(12) */
sgio_bitmap_set(0xAE, D| W| O , write); /* WRITE AND VERIFY(12) */
@@ -219,7 +219,7 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x23, R , read); /* READ FORMAT CAPACITIES */
sgio_bitmap_set(0x42, R , read); /* READ SUB-CHANNEL */
sgio_bitmap_set(0x43, R , read); /* READ TOC/PMA/ATIP */
- sgio_bitmap_set(0x44, T| R , read); /* READ HEADER */
+ sgio_bitmap_set(0x44, R , read); /* READ HEADER */
sgio_bitmap_set(0x45, R , read); /* PLAY AUDIO(10) */
sgio_bitmap_set(0x46, R , read); /* GET CONFIGURATION */
sgio_bitmap_set(0x47, R , read); /* PLAY AUDIO MSF */
@@ -255,7 +255,32 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
/* tape */
+ sgio_bitmap_set(0x01, T , read); /* REWIND */
+ sgio_bitmap_set(0x05, T , read); /* READ BLOCK LIMITS */
+ sgio_bitmap_set(0x08, T , read); /* READ(6) */
+ sgio_bitmap_set(0x0F, T , read); /* READ REVERSE(6) */
+ sgio_bitmap_set(0x13, T , read); /* VERIFY(6) */
+ sgio_bitmap_set(0x1B, T , read); /* LOAD UNLOAD */
+ sgio_bitmap_set(0x2B, T , read); /* LOCATE(10) */
+ sgio_bitmap_set(0x34, T , read); /* READ POSITION */
+ sgio_bitmap_set(0x44, T , read); /* REPORT DENSITY SUPPORT */
+ sgio_bitmap_set(0x81, T , read); /* READ REVERSE(16) */
+ sgio_bitmap_set(0x88, T , read); /* READ(16) */
+ sgio_bitmap_set(0x8F, T , read); /* VERIFY(16) */
+ sgio_bitmap_set(0x92, T , read); /* LOCATE(16) */
+
+ sgio_bitmap_set(0x04, T , write); /* FORMAT MEDIUM */
+ sgio_bitmap_set(0x0A, T , write); /* WRITE(6) */
+ sgio_bitmap_set(0x0B, T , write); /* SET CAPACITY */
+ sgio_bitmap_set(0x10, T , write); /* WRITE FILEMARKS(6) */
+ sgio_bitmap_set(0x11, T , write); /* SPACE(6) */
+ sgio_bitmap_set(0x14, T , write); /* RECOVER BUFFERED DATA */
sgio_bitmap_set(0x19, T , write); /* ERASE(6) */
+ sgio_bitmap_set(0x80, T , write); /* WRITE FILEMARKS(16) */
+ sgio_bitmap_set(0x82, T , write); /* ALLOW OVERWRITE */
+ sgio_bitmap_set(0x8A, T , write); /* WRITE(16) */
+ sgio_bitmap_set(0x91, T , write); /* SPACE(16) */
+ sgio_bitmap_set(0x93, T , write); /* ERASE(16) */
/* communication devices (obsolete) */
--
1.8.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 part3 7/7] sg_io: cleanup and complete whitelist for disks
[not found] <1369317575-4236-1-git-send-email-pbonzini@redhat.com>
` (5 preceding siblings ...)
2013-05-23 13:59 ` [PATCH v3 part3 6/7] sg_io: cleanup and complete whitelist for tapes Paolo Bonzini
@ 2013-05-23 13:59 ` Paolo Bonzini
6 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2013-05-23 13:59 UTC (permalink / raw)
To: linux-kernel; +Cc: tj, James E.J. Bottomley, linux-scsi, Jens Axboe
This splits entries for SBC commands that conflict with MMC, and adds
missing commands to the table from SBC and related standards.
Only commands that affect the medium are added:
- I added ATA PASS-THROUGH(16) because ATA PASS-THROUGH(12) is present;
using the (16) version is preferrable because (12) conflicts with the
destructive MMC command BLANK; see the sg_sat_identify man page for
example.
- WRITE SAME(16) and WRITE SAME(10) are used by discard and zero-out
feature. For discard, the UNMAP command is already in the whitelist.
For zero-out, omitting them produces "WRITE SAME failed. Manually
zeroing" errors in the log.
- COMPARE AND WRITE is used by cluster software.
- WRITE AND VERIFY(16) is needed to support >2TB disks, and the
corresponding 12-byte CDB is whitelisted already. I didn't get reports
about _these_ command but I do get bug reports about >2TB disks.
SYNCHRONIZE CACHE(16) is similarly the 16-byte extension of another
10-byte command.
- similarly, in the case of VERIFY(12) and READ DEFECT DATA(12) the
same command was already whitelisted for another command length.
Commands that affect other state of the LUN are all privileged, with the
sole exception of START STOP UNIT, which has always been allowed for all
file descriptors. I do not really agree with that and it's probably
an artifact of when /dev/cdrom had r--r--r-- permissions, but I'm not
trying to change that.
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: linux-scsi@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block/scsi_ioctl.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
index 0bf0820..216cd17 100644
--- a/block/scsi_ioctl.c
+++ b/block/scsi_ioctl.c
@@ -170,6 +170,8 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x88, D| W| O| B , read); /* READ(16) */
sgio_bitmap_set(0x8F, D| W| O| B , read); /* VERIFY(16) */
sgio_bitmap_set(0xA8, D| W|R|O , read); /* READ(12) */
+ sgio_bitmap_set(0xAF, D| W| O , read); /* VERIFY(12) */
+ sgio_bitmap_set(0xB7, D| O , read); /* READ DEFECT DATA(12) */
/* block devices, write */
@@ -179,10 +181,18 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0x2E, D| W|R|O| B|K , write); /* WRITE AND VERIFY(10) */
sgio_bitmap_set(0x35, D| W|R|O| B|K , write); /* SYNCHRONIZE CACHE(10) */
sgio_bitmap_set(0x3F, D| W| O , write); /* WRITE LONG(10) */
+ sgio_bitmap_set(0x41, D , write); /* WRITE SAME(10) */
sgio_bitmap_set(0x42, D , write); /* UNMAP */
sgio_bitmap_set(0x48, D| B , write); /* SANITIZE */
sgio_bitmap_set(0x51, D , write); /* XPWRITE(10) */
+ sgio_bitmap_set(0x53, D , write); /* XDWRITEREAD(10) */
+ sgio_bitmap_set(0x85, D| B , write); /* ATA PASS-THROUGH(16) */
+ sgio_bitmap_set(0x89, D , write); /* COMPARE AND WRITE */
sgio_bitmap_set(0x8A, D| W| O| B , write); /* WRITE(16) */
+ sgio_bitmap_set(0x8E, D| W| O| B , write); /* WRITE AND VERIFY(16) */
+ sgio_bitmap_set(0x91, D| W| O| B , write); /* SYNCHRONIZE CACHE(16) */
+ sgio_bitmap_set(0x93, D , write); /* WRITE SAME(16) */
+ sgio_bitmap_set(0xA1, D| B , write); /* ATA PASS-THROUGH(12) */
sgio_bitmap_set(0xAA, D| W|R|O , write); /* WRITE(12) */
sgio_bitmap_set(0xAC, O , write); /* ERASE(12) */
sgio_bitmap_set(0xAE, D| W| O , write); /* WRITE AND VERIFY(12) */
@@ -239,12 +249,12 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
sgio_bitmap_set(0xBD, R , read); /* MECHANISM STATUS */
sgio_bitmap_set(0xBE, R , read); /* READ CD */
- sgio_bitmap_set(0x53, D| R , write); /* RESERVE TRACK / XDWRITEREAD(10) */
+ sgio_bitmap_set(0x53, R , write); /* RESERVE TRACK */
sgio_bitmap_set(0x54, R , write); /* SEND OPC INFORMATION */
sgio_bitmap_set(0x58, R , write); /* REPAIR TRACK */
sgio_bitmap_set(0x5B, R , write); /* CLOSE TRACK/SESSION */
sgio_bitmap_set(0x5D, R , write); /* SEND CUE SHEET */
- sgio_bitmap_set(0xA1, D| R| B , write); /* BLANK / ATA PASS-THROUGH(12) */
+ sgio_bitmap_set(0xA1, R , write); /* BLANK */
sgio_bitmap_set(0xA2, R , write); /* SEND EVENT */
sgio_bitmap_set(0xA3, R , write); /* SEND KEY */
sgio_bitmap_set(0xA6, R , write); /* LOAD/UNLOAD C/DVD */
--
1.8.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2013-05-23 13:59 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1369317575-4236-1-git-send-email-pbonzini@redhat.com>
2013-05-23 13:59 ` [PATCH v3 part3 1/7] sg_io: complete transition to per-class lists of allowed commands Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 2/7] sg_io: create separate entries for conflicting commands Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 3/7] sg_io: cleanup and complete whitelist for rare device types Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 4/7] sg_io: whitelist another command for multimedia devices Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 5/7] sg_io: cleanup and complete whitelist for media changers Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 6/7] sg_io: cleanup and complete whitelist for tapes Paolo Bonzini
2013-05-23 13:59 ` [PATCH v3 part3 7/7] sg_io: cleanup and complete whitelist for disks Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).