提交 ac17b8b5 编写于 作者: D Dave Kleikamp

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: NDave Kleikamp <shaggy@austin.ibm.com>
上级 ddea7be0
...@@ -305,7 +305,6 @@ int dbSync(struct inode *ipbmap) ...@@ -305,7 +305,6 @@ int dbSync(struct inode *ipbmap)
filemap_fdatawrite(ipbmap->i_mapping); filemap_fdatawrite(ipbmap->i_mapping);
filemap_fdatawait(ipbmap->i_mapping); filemap_fdatawait(ipbmap->i_mapping);
ipbmap->i_state |= I_DIRTY;
diWriteSpecial(ipbmap, 0); diWriteSpecial(ipbmap, 0);
return (0); return (0);
......
...@@ -56,6 +56,12 @@ ...@@ -56,6 +56,12 @@
#include "jfs_superblock.h" #include "jfs_superblock.h"
#include "jfs_debug.h" #include "jfs_debug.h"
/*
* __mark_inode_dirty expects inodes to be hashed. Since we don't want
* special inodes in the fileset inode space, we hash them to a dummy head
*/
static HLIST_HEAD(aggregate_hash);
/* /*
* imap locks * imap locks
*/ */
...@@ -491,6 +497,8 @@ struct inode *diReadSpecial(struct super_block *sb, ino_t inum, int secondary) ...@@ -491,6 +497,8 @@ struct inode *diReadSpecial(struct super_block *sb, ino_t inum, int secondary)
/* release the page */ /* release the page */
release_metapage(mp); release_metapage(mp);
hlist_add_head(&ip->i_hash, &aggregate_hash);
return (ip); return (ip);
} }
...@@ -514,8 +522,6 @@ void diWriteSpecial(struct inode *ip, int secondary) ...@@ -514,8 +522,6 @@ void diWriteSpecial(struct inode *ip, int secondary)
ino_t inum = ip->i_ino; ino_t inum = ip->i_ino;
struct metapage *mp; struct metapage *mp;
ip->i_state &= ~I_DIRTY;
if (secondary) if (secondary)
address = addressPXD(&sbi->ait2) >> sbi->l2nbperpage; address = addressPXD(&sbi->ait2) >> sbi->l2nbperpage;
else else
......
...@@ -395,6 +395,12 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) ...@@ -395,6 +395,12 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
if (mp->nohomeok && !test_bit(META_forcewrite, &mp->flag)) { if (mp->nohomeok && !test_bit(META_forcewrite, &mp->flag)) {
redirty = 1; redirty = 1;
/*
* Make sure this page isn't blocked indefinitely.
* If the journal isn't undergoing I/O, push it
*/
if (mp->log && !(mp->log->cflag & logGC_PAGEOUT))
jfs_flush_journal(mp->log, 0);
continue; continue;
} }
......
...@@ -2396,7 +2396,6 @@ static void txUpdateMap(struct tblock * tblk) ...@@ -2396,7 +2396,6 @@ static void txUpdateMap(struct tblock * tblk)
*/ */
if (tblk->xflag & COMMIT_CREATE) { if (tblk->xflag & COMMIT_CREATE) {
diUpdatePMap(ipimap, tblk->ino, FALSE, tblk); diUpdatePMap(ipimap, tblk->ino, FALSE, tblk);
ipimap->i_state |= I_DIRTY;
/* update persistent block allocation map /* update persistent block allocation map
* for the allocation of inode extent; * for the allocation of inode extent;
*/ */
...@@ -2407,7 +2406,6 @@ static void txUpdateMap(struct tblock * tblk) ...@@ -2407,7 +2406,6 @@ static void txUpdateMap(struct tblock * tblk)
} else if (tblk->xflag & COMMIT_DELETE) { } else if (tblk->xflag & COMMIT_DELETE) {
ip = tblk->u.ip; ip = tblk->u.ip;
diUpdatePMap(ipimap, ip->i_ino, TRUE, tblk); diUpdatePMap(ipimap, ip->i_ino, TRUE, tblk);
ipimap->i_state |= I_DIRTY;
iput(ip); iput(ip);
} }
} }
......
...@@ -442,6 +442,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -442,6 +442,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
inode->i_nlink = 1; inode->i_nlink = 1;
inode->i_size = sb->s_bdev->bd_inode->i_size; inode->i_size = sb->s_bdev->bd_inode->i_size;
inode->i_mapping->a_ops = &jfs_metapage_aops; inode->i_mapping->a_ops = &jfs_metapage_aops;
insert_inode_hash(inode);
mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS); mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
sbi->direct_inode = inode; sbi->direct_inode = inode;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册