[PATCH 09/13] sg_io: whitelist a few more commands for disks
This adds missing commands to the table from SBC and related standards. Only commands that affect the medium are added. 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" Cc: linux-s...@kernel.org Cc: Jens Axboe Signed-off-by: Paolo Bonzini --- block/scsi_ioctl.c | 23 +-- 1 files changed, 21 insertions(+), 2 deletions(-) diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index 49cd98a..74f3678 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -166,25 +166,44 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter) 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, read); // READ(10) + sgio_bitmap_set(0x29, D| W|R|O , read); // READ GENERATION + sgio_bitmap_set(0x2D, O , read); // READ UPDATED BLOCK sgio_bitmap_set(0x2F, D| W|R|O , read); // VERIFY(10) + sgio_bitmap_set(0x34, D| W| O|K, read); // PRE-FETCH(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(0x90, D| W| O| B , read); // PRE-FETCH(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) /* write */ sgio_bitmap_set(0x04, D|R|O , write); // FORMAT UNIT + sgio_bitmap_set(0x07, D| W| O , write); // REASSIGN BLOCKS 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(0x2C, D|R|O , write); // ERASE(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(0x38, W| O|K, write); // MEDIUM SCAN + sgio_bitmap_set(0x3D, O , write); // UPDATE BLOCK 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(0x8B, D , write); // ORWRITE sgio_bitmap_set(0x8A, D|T|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) @@ -241,12 +260,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); //
[PATCH 09/13] sg_io: whitelist a few more commands for disks
This adds missing commands to the table from SBC and related standards. Only commands that affect the medium are added. 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 jbottom...@parallels.com Cc: linux-s...@kernel.org Cc: Jens Axboe ax...@kernel.dk Signed-off-by: Paolo Bonzini pbonz...@redhat.com --- block/scsi_ioctl.c | 23 +-- 1 files changed, 21 insertions(+), 2 deletions(-) diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index 49cd98a..74f3678 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -166,25 +166,44 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter) 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, read); // READ(10) + sgio_bitmap_set(0x29, D| W|R|O , read); // READ GENERATION + sgio_bitmap_set(0x2D, O , read); // READ UPDATED BLOCK sgio_bitmap_set(0x2F, D| W|R|O , read); // VERIFY(10) + sgio_bitmap_set(0x34, D| W| O|K, read); // PRE-FETCH(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(0x90, D| W| O| B , read); // PRE-FETCH(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) /* write */ sgio_bitmap_set(0x04, D|R|O , write); // FORMAT UNIT + sgio_bitmap_set(0x07, D| W| O , write); // REASSIGN BLOCKS 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(0x2C, D|R|O , write); // ERASE(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(0x38, W| O|K, write); // MEDIUM SCAN + sgio_bitmap_set(0x3D, O , write); // UPDATE BLOCK 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(0x8B, D , write); // ORWRITE sgio_bitmap_set(0x8A, D|T|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) @@ -241,12 +260,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) +