By moving the special-casing for swapper_space out of __mark_inode_dirty() and into __set_page_dirty_nobuffers() we can remove swapper_inode. fs/fs-writeback.c | 12 ++++++------ mm/page-writeback.c | 4 +++- mm/swap_state.c | 9 --------- 3 files changed, 9 insertions(+), 16 deletions(-) diff -puN fs/fs-writeback.c~remove-swapper_inode fs/fs-writeback.c --- 25/fs/fs-writeback.c~remove-swapper_inode 2003-06-13 02:02:55.000000000 -0700 +++ 25-akpm/fs/fs-writeback.c 2003-06-13 02:02:55.000000000 -0700 @@ -49,9 +49,6 @@ void __mark_inode_dirty(struct inode *in { struct super_block *sb = inode->i_sb; - if (!sb) - return; /* swapper_space */ - /* * Don't do this for I_DIRTY_PAGES - that doesn't actually * dirty the inode itself @@ -90,9 +87,12 @@ void __mark_inode_dirty(struct inode *in * Only add valid (hashed) inodes to the superblock's * dirty list. Add blockdev inodes as well. */ - if ((hlist_unhashed(&inode->i_hash) || (inode->i_state & (I_FREEING|I_CLEAR))) - && !S_ISBLK(inode->i_mode)) - goto out; + if (!S_ISBLK(inode->i_mode)) { + if (hlist_unhashed(&inode->i_hash)) + goto out; + if (inode->i_state & (I_FREEING|I_CLEAR)) + goto out; + } /* * If the inode was already on s_dirty or s_io, don't diff -puN mm/page-writeback.c~remove-swapper_inode mm/page-writeback.c --- 25/mm/page-writeback.c~remove-swapper_inode 2003-06-13 02:02:55.000000000 -0700 +++ 25-akpm/mm/page-writeback.c 2003-06-13 02:02:55.000000000 -0700 @@ -524,7 +524,9 @@ int __set_page_dirty_nobuffers(struct pa list_add(&page->list, &mapping->dirty_pages); } spin_unlock(&mapping->page_lock); - __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); + if (!PageSwapCache(page)) + __mark_inode_dirty(mapping->host, + I_DIRTY_PAGES); } } return ret; diff -puN mm/swap_state.c~remove-swapper_inode mm/swap_state.c --- 25/mm/swap_state.c~remove-swapper_inode 2003-06-13 02:02:55.000000000 -0700 +++ 25-akpm/mm/swap_state.c 2003-06-13 02:02:55.000000000 -0700 @@ -16,14 +16,6 @@ #include -/* - * swapper_inode doesn't do anything much. It is really only here to - * avoid some special-casing in other parts of the kernel. - */ -static struct inode swapper_inode = { - .i_mapping = &swapper_space, -}; - static struct backing_dev_info swap_backing_dev_info = { .ra_pages = 0, /* No readahead */ .memory_backed = 1, /* Does not contribute to dirty memory */ @@ -38,7 +30,6 @@ struct address_space swapper_space = { .dirty_pages = LIST_HEAD_INIT(swapper_space.dirty_pages), .io_pages = LIST_HEAD_INIT(swapper_space.io_pages), .locked_pages = LIST_HEAD_INIT(swapper_space.locked_pages), - .host = &swapper_inode, .a_ops = &swap_aops, .backing_dev_info = &swap_backing_dev_info, .i_mmap = LIST_HEAD_INIT(swapper_space.i_mmap), _