sysfs: Support sysfs_notify from atomic context with new sysfs_notify_dirent
Support sysfs_notify from atomic context with new sysfs_notify_dirent sysfs_notify currently takes sysfs_mutex. This means that it cannot be called in atomic context. sysfs_mutex is sometimes held over a malloc (sysfs_rename_dir) so it can block on low memory. In md I want to be able to notify on a sysfs attribute from atomic context, and I don't want to block on low memory because I could be in the writeout path for freeing memory. So: - export the "sysfs_dirent" structure along with sysfs_get, sysfs_put and sysfs_get_dirent so I can get the sysfs_dirent that I want to notify on and hold it in an md structure. - split sysfs_notify_dirent out of sysfs_notify so the sysfs_dirent can be notified on with no blocking (just a spinlock). Signed-off-by: Neil Brown <neilb@suse.de> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
ec748fa9ed
commit
f1282c844e
@@ -16,6 +16,7 @@
|
||||
#include <linux/mount.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "sysfs.h"
|
||||
|
||||
@@ -115,3 +116,17 @@ out_err:
|
||||
sysfs_dir_cachep = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
#undef sysfs_get
|
||||
struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd)
|
||||
{
|
||||
return __sysfs_get(sd);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sysfs_get);
|
||||
|
||||
#undef sysfs_put
|
||||
void sysfs_put(struct sysfs_dirent *sd)
|
||||
{
|
||||
__sysfs_put(sd);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sysfs_put);
|
||||
|
Reference in New Issue
Block a user