diff options
author | David Woodhouse <dwmw2@infradead.org> | 2005-02-27 18:01:36 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@mtd.linutronix.de> | 2005-05-23 06:46:14 -0400 |
commit | 67e345d17ff8c2085a54c293001ae548f7be7b21 (patch) | |
tree | 07f2829e98c22c5d1edd8832a06a11cbdde85f24 /fs/jffs2/readinode.c | |
parent | 002fa30170f9500ac31fa22931c689029af7f27b (diff) |
[JFFS2] Prevent ino cache removal for inodes in use
Don't remove inocache for inodes which are in read_inode() or
clear_inode() until they're done.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'fs/jffs2/readinode.c')
-rw-r--r-- | fs/jffs2/readinode.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c index aca4a0b17bcd..a1980a9da531 100644 --- a/fs/jffs2/readinode.c +++ b/fs/jffs2/readinode.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * | 7 | * |
8 | * For licensing information, see the file 'LICENCE' in this directory. | 8 | * For licensing information, see the file 'LICENCE' in this directory. |
9 | * | 9 | * |
10 | * $Id: readinode.c,v 1.117 2004/11/20 18:06:54 dwmw2 Exp $ | 10 | * $Id: readinode.c,v 1.118 2005/02/27 23:01:33 dwmw2 Exp $ |
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
@@ -672,6 +672,9 @@ void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f) | |||
672 | down(&f->sem); | 672 | down(&f->sem); |
673 | deleted = f->inocache && !f->inocache->nlink; | 673 | deleted = f->inocache && !f->inocache->nlink; |
674 | 674 | ||
675 | if (f->inocache && f->inocache->state != INO_STATE_CHECKING) | ||
676 | jffs2_set_inocache_state(c, f->inocache, INO_STATE_CLEARING); | ||
677 | |||
675 | if (f->metadata) { | 678 | if (f->metadata) { |
676 | if (deleted) | 679 | if (deleted) |
677 | jffs2_mark_node_obsolete(c, f->metadata->raw); | 680 | jffs2_mark_node_obsolete(c, f->metadata->raw); |
@@ -688,8 +691,11 @@ void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f) | |||
688 | jffs2_free_full_dirent(fd); | 691 | jffs2_free_full_dirent(fd); |
689 | } | 692 | } |
690 | 693 | ||
691 | if (f->inocache && f->inocache->state != INO_STATE_CHECKING) | 694 | if (f->inocache && f->inocache->state != INO_STATE_CHECKING) { |
692 | jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT); | 695 | jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT); |
696 | if (f->inocache->nodes == (void *)f->inocache) | ||
697 | jffs2_del_ino_cache(c, f->inocache); | ||
698 | } | ||
693 | 699 | ||
694 | up(&f->sem); | 700 | up(&f->sem); |
695 | } | 701 | } |