diff options
author | Dave Kleikamp <shaggy@austin.ibm.com> | 2005-10-03 16:32:11 -0400 |
---|---|---|
committer | Dave Kleikamp <shaggy@austin.ibm.com> | 2005-10-03 16:32:11 -0400 |
commit | ac17b8b57013a3e38d1958f66a218f15659e5752 (patch) | |
tree | f7a28ccd5bd5496f6a2284f3d77a5019dc75c820 /fs/jfs/jfs_imap.c | |
parent | ddea7be0ec8d1374f0b483a81566ed56ec9f3905 (diff) |
JFS: make special inodes play nicely with page balancing
This patch fixes up a few problems with jfs's reserved inodes.
1. There is no need for the jfs code setting the I_DIRTY bits in i_state.
I am ashamed that the code ever did this, and surprised it hasn't been
noticed until now.
2. Make sure special inodes are on an inode hash list. If the inodes are
unhashed, __mark_inode_dirty will fail to put the inode on the
superblock's dirty list, and the data will not be flushed under memory
pressure.
3. Force writing journal data to disk when metapage_writepage is unable to
write a metadata page due to pending journal I/O.
Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com>
Diffstat (limited to 'fs/jfs/jfs_imap.c')
-rw-r--r-- | fs/jfs/jfs_imap.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index 4021d46da7e3..28201b194f53 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c | |||
@@ -57,6 +57,12 @@ | |||
57 | #include "jfs_debug.h" | 57 | #include "jfs_debug.h" |
58 | 58 | ||
59 | /* | 59 | /* |
60 | * __mark_inode_dirty expects inodes to be hashed. Since we don't want | ||
61 | * special inodes in the fileset inode space, we hash them to a dummy head | ||
62 | */ | ||
63 | static HLIST_HEAD(aggregate_hash); | ||
64 | |||
65 | /* | ||
60 | * imap locks | 66 | * imap locks |
61 | */ | 67 | */ |
62 | /* iag free list lock */ | 68 | /* iag free list lock */ |
@@ -491,6 +497,8 @@ struct inode *diReadSpecial(struct super_block *sb, ino_t inum, int secondary) | |||
491 | /* release the page */ | 497 | /* release the page */ |
492 | release_metapage(mp); | 498 | release_metapage(mp); |
493 | 499 | ||
500 | hlist_add_head(&ip->i_hash, &aggregate_hash); | ||
501 | |||
494 | return (ip); | 502 | return (ip); |
495 | } | 503 | } |
496 | 504 | ||
@@ -514,8 +522,6 @@ void diWriteSpecial(struct inode *ip, int secondary) | |||
514 | ino_t inum = ip->i_ino; | 522 | ino_t inum = ip->i_ino; |
515 | struct metapage *mp; | 523 | struct metapage *mp; |
516 | 524 | ||
517 | ip->i_state &= ~I_DIRTY; | ||
518 | |||
519 | if (secondary) | 525 | if (secondary) |
520 | address = addressPXD(&sbi->ait2) >> sbi->l2nbperpage; | 526 | address = addressPXD(&sbi->ait2) >> sbi->l2nbperpage; |
521 | else | 527 | else |