]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - block/blk-lib.c
block: Make blkdev_issue_zeroout use WRITE SAME
[karo-tx-linux.git] / block / blk-lib.c
index a062543c58ac54db176d88f844c025fe1fbc706b..9373b58dfab185878baf9cb196bcd61dd7637894 100644 (file)
@@ -214,7 +214,7 @@ EXPORT_SYMBOL(blkdev_issue_write_same);
  *  Generate and issue number of bios with zerofiled pages.
  */
 
-int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
+int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
                        sector_t nr_sects, gfp_t gfp_mask)
 {
        int ret;
@@ -264,4 +264,32 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
 
        return ret;
 }
+
+/**
+ * blkdev_issue_zeroout - zero-fill a block range
+ * @bdev:      blockdev to write
+ * @sector:    start sector
+ * @nr_sects:  number of sectors to write
+ * @gfp_mask:  memory allocation flags (for bio_alloc)
+ *
+ * Description:
+ *  Generate and issue number of bios with zerofiled pages.
+ */
+
+int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
+                        sector_t nr_sects, gfp_t gfp_mask)
+{
+       if (bdev_write_same(bdev)) {
+               unsigned char bdn[BDEVNAME_SIZE];
+
+               if (!blkdev_issue_write_same(bdev, sector, nr_sects, gfp_mask,
+                                            ZERO_PAGE(0)))
+                       return 0;
+
+               bdevname(bdev, bdn);
+               pr_err("%s: WRITE SAME failed. Manually zeroing.\n", bdn);
+       }
+
+       return __blkdev_issue_zeroout(bdev, sector, nr_sects, gfp_mask);
+}
 EXPORT_SYMBOL(blkdev_issue_zeroout);