]> git.proxmox.com Git - mirror_zfs.git/blobdiff - module/zfs/vdev_disk.c
Linux 5.0 compat: Fix bio_set_dev()
[mirror_zfs.git] / module / zfs / vdev_disk.c
index 1a570e8217de822f9619735d3cde7cc24331a1d0..cf011bf9cce5723edd7d2dd273fe93d71926b6bc 100644 (file)
@@ -502,13 +502,38 @@ vdev_submit_bio_impl(struct bio *bio)
 #endif
 }
 
-#ifndef HAVE_BIO_SET_DEV
+#ifdef HAVE_BIO_SET_DEV
+#if defined(CONFIG_BLK_CGROUP) && defined(HAVE_BIO_SET_DEV_GPL_ONLY)
+/*
+ * The Linux 5.0 kernel updated the bio_set_dev() macro so it calls the
+ * GPL-only bio_associate_blkg() symbol thus inadvertently converting
+ * the entire macro.  Provide a minimal version which always assigns the
+ * request queue's root_blkg to the bio.
+ */
+static inline void
+vdev_bio_associate_blkg(struct bio *bio)
+{
+       struct request_queue *q = bio->bi_disk->queue;
+
+       ASSERT3P(q, !=, NULL);
+       ASSERT3P(q->root_blkg, !=, NULL);
+       ASSERT3P(bio->bi_blkg, ==, NULL);
+
+       if (blkg_tryget(q->root_blkg))
+               bio->bi_blkg = q->root_blkg;
+}
+#define        bio_associate_blkg vdev_bio_associate_blkg
+#endif
+#else
+/*
+ * Provide a bio_set_dev() helper macro for pre-Linux 4.14 kernels.
+ */
 static inline void
 bio_set_dev(struct bio *bio, struct block_device *bdev)
 {
        bio->bi_bdev = bdev;
 }
-#endif /* !HAVE_BIO_SET_DEV */
+#endif /* HAVE_BIO_SET_DEV */
 
 static inline void
 vdev_submit_bio(struct bio *bio)