[BIONIC] UBUNTU: SAUCE: add workarounds to enable ZFS for 4.14

Message ID 20171106172355.12750-1-colin.king@canonical.com
State New
Headers show
Series
  • [BIONIC] UBUNTU: SAUCE: add workarounds to enable ZFS for 4.14
Related show

Commit Message

Colin King Nov. 6, 2017, 5:23 p.m.
From: Colin Ian King <colin.king@canonical.com>

Currently there are no upstream compat workarounds for 4.14 so for
the moment use some workarounds that enable ZFS to build on 4.14.
I added pre-v4.14 #ifdefs so these patches are compatible with the
userspace dkms ZFS/SPL source. Passes the ZFS kernel team autotest
regression tests.

This should all be superceeded once 7.3.0 lands in Bionic and we
have the official 4.14 compat fixes.

Also enable ZFS in debian/rules

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 debian/rules               |  2 --
 spl/include/sys/vmsystm.h  |  8 ++++++++
 zfs/module/zfs/vdev_disk.c |  8 ++++++++
 zfs/module/zfs/zvol.c      | 13 +++++++++++++
 4 files changed, 29 insertions(+), 2 deletions(-)

Comments

Seth Forshee Nov. 6, 2017, 5:32 p.m. | #1
On Mon, Nov 06, 2017 at 05:23:55PM +0000, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Currently there are no upstream compat workarounds for 4.14 so for
> the moment use some workarounds that enable ZFS to build on 4.14.
> I added pre-v4.14 #ifdefs so these patches are compatible with the
> userspace dkms ZFS/SPL source. Passes the ZFS kernel team autotest
> regression tests.
> 
> This should all be superceeded once 7.3.0 lands in Bionic and we
> have the official 4.14 compat fixes.
> 
> Also enable ZFS in debian/rules
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>

Applied to unstable/master, thanks!

Patch

diff --git a/debian/rules b/debian/rules
index 5a68364bc310..6c8855f2b3a9 100755
--- a/debian/rules
+++ b/debian/rules
@@ -75,8 +75,6 @@  ifneq ($(do_tools),true)
 	do_tools_common=
 endif
 
-do_zfs=false
-
 # Either tools package needs the common source preparation
 do_any_tools=$(sort $(filter-out false,$(do_linux_tools) $(do_cloud_tools)))
 
diff --git a/spl/include/sys/vmsystm.h b/spl/include/sys/vmsystm.h
index 9d334fe0a16e..edc0b38249b2 100644
--- a/spl/include/sys/vmsystm.h
+++ b/spl/include/sys/vmsystm.h
@@ -30,15 +30,23 @@ 
 #include <linux/swap.h>
 #include <linux/highmem.h>
 #include <linux/vmalloc.h>
+#include <linux/version.h>
 #include <sys/types.h>
 #include <asm/uaccess.h>
 
 #define	membar_producer()		smp_wmb()
 #define	physmem				totalram_pages
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
 #define	freemem			(nr_free_pages() + \
 				global_page_state(NR_INACTIVE_FILE) + \
 				global_page_state(NR_INACTIVE_ANON) + \
 				global_page_state(NR_SLAB_RECLAIMABLE))
+#else
+#define	freemem			(nr_free_pages() + \
+				global_zone_page_state(NR_INACTIVE_FILE) + \
+				global_zone_page_state(NR_INACTIVE_ANON) + \
+				global_zone_page_state(NR_SLAB_RECLAIMABLE))
+#endif
 
 #define	xcopyin(from, to, size)		copy_from_user(to, from, size)
 #define	xcopyout(from, to, size)	copy_to_user(to, from, size)
diff --git a/zfs/module/zfs/vdev_disk.c b/zfs/module/zfs/vdev_disk.c
index 33eba20a4a15..9968b0379cf5 100644
--- a/zfs/module/zfs/vdev_disk.c
+++ b/zfs/module/zfs/vdev_disk.c
@@ -574,7 +574,11 @@  __vdev_disk_physio(struct block_device *bdev, zio_t *zio, caddr_t kbuf_ptr,
 		/* Matching put called by vdev_disk_physio_completion */
 		vdev_disk_dio_get(dr);
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
 		dr->dr_bio[i]->bi_bdev = bdev;
+#else
+		bio_set_dev(dr->dr_bio[i], bdev);
+#endif
 		BIO_BI_SECTOR(dr->dr_bio[i]) = bio_offset >> 9;
 		dr->dr_bio[i]->bi_end_io = vdev_disk_physio_completion;
 		dr->dr_bio[i]->bi_private = dr;
@@ -650,7 +654,11 @@  vdev_disk_io_flush(struct block_device *bdev, zio_t *zio)
 
 	bio->bi_end_io = vdev_disk_io_flush_completion;
 	bio->bi_private = zio;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
 	bio->bi_bdev = bdev;
+#else
+	bio_set_dev(bio, bdev);
+#endif
 	zio->io_delay = jiffies_64;
 	bio_set_flush(bio);
 	vdev_submit_bio(bio);
diff --git a/zfs/module/zfs/zvol.c b/zfs/module/zfs/zvol.c
index cfdc709864ef..e03130cfaa90 100644
--- a/zfs/module/zfs/zvol.c
+++ b/zfs/module/zfs/zvol.c
@@ -52,6 +52,7 @@ 
 #include <sys/spa_impl.h>
 #include <sys/zvol.h>
 #include <linux/blkdev_compat.h>
+#include <linux/version.h>
 
 unsigned int zvol_inhibit_dev = 0;
 unsigned int zvol_major = ZVOL_MAJOR;
@@ -614,7 +615,11 @@  zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx, uint64_t offset,
 static int
 zvol_write(struct bio *bio)
 {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
 	zvol_state_t *zv = bio->bi_bdev->bd_disk->private_data;
+#else
+	zvol_state_t *zv = bio->bi_disk->private_data;
+#endif
 	uint64_t offset = BIO_BI_SECTOR(bio) << 9;
 	uint64_t size = BIO_BI_SIZE(bio);
 	int error = 0;
@@ -664,7 +669,11 @@  zvol_write(struct bio *bio)
 static int
 zvol_discard(struct bio *bio)
 {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
 	zvol_state_t *zv = bio->bi_bdev->bd_disk->private_data;
+#else
+	zvol_state_t *zv = bio->bi_disk->private_data;
+#endif
 	uint64_t start = BIO_BI_SECTOR(bio) << 9;
 	uint64_t size = BIO_BI_SIZE(bio);
 	uint64_t end = start + size;
@@ -706,7 +715,11 @@  zvol_discard(struct bio *bio)
 static int
 zvol_read(struct bio *bio)
 {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
 	zvol_state_t *zv = bio->bi_bdev->bd_disk->private_data;
+#else
+	zvol_state_t *zv = bio->bi_disk->private_data;
+#endif
 	uint64_t offset = BIO_BI_SECTOR(bio) << 9;
 	uint64_t len = BIO_BI_SIZE(bio);
 	int error;