diff options
Diffstat (limited to 'module/zfs/zfs_ioctl.c')
-rw-r--r-- | module/zfs/zfs_ioctl.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c index 994b3af36..92bdec4b9 100644 --- a/module/zfs/zfs_ioctl.c +++ b/module/zfs/zfs_ioctl.c @@ -6947,11 +6947,14 @@ static const struct file_operations zfsdev_fops = { }; static struct miscdevice zfs_misc = { - .minor = MISC_DYNAMIC_MINOR, + .minor = ZFS_MINOR, .name = ZFS_DRIVER, .fops = &zfsdev_fops, }; +MODULE_ALIAS_MISCDEV(ZFS_MINOR); +MODULE_ALIAS("devname:zfs"); + static int zfs_attach(void) { @@ -6962,12 +6965,24 @@ zfs_attach(void) zfsdev_state_list->zs_minor = -1; error = misc_register(&zfs_misc); - if (error != 0) { - printk(KERN_INFO "ZFS: misc_register() failed %d\n", error); - return (error); + if (error == -EBUSY) { + /* + * Fallback to dynamic minor allocation in the event of a + * collision with a reserved minor in linux/miscdevice.h. + * In this case the kernel modules must be manually loaded. + */ + printk(KERN_INFO "ZFS: misc_register() with static minor %d " + "failed %d, retrying with MISC_DYNAMIC_MINOR\n", + ZFS_MINOR, error); + + zfs_misc.minor = MISC_DYNAMIC_MINOR; + error = misc_register(&zfs_misc); } - return (0); + if (error) + printk(KERN_INFO "ZFS: misc_register() failed %d\n", error); + + return (error); } static void |