Skip to content

Commit

Permalink
Linux 5.5 compat: blkg_tryget()
Browse files Browse the repository at this point in the history
Commit torvalds/linux@9e8d42a0f accidentally
converted the static inline function blkg_tryget() to GPL-only for
kernels built with CONFIG_PREEMPT_RCU=y and CONFIG_BLK_CGROUP=y.

Resolve the build issue by providing our own equivalent functionality
when needed which uses rcu_read_lock_sched() internally as before.

Reviewed-by: Tony Hutter <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes openzfs#9745
Closes openzfs#10072
Signed-off-by: Pavel Snajdr <[email protected]>
  • Loading branch information
behlendorf authored and snajpa committed May 28, 2020
1 parent 6bd4f45 commit 1a17337
Showing 1 changed file with 31 additions and 1 deletion.
32 changes: 31 additions & 1 deletion module/os/linux/zfs/vdev_disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,36 @@ vdev_submit_bio_impl(struct bio *bio)

#ifdef HAVE_BIO_SET_DEV
#if defined(CONFIG_BLK_CGROUP) && defined(HAVE_BIO_SET_DEV_GPL_ONLY)
/*
* The Linux 5.5 kernel updated percpu_ref_tryget() which is inlined by
* blkg_tryget() to use rcu_read_lock() instead of rcu_read_lock_sched().
* As a side effect the function was converted to GPL-only. Define our
* own version when needed which uses rcu_read_lock_sched().
*/
#if defined(HAVE_BLKG_TRYGET_GPL_ONLY)
static inline bool
vdev_blkg_tryget(struct blkcg_gq *blkg)
{
struct percpu_ref *ref = &blkg->refcnt;
unsigned long __percpu *count;
bool rc;

rcu_read_lock_sched();

if (__ref_is_percpu(ref, &count)) {
this_cpu_inc(*count);
rc = true;
} else {
rc = atomic_long_inc_not_zero(&ref->count);
}

rcu_read_unlock_sched();

return (rc);
}
#else
#define vdev_blkg_tryget(bg) blkg_tryget(bg)
#endif
/*
* The Linux 5.0 kernel updated the bio_set_dev() macro so it calls the
* GPL-only bio_associate_blkg() symbol thus inadvertently converting
Expand All @@ -544,7 +574,7 @@ vdev_bio_associate_blkg(struct bio *bio)
ASSERT3P(q, !=, NULL);
ASSERT3P(bio->bi_blkg, ==, NULL);

if (blkg_tryget(q->root_blkg))
if (q->root_blkg && vdev_blkg_tryget(q->root_blkg))
bio->bi_blkg = q->root_blkg;
}
#define bio_associate_blkg vdev_bio_associate_blkg
Expand Down

0 comments on commit 1a17337

Please sign in to comment.