diff --git a/config/kernel-elevator-change.m4 b/config/kernel-elevator-change.m4 index ace5aa82d3d3..eba252579bcc 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 27f056626626..c8cdf38ef4fe 100644 --- a/include/linux/blkdev_compat.h +++ b/include/linux/blkdev_compat.h @@ -105,17 +105,6 @@ blk_queue_set_write_cache(struct request_queue *q, bool wc, bool fua) #define blk_fs_request(rq) ((rq)->cmd_type == REQ_TYPE_FS) #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 6dc0544fc6ad..c5708cb2b510 100644 --- a/module/zfs/vdev_disk.c +++ b/module/zfs/vdev_disk.c @@ -168,23 +168,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/sys/block/%s/queue/scheduler " \ @@ -198,9 +195,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("ZFS: Unable to set \"%s\" scheduler for %s (%s): %d\n", + if (error) { + zfs_dbgmsg("Unable to set \"%s\" scheduler for %s (%s): %d\n", elevator, v->vdev_path, device, error); + } } /*