cli/btier_inspect.c | 14 ++----- cli/btier_setup.c | 12 +----- kernel/btier/btier_common.c | 2 - kernel/btier/btier_main.c | 98 +++++++++++++++++++++++++++++++++++++++------ 4 files changed, 91 insertions(+), 35 deletions(-) diff --git a/cli/btier_inspect.c b/cli/btier_inspect.c index 2303736..b4a982b 100644 --- a/cli/btier_inspect.c +++ b/cli/btier_inspect.c @@ -242,18 +242,14 @@ void restore_list(int fd, u64 size, u64 soffset, char *type, int device) close(sfd); } -int tier_set_fd(int fd, char *datafile, int devicenr) +int tier_set_fd(char *datafile, int devicenr) { - int res; int ffd; int mode = O_RDWR | O_NOATIME; u64 bitlistsize; u64 devsize; - u64 round; struct stat stbuf; - struct devicemagic tier_magic; u64 soffset = 0; - int header_size = TIER_HEADERSIZE; ffd = open(datafile, mode, 0600); if (ffd < 0) @@ -374,12 +370,9 @@ int main(int argc, char *argv[]) mkoptions.total_device_size = 0; mkoptions.bitlistsize_total = 0; struct stat stdta; - struct stat device; int mode = O_RDWR | O_NOATIME; - int fd, ffd; - int dev; + int ffd; int count; - u64 round; u64 devsize; int header_size = TIER_HEADERSIZE; u64 soffset; @@ -427,7 +420,7 @@ int main(int argc, char *argv[]) mkoptions.backdev[count]->datafile); exit(-1); } - if (0 != (tier_set_fd(fd, mkoptions.backdev[count]->datafile, + if (0 != (tier_set_fd(mkoptions.backdev[count]->datafile, count))) die_syserr(); mkoptions.bitlistsize_total += @@ -494,6 +487,5 @@ int main(int argc, char *argv[]) mkoptions.backdev[count]); } } -end_exit: exit(ret); } diff --git a/cli/btier_setup.c b/cli/btier_setup.c index 82d73d1..378c44b 100644 --- a/cli/btier_setup.c +++ b/cli/btier_setup.c @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include #include @@ -187,11 +189,9 @@ int tier_set_fd(int fd, char *datafile, int devicenr) int mode; u64 bitlistsize; u64 devsize; - u64 round; struct stat stbuf; struct devicemagic tier_magic; u64 soffset = 0; - int header_size = TIER_HEADERSIZE; mode = O_RDWR | O_NOATIME; if (mkoptions.sync) @@ -261,11 +261,6 @@ int tier_set_fd(int fd, char *datafile, int devicenr) int tier_setup(int op, int fd, int devicenr) { - int ffd, i; - char *pass; - char *filename; - u64 fsize; - int ret = 0; int rc; switch (op) { @@ -441,9 +436,7 @@ int main(int argc, char *argv[]) struct stat device; int mode = O_RDWR | O_NOATIME; int fd, ffd; - int dev; int count; - u64 round; u64 devsize; int header_size = TIER_HEADERSIZE; u64 soffset; @@ -583,7 +576,6 @@ int main(int argc, char *argv[]) if (0 != ret) die_ioctlerr("ioctl TIER_REGISTER failed\n"); -end_exit: flock(fd, LOCK_UN); close(fd); exit(ret); diff --git a/kernel/btier/btier_common.c b/kernel/btier/btier_common.c index a04ec54..3ab5713 100644 --- a/kernel/btier/btier_common.c +++ b/kernel/btier/btier_common.c @@ -55,12 +55,10 @@ u64 round_to_blksize(u64 size) u64 calc_bitlist_size(u64 devicesize) { u64 bitlistsize; - u64 startofbitlist; u64 round; u64 rdevsize; rdevsize = round_to_blksize(devicesize); - startofbitlist = TIER_HEADERSIZE; bitlistsize = (rdevsize / BLKSIZE); round = bitlistsize / BLKSIZE; round *= BLKSIZE; diff --git a/kernel/btier/btier_main.c b/kernel/btier/btier_main.c index 45bb07b..1d5b0dd 100644 --- a/kernel/btier/btier_main.c +++ b/kernel/btier/btier_main.c @@ -102,7 +102,7 @@ void clear_debug_info(struct tier_device *dev, int state) #endif } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) static void tier_release(struct gendisk *gd, fmode_t mode) #else static int tier_release(struct gendisk *gd, fmode_t mode) @@ -114,7 +114,7 @@ static int tier_release(struct gendisk *gd, fmode_t mode) spin_lock(&uselock); dev->users--; spin_unlock(&uselock); -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) return 0; #endif } @@ -521,14 +521,20 @@ void write_test_request(struct tier_device *dev) memcpy(buf,"HALLO MARK\n",strlen("HALLO MARK\n")); kunmap(p); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) + bio->bi_iter.bi_sector = 0; + bio->bi_iter.bi_idx = 0; + bio->bi_iter.bi_size = PAGE_SIZE; +#else bio->bi_sector = 0; + bio->bi_idx = 0; + bio->bi_size = PAGE_SIZE; +#endif bio->bi_bdev = bdev; bio->bi_io_vec[0].bv_page = p; bio->bi_io_vec[0].bv_len = PAGE_SIZE; bio->bi_io_vec[0].bv_offset = 0; bio->bi_vcnt = 1; - bio->bi_idx = 0; - bio->bi_size = PAGE_SIZE; bio->bi_end_io = bio_write_done; bio->bi_private = dev; submit_bio(WRITE, bio); @@ -541,14 +547,20 @@ static int tier_write_page(struct tier_device *dev, unsigned int device, struct bio *bio = bio_alloc(GFP_NOIO, 1); int wt = WRITE; set_debug_info(dev, BIOWRITE); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) + bio->bi_iter.bi_sector = offset >> 9; + bio->bi_iter.bi_idx = 0; + bio->bi_iter.bi_size = bvec->bv_len; +#else bio->bi_sector = offset >> 9; + bio->bi_idx = 0; + bio->bi_size = bvec->bv_len; +#endif bio->bi_bdev = bdev; bio->bi_io_vec[0].bv_page = bvec->bv_page; bio->bi_io_vec[0].bv_len = bvec->bv_len; bio->bi_io_vec[0].bv_offset = bvec->bv_offset; bio->bi_vcnt = 1; - bio->bi_idx = 0; - bio->bi_size = bvec->bv_len; bio->bi_end_io = bio_write_done; bio->bi_private = bio_task; bio->bi_rw=wt; @@ -564,14 +576,20 @@ static int tier_read_page(struct tier_device *dev, unsigned int device, struct block_device *bdev=dev->backdev[device]->bdev; struct bio *bio = bio_alloc(GFP_NOIO, 1); set_debug_info(dev, BIOREAD); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) + bio->bi_iter.bi_sector = offset >> 9; + bio->bi_iter.bi_idx = 0; + bio->bi_iter.bi_size = bvec->bv_len; +#else bio->bi_sector = offset >> 9; + bio->bi_idx = 0; + bio->bi_size = bvec->bv_len; +#endif bio->bi_bdev = bdev; bio->bi_io_vec[0].bv_page = bvec->bv_page; bio->bi_io_vec[0].bv_len = bvec->bv_len; bio->bi_io_vec[0].bv_offset = bvec->bv_offset; bio->bi_vcnt = 1; - bio->bi_idx = 0; - bio->bi_size = bvec->bv_len; bio->bi_end_io = bio_read_done; bio->bi_private = bio_task; bio->bi_rw=READ; @@ -631,7 +649,12 @@ static int tier_bio_io(struct tier_device *dev, unsigned int device, int res; int bv; char *buf; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) struct bio_vec *bvec; +#else + struct bio_vec bvec; + struct bvec_iter iter; +#endif bvecs = size >> PAGE_SHIFT; bio = bio_alloc(GFP_NOIO, bvecs); @@ -640,10 +663,16 @@ static int tier_bio_io(struct tier_device *dev, unsigned int device, return -EIO; } bio->bi_bdev = bdev; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) + bio->bi_iter.bi_sector = offset >> 9; + bio->bi_iter.bi_size = size; + bio->bi_iter.bi_idx = 0; +#else bio->bi_sector = offset >> 9; bio->bi_size = size; - bio->bi_rw=rw; bio->bi_idx = 0; +#endif + bio->bi_rw=rw; for (bv=0; bv < bvecs; bv++) { page=alloc_page(GFP_NOIO); if (!page) { @@ -661,6 +690,17 @@ static int tier_bio_io(struct tier_device *dev, unsigned int device, } bio->bi_vcnt=bv; res=submit_bio_wait(rw,bio); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) + bio->bi_iter.bi_idx = 0; + bio_for_each_segment(bvec, bio, iter) { + if (rw == READ) { + buf = kmap(bvec.bv_page); + memcpy(&buffer[PAGE_SIZE * iter.bi_idx], buf, PAGE_SIZE); + kunmap(bvec.bv_page); + } + __free_page(bvec.bv_page); + } +#else bv=0; bio->bi_idx = 0; bio_for_each_segment(bvec, bio, bv) { @@ -671,6 +711,7 @@ static int tier_bio_io(struct tier_device *dev, unsigned int device, } __free_page(bvec->bv_page); } +#endif bio_put(bio); if (res) { tiererror(dev, "tier_bio_io : read/write failed\n"); @@ -1156,9 +1197,15 @@ static void tier_discard(struct tier_device *dev, u64 offset, unsigned int size) static int tier_do_bio(struct tier_device *dev, struct bio_task *bio_task) { loff_t offset; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) + struct bio_vec bvec; + struct bvec_iter i; +#else struct bio_vec *bvec; - struct bio *bio = bio_task->parent_bio; - int i, ret = 0; + int i; +#endif + int ret = 0; + struct bio *bio = bio_task->parent_bio; u64 blocknr = 0; char *buffer; @@ -1171,7 +1218,11 @@ static int tier_do_bio(struct tier_device *dev, struct bio_task *bio_task) atomic_set(&dev->wqlock, NORMAL_IO); mutex_lock(&dev->qlock); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) + offset = ((loff_t) bio->bi_iter.bi_sector << 9); +#else offset = ((loff_t) bio->bi_sector << 9); +#endif blocknr = offset >> BLKBITS; if (bio_rw(bio) == WRITE) { @@ -1192,8 +1243,14 @@ static int tier_do_bio(struct tier_device *dev, struct bio_task *bio_task) if (bio->bi_rw & REQ_DISCARD) { set_debug_info(dev, DISCARD); pr_debug("Got a discard request offset %llu len %u\n", - offset, bio->bi_size); + offset, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) + bio->bi_iter.bi_size); + tier_discard(dev, offset, bio->bi_iter.bi_size); +#else + bio->bi_size); tier_discard(dev, offset, bio->bi_size); +#endif set_debug_info(dev, DISCARD); } #endif @@ -1203,20 +1260,37 @@ static int tier_do_bio(struct tier_device *dev, struct bio_task *bio_task) determine_iotype(dev, blocknr); atomic_inc(&bio_task->pending); if (bio_rw(bio) == WRITE) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) + buffer = kmap(bvec.bv_page); + ret = write_tiered(dev, buffer + bvec.bv_offset, + bvec.bv_len, offset, &bvec, bio_task); + kunmap(bvec.bv_page); +#else buffer = kmap(bvec->bv_page); ret = write_tiered(dev, buffer + bvec->bv_offset, bvec->bv_len, offset, bvec, bio_task); kunmap(bvec->bv_page); +#endif } else { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) + buffer = kmap(bvec.bv_page); + ret = read_tiered(dev, buffer + bvec.bv_offset, + bvec.bv_len, offset, &bvec, bio_task); +#else buffer = kmap(bvec->bv_page); ret = read_tiered(dev, buffer + bvec->bv_offset, bvec->bv_len, offset, bvec, bio_task); +#endif } if (ret < 0) break; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) + offset += bvec.bv_len; +#else offset += bvec->bv_len; +#endif blocknr = offset >> BLKBITS; }