diff options
Diffstat (limited to 'drivers/base/dd.c')
-rw-r--r-- | drivers/base/dd.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 348fc4695d4d..a823f469e53f 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c | |||
@@ -57,6 +57,10 @@ static atomic_t deferred_trigger_count = ATOMIC_INIT(0); | |||
57 | static struct dentry *deferred_devices; | 57 | static struct dentry *deferred_devices; |
58 | static bool initcalls_done; | 58 | static bool initcalls_done; |
59 | 59 | ||
60 | /* Save the async probe drivers' name from kernel cmdline */ | ||
61 | #define ASYNC_DRV_NAMES_MAX_LEN 256 | ||
62 | static char async_probe_drv_names[ASYNC_DRV_NAMES_MAX_LEN]; | ||
63 | |||
60 | /* | 64 | /* |
61 | * In some cases, like suspend to RAM or hibernation, It might be reasonable | 65 | * In some cases, like suspend to RAM or hibernation, It might be reasonable |
62 | * to prohibit probing of devices as it could be unsafe. | 66 | * to prohibit probing of devices as it could be unsafe. |
@@ -674,6 +678,23 @@ int driver_probe_device(struct device_driver *drv, struct device *dev) | |||
674 | return ret; | 678 | return ret; |
675 | } | 679 | } |
676 | 680 | ||
681 | static inline bool cmdline_requested_async_probing(const char *drv_name) | ||
682 | { | ||
683 | return parse_option_str(async_probe_drv_names, drv_name); | ||
684 | } | ||
685 | |||
686 | /* The option format is "driver_async_probe=drv_name1,drv_name2,..." */ | ||
687 | static int __init save_async_options(char *buf) | ||
688 | { | ||
689 | if (strlen(buf) >= ASYNC_DRV_NAMES_MAX_LEN) | ||
690 | printk(KERN_WARNING | ||
691 | "Too long list of driver names for 'driver_async_probe'!\n"); | ||
692 | |||
693 | strlcpy(async_probe_drv_names, buf, ASYNC_DRV_NAMES_MAX_LEN); | ||
694 | return 0; | ||
695 | } | ||
696 | __setup("driver_async_probe=", save_async_options); | ||
697 | |||
677 | bool driver_allows_async_probing(struct device_driver *drv) | 698 | bool driver_allows_async_probing(struct device_driver *drv) |
678 | { | 699 | { |
679 | switch (drv->probe_type) { | 700 | switch (drv->probe_type) { |
@@ -684,6 +705,9 @@ bool driver_allows_async_probing(struct device_driver *drv) | |||
684 | return false; | 705 | return false; |
685 | 706 | ||
686 | default: | 707 | default: |
708 | if (cmdline_requested_async_probing(drv->name)) | ||
709 | return true; | ||
710 | |||
687 | if (module_requested_async_probing(drv->owner)) | 711 | if (module_requested_async_probing(drv->owner)) |
688 | return true; | 712 | return true; |
689 | 713 | ||