]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/md/dm-snap.c
Merge tag 'libnvdimm-for-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm...
[mirror_ubuntu-artful-kernel.git] / drivers / md / dm-snap.c
index 70bb0e8b62ce38c36975949923a6be13ef789fe5..ce2a910709f722ce065e365fd53a9ee326b6477e 100644 (file)
@@ -1680,7 +1680,7 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio)
 
        init_tracked_chunk(bio);
 
-       if (bio->bi_rw & REQ_FLUSH) {
+       if (bio->bi_rw & REQ_PREFLUSH) {
                bio->bi_bdev = s->cow->bdev;
                return DM_MAPIO_REMAPPED;
        }
@@ -1696,7 +1696,8 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio)
         * to copy an exception */
        down_write(&s->lock);
 
-       if (!s->valid || (unlikely(s->snapshot_overflowed) && bio_rw(bio) == WRITE)) {
+       if (!s->valid || (unlikely(s->snapshot_overflowed) &&
+           bio_data_dir(bio) == WRITE)) {
                r = -EIO;
                goto out_unlock;
        }
@@ -1713,7 +1714,7 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio)
         * flags so we should only get this if we are
         * writeable.
         */
-       if (bio_rw(bio) == WRITE) {
+       if (bio_data_dir(bio) == WRITE) {
                pe = __lookup_pending_exception(s, chunk);
                if (!pe) {
                        up_write(&s->lock);
@@ -1799,7 +1800,7 @@ static int snapshot_merge_map(struct dm_target *ti, struct bio *bio)
 
        init_tracked_chunk(bio);
 
-       if (bio->bi_rw & REQ_FLUSH) {
+       if (bio->bi_rw & REQ_PREFLUSH) {
                if (!dm_bio_get_target_bio_nr(bio))
                        bio->bi_bdev = s->origin->bdev;
                else
@@ -1819,7 +1820,7 @@ static int snapshot_merge_map(struct dm_target *ti, struct bio *bio)
        e = dm_lookup_exception(&s->complete, chunk);
        if (e) {
                /* Queue writes overlapping with chunks being merged */
-               if (bio_rw(bio) == WRITE &&
+               if (bio_data_dir(bio) == WRITE &&
                    chunk >= s->first_merging_chunk &&
                    chunk < (s->first_merging_chunk +
                             s->num_merging_chunks)) {
@@ -1831,7 +1832,7 @@ static int snapshot_merge_map(struct dm_target *ti, struct bio *bio)
 
                remap_exception(s, e, bio, chunk);
 
-               if (bio_rw(bio) == WRITE)
+               if (bio_data_dir(bio) == WRITE)
                        track_chunk(s, bio, chunk);
                goto out_unlock;
        }
@@ -1839,7 +1840,7 @@ static int snapshot_merge_map(struct dm_target *ti, struct bio *bio)
 redirect_to_origin:
        bio->bi_bdev = s->origin->bdev;
 
-       if (bio_rw(bio) == WRITE) {
+       if (bio_data_dir(bio) == WRITE) {
                up_write(&s->lock);
                return do_origin(s->origin, bio);
        }
@@ -2285,10 +2286,10 @@ static int origin_map(struct dm_target *ti, struct bio *bio)
 
        bio->bi_bdev = o->dev->bdev;
 
-       if (unlikely(bio->bi_rw & REQ_FLUSH))
+       if (unlikely(bio->bi_rw & REQ_PREFLUSH))
                return DM_MAPIO_REMAPPED;
 
-       if (bio_rw(bio) != WRITE)
+       if (bio_data_dir(bio) != WRITE)
                return DM_MAPIO_REMAPPED;
 
        available_sectors = o->split_boundary -
@@ -2301,6 +2302,13 @@ static int origin_map(struct dm_target *ti, struct bio *bio)
        return do_origin(o->dev, bio);
 }
 
+static long origin_direct_access(struct dm_target *ti, sector_t sector,
+               void **kaddr, pfn_t *pfn, long size)
+{
+       DMWARN("device does not support dax.");
+       return -EIO;
+}
+
 /*
  * Set the target "max_io_len" field to the minimum of all the snapshots'
  * chunk sizes.
@@ -2360,6 +2368,7 @@ static struct target_type origin_target = {
        .postsuspend = origin_postsuspend,
        .status  = origin_status,
        .iterate_devices = origin_iterate_devices,
+       .direct_access = origin_direct_access,
 };
 
 static struct target_type snapshot_target = {