Merge remote-tracking branch 'mkp-scsi/fixes' into fixes
authorJames Bottomley <James.Bottomley@HansenPartnership.com>
Tue, 17 Jan 2017 22:32:54 +0000 (17:32 -0500)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Tue, 17 Jan 2017 22:32:54 +0000 (17:32 -0500)
1  2 
drivers/scsi/sd.c

diff --combined drivers/scsi/sd.c
@@@ -53,7 -53,7 +53,7 @@@
  #include <linux/pm_runtime.h>
  #include <linux/pr.h>
  #include <linux/t10-pi.h>
 -#include <asm/uaccess.h>
 +#include <linux/uaccess.h>
  #include <asm/unaligned.h>
  
  #include <scsi/scsi.h>
@@@ -2600,7 -2600,8 +2600,8 @@@ sd_read_cache_type(struct scsi_disk *sd
                if (sdp->broken_fua) {
                        sd_first_printk(KERN_NOTICE, sdkp, "Disabling FUA\n");
                        sdkp->DPOFUA = 0;
-               } else if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) {
+               } else if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw &&
+                          !sdkp->device->use_16_for_rw) {
                        sd_first_printk(KERN_NOTICE, sdkp,
                                  "Uses READ/WRITE(6), disabling FUA\n");
                        sdkp->DPOFUA = 0;
@@@ -2783,13 -2784,21 +2784,21 @@@ static void sd_read_block_characteristi
                queue_flag_clear_unlocked(QUEUE_FLAG_ADD_RANDOM, q);
        }
  
-       sdkp->zoned = (buffer[8] >> 4) & 3;
-       if (sdkp->zoned == 1)
-               q->limits.zoned = BLK_ZONED_HA;
-       else if (sdkp->device->type == TYPE_ZBC)
+       if (sdkp->device->type == TYPE_ZBC) {
+               /* Host-managed */
                q->limits.zoned = BLK_ZONED_HM;
-       else
-               q->limits.zoned = BLK_ZONED_NONE;
+       } else {
+               sdkp->zoned = (buffer[8] >> 4) & 3;
+               if (sdkp->zoned == 1)
+                       /* Host-aware */
+                       q->limits.zoned = BLK_ZONED_HA;
+               else
+                       /*
+                        * Treat drive-managed devices as
+                        * regular block devices.
+                        */
+                       q->limits.zoned = BLK_ZONED_NONE;
+       }
        if (blk_queue_is_zoned(q) && sdkp->first_scan)
                sd_printk(KERN_NOTICE, sdkp, "Host-%s zoned block device\n",
                      q->limits.zoned == BLK_ZONED_HM ? "managed" : "aware");