diff options
Diffstat (limited to 'fs/pstore/inode.c')
-rw-r--r-- | fs/pstore/inode.c | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index 893b961dcfd8..379a02dc1217 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/highmem.h> | 24 | #include <linux/highmem.h> |
25 | #include <linux/time.h> | 25 | #include <linux/time.h> |
26 | #include <linux/init.h> | 26 | #include <linux/init.h> |
27 | #include <linux/list.h> | ||
27 | #include <linux/string.h> | 28 | #include <linux/string.h> |
28 | #include <linux/mount.h> | 29 | #include <linux/mount.h> |
29 | #include <linux/ramfs.h> | 30 | #include <linux/ramfs.h> |
@@ -32,13 +33,18 @@ | |||
32 | #include <linux/magic.h> | 33 | #include <linux/magic.h> |
33 | #include <linux/pstore.h> | 34 | #include <linux/pstore.h> |
34 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
36 | #include <linux/spinlock.h> | ||
35 | #include <linux/uaccess.h> | 37 | #include <linux/uaccess.h> |
36 | 38 | ||
37 | #include "internal.h" | 39 | #include "internal.h" |
38 | 40 | ||
39 | #define PSTORE_NAMELEN 64 | 41 | #define PSTORE_NAMELEN 64 |
40 | 42 | ||
43 | static DEFINE_SPINLOCK(allpstore_lock); | ||
44 | static LIST_HEAD(allpstore); | ||
45 | |||
41 | struct pstore_private { | 46 | struct pstore_private { |
47 | struct list_head list; | ||
42 | struct pstore_info *psi; | 48 | struct pstore_info *psi; |
43 | enum pstore_type_id type; | 49 | enum pstore_type_id type; |
44 | u64 id; | 50 | u64 id; |
@@ -81,8 +87,16 @@ static int pstore_unlink(struct inode *dir, struct dentry *dentry) | |||
81 | 87 | ||
82 | static void pstore_evict_inode(struct inode *inode) | 88 | static void pstore_evict_inode(struct inode *inode) |
83 | { | 89 | { |
90 | struct pstore_private *p = inode->i_private; | ||
91 | unsigned long flags; | ||
92 | |||
84 | end_writeback(inode); | 93 | end_writeback(inode); |
85 | kfree(inode->i_private); | 94 | if (p) { |
95 | spin_lock_irqsave(&allpstore_lock, flags); | ||
96 | list_del(&p->list); | ||
97 | spin_unlock_irqrestore(&allpstore_lock, flags); | ||
98 | kfree(p); | ||
99 | } | ||
86 | } | 100 | } |
87 | 101 | ||
88 | static const struct inode_operations pstore_dir_inode_operations = { | 102 | static const struct inode_operations pstore_dir_inode_operations = { |
@@ -182,9 +196,23 @@ int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id, | |||
182 | struct dentry *root = pstore_sb->s_root; | 196 | struct dentry *root = pstore_sb->s_root; |
183 | struct dentry *dentry; | 197 | struct dentry *dentry; |
184 | struct inode *inode; | 198 | struct inode *inode; |
185 | int rc; | 199 | int rc = 0; |
186 | char name[PSTORE_NAMELEN]; | 200 | char name[PSTORE_NAMELEN]; |
187 | struct pstore_private *private; | 201 | struct pstore_private *private, *pos; |
202 | unsigned long flags; | ||
203 | |||
204 | spin_lock_irqsave(&allpstore_lock, flags); | ||
205 | list_for_each_entry(pos, &allpstore, list) { | ||
206 | if (pos->type == type && | ||
207 | pos->id == id && | ||
208 | pos->psi == psi) { | ||
209 | rc = -EEXIST; | ||
210 | break; | ||
211 | } | ||
212 | } | ||
213 | spin_unlock_irqrestore(&allpstore_lock, flags); | ||
214 | if (rc) | ||
215 | return rc; | ||
188 | 216 | ||
189 | rc = -ENOMEM; | 217 | rc = -ENOMEM; |
190 | inode = pstore_get_inode(pstore_sb, root->d_inode, S_IFREG | 0444, 0); | 218 | inode = pstore_get_inode(pstore_sb, root->d_inode, S_IFREG | 0444, 0); |
@@ -229,6 +257,10 @@ int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id, | |||
229 | 257 | ||
230 | d_add(dentry, inode); | 258 | d_add(dentry, inode); |
231 | 259 | ||
260 | spin_lock_irqsave(&allpstore_lock, flags); | ||
261 | list_add(&private->list, &allpstore); | ||
262 | spin_unlock_irqrestore(&allpstore_lock, flags); | ||
263 | |||
232 | mutex_unlock(&root->d_inode->i_mutex); | 264 | mutex_unlock(&root->d_inode->i_mutex); |
233 | 265 | ||
234 | return 0; | 266 | return 0; |
@@ -277,7 +309,7 @@ int pstore_fill_super(struct super_block *sb, void *data, int silent) | |||
277 | goto fail; | 309 | goto fail; |
278 | } | 310 | } |
279 | 311 | ||
280 | pstore_get_records(); | 312 | pstore_get_records(0); |
281 | 313 | ||
282 | return 0; | 314 | return 0; |
283 | fail: | 315 | fail: |