Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux...
[deliverable/linux.git] / block / blk-integrity.c
index a7436ccc936bf3f300766cf52ebe38fa8777635c..79ffb4855af048462c8c44b3d0a7a493926989bc 100644 (file)
@@ -186,37 +186,53 @@ int blk_integrity_compare(struct gendisk *gd1, struct gendisk *gd2)
 }
 EXPORT_SYMBOL(blk_integrity_compare);
 
-int blk_integrity_merge_rq(struct request_queue *q, struct request *req,
-                          struct request *next)
+bool blk_integrity_merge_rq(struct request_queue *q, struct request *req,
+                           struct request *next)
 {
-       if (blk_integrity_rq(req) != blk_integrity_rq(next))
-               return -1;
+       if (blk_integrity_rq(req) == 0 && blk_integrity_rq(next) == 0)
+               return true;
+
+       if (blk_integrity_rq(req) == 0 || blk_integrity_rq(next) == 0)
+               return false;
+
+       if (bio_integrity(req->bio)->bip_flags !=
+           bio_integrity(next->bio)->bip_flags)
+               return false;
 
        if (req->nr_integrity_segments + next->nr_integrity_segments >
            q->limits.max_integrity_segments)
-               return -1;
+               return false;
 
-       return 0;
+       return true;
 }
 EXPORT_SYMBOL(blk_integrity_merge_rq);
 
-int blk_integrity_merge_bio(struct request_queue *q, struct request *req,
-                           struct bio *bio)
+bool blk_integrity_merge_bio(struct request_queue *q, struct request *req,
+                            struct bio *bio)
 {
        int nr_integrity_segs;
        struct bio *next = bio->bi_next;
 
+       if (blk_integrity_rq(req) == 0 && bio_integrity(bio) == NULL)
+               return true;
+
+       if (blk_integrity_rq(req) == 0 || bio_integrity(bio) == NULL)
+               return false;
+
+       if (bio_integrity(req->bio)->bip_flags != bio_integrity(bio)->bip_flags)
+               return false;
+
        bio->bi_next = NULL;
        nr_integrity_segs = blk_rq_count_integrity_sg(q, bio);
        bio->bi_next = next;
 
        if (req->nr_integrity_segments + nr_integrity_segs >
            q->limits.max_integrity_segments)
-               return -1;
+               return false;
 
        req->nr_integrity_segments += nr_integrity_segs;
 
-       return 0;
+       return true;
 }
 EXPORT_SYMBOL(blk_integrity_merge_bio);
 
@@ -307,6 +323,12 @@ static ssize_t integrity_generate_show(struct blk_integrity *bi, char *page)
        return sprintf(page, "%d\n", (bi->flags & BLK_INTEGRITY_GENERATE) != 0);
 }
 
+static ssize_t integrity_device_show(struct blk_integrity *bi, char *page)
+{
+       return sprintf(page, "%u\n",
+                      (bi->flags & BLK_INTEGRITY_DEVICE_CAPABLE) != 0);
+}
+
 static struct integrity_sysfs_entry integrity_format_entry = {
        .attr = { .name = "format", .mode = S_IRUGO },
        .show = integrity_format_show,
@@ -329,11 +351,17 @@ static struct integrity_sysfs_entry integrity_generate_entry = {
        .store = integrity_generate_store,
 };
 
+static struct integrity_sysfs_entry integrity_device_entry = {
+       .attr = { .name = "device_is_integrity_capable", .mode = S_IRUGO },
+       .show = integrity_device_show,
+};
+
 static struct attribute *integrity_attrs[] = {
        &integrity_format_entry.attr,
        &integrity_tag_size_entry.attr,
        &integrity_verify_entry.attr,
        &integrity_generate_entry.attr,
+       &integrity_device_entry.attr,
        NULL,
 };
 
This page took 0.025739 seconds and 5 git commands to generate.