Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37538120
en ru br
Репозитории ALT

Группа :: Система/Основа
Пакет: 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;
 	}
 
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin