Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
[firefly-linux-kernel-4.4.55.git] / drivers / nvdimm / core.c
index 1d96b9a6e4cc0fb0274c9403ea6925095f04afc2..cb62ec6a12d073cf1abd5422e151636d57d6f781 100644 (file)
@@ -214,6 +214,35 @@ ssize_t nd_sector_size_store(struct device *dev, const char *buf,
        }
 }
 
+void __nd_iostat_start(struct bio *bio, unsigned long *start)
+{
+       struct gendisk *disk = bio->bi_bdev->bd_disk;
+       const int rw = bio_data_dir(bio);
+       int cpu = part_stat_lock();
+
+       *start = jiffies;
+       part_round_stats(cpu, &disk->part0);
+       part_stat_inc(cpu, &disk->part0, ios[rw]);
+       part_stat_add(cpu, &disk->part0, sectors[rw], bio_sectors(bio));
+       part_inc_in_flight(&disk->part0, rw);
+       part_stat_unlock();
+}
+EXPORT_SYMBOL(__nd_iostat_start);
+
+void nd_iostat_end(struct bio *bio, unsigned long start)
+{
+       struct gendisk *disk = bio->bi_bdev->bd_disk;
+       unsigned long duration = jiffies - start;
+       const int rw = bio_data_dir(bio);
+       int cpu = part_stat_lock();
+
+       part_stat_add(cpu, &disk->part0, ticks[rw], duration);
+       part_round_stats(cpu, &disk->part0);
+       part_dec_in_flight(&disk->part0, rw);
+       part_stat_unlock();
+}
+EXPORT_SYMBOL(nd_iostat_end);
+
 static ssize_t commands_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
@@ -379,6 +408,9 @@ int nd_integrity_init(struct gendisk *disk, unsigned long meta_size)
        };
        int ret;
 
+       if (meta_size == 0)
+               return 0;
+
        ret = blk_integrity_register(disk, &integrity);
        if (ret)
                return ret;