driver core: introduce devtmpfs_wait_for_dev() v1
PATCH 1/2 driver core: introduce devtmpfs_wait_for_dev() v1
From: Ming Lei <[email protected]>
This patch introduces devtmpfs_wait_for_dev(), which is based on devtmpfs and can be used to remove polling for root device before mounting rootfs.
This patch also gives a generic and simple way to wait for a device in kernel mode based on devtmpfs.
This version takes Kay Sievers's suggestion: pass relative path to devtmpfs_wait_for_dev(), for devtmpfs has no clue where it is mounted.
--- drivers/base/devtmpfs.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++ include/linux/device.h | 7 ++++++ 2 files changed, 57 insertions(+), 0 deletions(-)
drivers/base/devtmpfs.c +50 -0
@@ -30,6 +30,9 @@ static int dev_mount = 1;static int dev_mount;#endif +static DECLARE_WAIT_QUEUE_HEAD (devtmpfs_waitqueue); + +static int __init mount_param (char *str) { dev_mount =simple_strtoul (str,NULL ,0 );
@@ -178,6 +181,10 @@ int devtmpfs_create_node(struct device *dev)path_put (&nd.path); out: +/*notify others that we have created a dev node*/ +if (!err) +wake_up (&devtmpfs_waitqueue); +kfree (tmp);revert_creds (curr_cred);return err;
@@ -310,6 +317,49 @@ out:return err; } +static int devtmpfs_query_dev (const char *nodename) +{ +const struct cred *curr_cred; +struct nameidata nd; +struct dentry *dentry; +int err; + +if (!dev_mnt) +return -ENOENT ; + + curr_cred =override_creds (&init_cred); + err =vfs_path_lookup (dev_mnt->mnt_root, dev_mnt, + nodename,LOOKUP_PARENT , &nd); +if (err) + goto out; + +mutex_lock_nested (&nd.path.dentry->d_inode->i_mutex,I_MUTEX_PARENT ); + dentry =lookup_one_len (nd.last.name, nd.path.dentry, nd.last.len); +if (!IS_ERR (dentry)) { +if (dentry->d_inode) + err =0 ; +else + err = -ENOENT ; +dput (dentry); + }else { + err =PTR_ERR (dentry); + } +mutex_unlock (&nd.path.dentry->d_inode->i_mutex); + +path_put (&nd.path); +out: +revert_creds (curr_cred); +return err; +} + +int devtmpfs_wait_for_dev (const char *dev_name,unsigned long seconds) +{ + +return wait_event_timeout (devtmpfs_waitqueue, +devtmpfs_query_dev (dev_name) ==0 , + seconds*HZ ); +} +/* * If configured, or requested by the commandline, devtmpfs will be * auto-mounted after the kernel mounted the root filesystem.
include/linux/device.h +7 -0
@@ -557,10 +557,17 @@ extern void wait_for_device_probe(void);extern int devtmpfs_create_node (struct device *dev);extern int devtmpfs_delete_node (struct device *dev);extern int devtmpfs_mount (const char *mountpoint); +extern int devtmpfs_wait_for_dev (const char *dev_path, +unsigned long seconds);#else static inline int devtmpfs_create_node (struct device *dev) {return 0 ; }static inline int devtmpfs_delete_node (struct device *dev) {return 0 ; }static inline int devtmpfs_mount (const char *mountpoint) {return 0 ; } +static inline int devtmpfs_wait_for_dev (const char *dev_path, +unsigned long seconds) +{ +return 0 ; +}#endif /* drivers/base/power/shutdown.c */
Signature · 1 line
1.6.0.GIT
2009/8/6 <[email protected]>:
Quoted 5 lines
From: Ming Lei <[email protected]>
This patch introduces
devtmpfs_wait_for_dev(), which is based on devtmpfs and can be used to remove polling for root device before mounting rootfs.
Quoted 8 lines
This patch also gives a generic and simple way to wait for a device in kernel mode based on devtmpfs.
This version takes Kay Sievers's suggestion: pass relative path to
devtmpfs_wait_for_dev(), for devtmpfs has no clue where it is mounted.Signed-off-by Ming Lei <[email protected]>
Hi, Greg
Since devtmpfs has been merged into mainline, would you mind queuing the 2 patches into your tree now?
Thanks.
Signature · 1 line
Lei Ming
Quoted 13 lines · Ming Lei
2009/8/6 <[email protected]>:
Quoted 12 lines
From: Ming Lei <[email protected]>
This patch introduces
devtmpfs_wait_for_dev(), which is based on devtmpfs and can be used to remove polling for root device before mounting rootfs.This patch also gives a generic and simple way to wait for a device in kernel mode based on devtmpfs.
This version takes Kay Sievers's suggestion: pass relative path to
devtmpfs_wait_for_dev(), for devtmpfs has no clue where it is mounted.
Quoted 6 lines
Quoted 1 line
Signed-off-by Ming Lei <[email protected]>Hi, Greg
Since devtmpfs has been merged into mainline, would you mind queuing the 2 patches into your tree now?
Will do, when the linux-next tree opens back up for .33 patches.
thanks,
greg k-h