summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/kernel-elevator-change.m44
-rw-r--r--include/linux/blkdev_compat.h11
-rw-r--r--module/zfs/vdev_disk.c25
3 files changed, 13 insertions, 27 deletions
diff --git a/config/kernel-elevator-change.m4 b/config/kernel-elevator-change.m4
index ace5aa82d..eba252579 100644
--- a/config/kernel-elevator-change.m4
+++ b/config/kernel-elevator-change.m4
@@ -1,6 +1,6 @@
dnl #
-dnl # 2.6.36 API change
-dnl # Verify the elevator_change() symbol is available.
+dnl # 2.6.36 API, exported elevator_change() symbol
+dnl # 4.12 API, removed elevator_change() symbol
dnl #
AC_DEFUN([ZFS_AC_KERNEL_ELEVATOR_CHANGE], [
AC_MSG_CHECKING([whether elevator_change() is available])
diff --git a/include/linux/blkdev_compat.h b/include/linux/blkdev_compat.h
index 27a4743c0..88b0e48cd 100644
--- a/include/linux/blkdev_compat.h
+++ b/include/linux/blkdev_compat.h
@@ -107,17 +107,6 @@ blk_queue_set_write_cache(struct request_queue *q, bool wc, bool fua)
#endif
/*
- * 2.6.27 API change,
- * The blk_queue_stackable() queue flag was added in 2.6.27 to handle dm
- * stacking drivers. Prior to this request stacking drivers were detected
- * by checking (q->request_fn == NULL), for earlier kernels we revert to
- * this legacy behavior.
- */
-#ifndef blk_queue_stackable
-#define blk_queue_stackable(q) ((q)->request_fn == NULL)
-#endif
-
-/*
* 2.6.34 API change,
* The blk_queue_max_hw_sectors() function replaces blk_queue_max_sectors().
*/
diff --git a/module/zfs/vdev_disk.c b/module/zfs/vdev_disk.c
index 11744c1c1..996bab43c 100644
--- a/module/zfs/vdev_disk.c
+++ b/module/zfs/vdev_disk.c
@@ -167,23 +167,20 @@ vdev_elevator_switch(vdev_t *v, char *elevator)
if (!v->vdev_wholedisk && strncmp(device, "dm-", 3) != 0)
return;
- /* Skip devices without schedulers (loop, ram, dm, etc) */
- if (!q->elevator || !blk_queue_stackable(q))
- return;
-
/* Leave existing scheduler when set to "none" */
if ((strncmp(elevator, "none", 4) == 0) && (strlen(elevator) == 4))
return;
+ /*
+ * The elevator_change() function was available in kernels from
+ * 2.6.36 to 4.11. When not available fall back to using the user
+ * mode helper functionality to set the elevator via sysfs. This
+ * requires /bin/echo and sysfs to be mounted which may not be true
+ * early in the boot process.
+ */
#ifdef HAVE_ELEVATOR_CHANGE
error = elevator_change(q, elevator);
#else
- /*
- * For pre-2.6.36 kernels elevator_change() is not available.
- * Therefore we fall back to using a usermodehelper to echo the
- * elevator into sysfs; This requires /bin/echo and sysfs to be
- * mounted which may not be true early in the boot process.
- */
#define SET_SCHEDULER_CMD \
"exec 0</dev/null " \
" 1>/sys/block/%s/queue/scheduler " \
@@ -197,10 +194,10 @@ vdev_elevator_switch(vdev_t *v, char *elevator)
error = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
strfree(argv[2]);
#endif /* HAVE_ELEVATOR_CHANGE */
- if (error)
- printk(KERN_NOTICE "ZFS: Unable to set \"%s\" scheduler"
- " for %s (%s): %d\n", elevator, v->vdev_path, device,
- error);
+ if (error) {
+ zfs_dbgmsg("Unable to set \"%s\" scheduler for %s (%s): %d\n",
+ elevator, v->vdev_path, device, error);
+ }
}
/*