Группа :: Система/Основа
Пакет: btier
Главная Изменения Спек Патчи Sources Загрузить Gear Bugs and FR Repocop
Патч: btier-1.3.0-alt3.patch
Скачать
Скачать
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 <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
#include <fcntl.h>
#include <string.h>
#include <stdarg.h>
@@ -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;
}