diff options
author | Neil Brown <neilb@suse.de> | 2008-07-15 18:58:04 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-10-16 12:24:47 -0400 |
commit | f1282c844e86db5a041afa41335b5f9eea6cec0c (patch) | |
tree | 3736285f2f7ce145fb06538d616a9c1165ffc125 /fs/sysfs/mount.c | |
parent | ec748fa9ed3fec44aeebbf86ae050b0cc7a978d9 (diff) |
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>
Diffstat (limited to 'fs/sysfs/mount.c')
-rw-r--r-- | fs/sysfs/mount.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/sysfs/mount.c b/fs/sysfs/mount.c index 14f0023984d7..ab343e371d64 100644 --- a/fs/sysfs/mount.c +++ b/fs/sysfs/mount.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/mount.h> | 16 | #include <linux/mount.h> |
17 | #include <linux/pagemap.h> | 17 | #include <linux/pagemap.h> |
18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
19 | #include <linux/module.h> | ||
19 | 20 | ||
20 | #include "sysfs.h" | 21 | #include "sysfs.h" |
21 | 22 | ||
@@ -115,3 +116,17 @@ out_err: | |||
115 | sysfs_dir_cachep = NULL; | 116 | sysfs_dir_cachep = NULL; |
116 | goto out; | 117 | goto out; |
117 | } | 118 | } |
119 | |||
120 | #undef sysfs_get | ||
121 | struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd) | ||
122 | { | ||
123 | return __sysfs_get(sd); | ||
124 | } | ||
125 | EXPORT_SYMBOL_GPL(sysfs_get); | ||
126 | |||
127 | #undef sysfs_put | ||
128 | void sysfs_put(struct sysfs_dirent *sd) | ||
129 | { | ||
130 | __sysfs_put(sd); | ||
131 | } | ||
132 | EXPORT_SYMBOL_GPL(sysfs_put); | ||