remove some buffer-based writeout functions
Subsystems (6)
PATCH 1/1 remove some buffer-based writeout functions
Remove writeout_one_page(), waitfor_one_page() and the now-unused generic_buffer_fdatasync().
Add new
write_one_page(struct page *page, int wait)
which is exported to modules. Update callers to use that. It's only used for IS_SYNC operations.
=====================================
fs/buffer.c renamed from fs/buffer.c~cleanup-020-write_one_page +0 -43
@@ -1896,49 +1896,6 @@ int block_write_full_page(struct page *preturn __block_write_full_page (inode, page, get_block); } -/* -* Commence writeout of all the buffers against a page. The -* page must be locked. Returns zero on success or a negative -* errno. -*/ -int writeout_one_page (struct page *page) -{ -struct buffer_head *const head =page_buffers (page); -struct buffer_head *arr[MAX_BUF_PER_PAGE ]; -struct buffer_head *bh; -int nr =0 ; -BUG_ON (!PageLocked (page)); - bh = head; -do { -if (!buffer_locked (bh) &&buffer_dirty (bh) && -buffer_mapped (bh) &&buffer_uptodate (bh)) - arr[nr++] = bh; - }while ((bh = bh->b_this_page) != head); -if (nr) -ll_rw_block (WRITE , nr, arr); -return 0 ; -} -EXPORT_SYMBOL (writeout_one_page); - -/* -* Wait for completion of I/O of all buffers against a page. The page -* must be locked. Returns zero on success or a negative errno. -*/ -int waitfor_one_page (struct page *page) -{ -int error =0 ; -struct buffer_head *bh, *head =page_buffers (page); - - bh = head; -do { -wait_on_buffer (bh); -if (buffer_req (bh) && !buffer_uptodate (bh)) - error = -EIO ; - }while ((bh = bh->b_this_page) != head); -return error; -} -EXPORT_SYMBOL (waitfor_one_page); -sector_t generic_block_bmap (struct address_space *mapping,sector_t block,get_block_t *get_block) {
mm/page-writeback.c renamed from mm/page-writeback.c~cleanup-020-write_one_page +39 -0
@@ -375,6 +375,45 @@ int generic_writeback_mapping(struct add }EXPORT_SYMBOL (generic_writeback_mapping); +/** +* write_one_page - write out a single page and optionally wait on I/O +* +* @page - the page to write +* @wait - if true, wait on writeout +* +* The page must be locked by the caller and will come unlocked when I/O +* completes. +* +* write_one_page() returns a negative error code if I/O failed. +*/ +int write_one_page (struct page *page,int wait) +{ +struct address_space *mapping = page->mapping; +int ret =0 ; + +BUG_ON (!PageLocked (page)); + +write_lock (&mapping->page_lock); +list_del (&page->list); +list_add (&page->list, &mapping->locked_pages); +write_unlock (&mapping->page_lock); + +if (TestClearPageDirty (page)) { +page_cache_get (page); + ret = mapping->a_ops->writepage (page); +if (ret ==0 && wait) { +wait_on_page (page); +if (PageError (page)) + ret = -EIO ; + } +page_cache_release (page); + }else { +unlock_page (page); + } +return ret; +} +EXPORT_SYMBOL (write_one_page); +/* * Add a page to the dirty page list. *
include/linux/mm.h renamed from include/linux/mm.h~cleanup-020-write_one_page +1 -0
@@ -449,6 +449,7 @@ extern struct page *filemap_nopage(struc/* mm/page-writeback.c */ int generic_writeback_mapping (struct address_space *mapping,int *nr_to_write); +int write_one_page (struct page *page,int wait);/* readahead.c */ #define VM_MAX_READAHEAD 128/* kbytes */
fs/ext2/dir.c renamed from fs/ext2/dir.c~cleanup-020-write_one_page +11 -14
@@ -67,13 +67,10 @@ static int ext2_commit_chunk(struct pageint err =0 ; dir->i_version = ++event; page->mapping->a_ops->commit_write (NULL , page, from, to); -if (IS_SYNC (dir)) { -int err2; - err =writeout_one_page (page); - err2 =waitfor_one_page (page); -if (err ==0 ) - err = err2; - } +if (IS_SYNC (dir)) + err =write_one_page (page,1 ); +else +unlock_page (page);return err; }
@@ -417,7 +414,6 @@ void ext2_set_link(struct inode *dir, st de->inode =cpu_to_le32 (inode->i_ino);ext2_set_de_type (de, inode); err =ext2_commit_chunk (page, from, to); -unlock_page (page);ext2_put_page (page); dir->i_mtime = dir->i_ctime =CURRENT_TIME ;mark_inode_dirty (dir);
@@ -511,11 +507,13 @@ got_it: dir->i_mtime = dir->i_ctime =CURRENT_TIME ;mark_inode_dirty (dir);/* OFFSET_CACHE */ -out_unlock: -unlock_page (page); +out_put:ext2_put_page (page); out:return err; +out_unlock: +unlock_page (page); + goto out_put; }/*
@@ -553,7 +551,6 @@ int ext2_delete_entry (struct ext2_dir_e pde->rec_len =cpu_to_le16 (to-from); dir->inode =0 ; err =ext2_commit_chunk (page, from, to); -unlock_page (page); inode->i_ctime = inode->i_mtime =CURRENT_TIME ;mark_inode_dirty (inode); out:
@@ -576,9 +573,10 @@ int ext2_make_empty(struct inode *inode,if (!page)return -ENOMEM ; err = mapping->a_ops->prepare_write (NULL , page,0 , chunk_size); -if (err) +if (err) { +unlock_page (page); goto fail; - + } base =page_address (page); de = (struct ext2_dir_entry_2 *) base;
@@ -597,7 +595,6 @@ int ext2_make_empty(struct inode *inode, err =ext2_commit_chunk (page,0 , chunk_size); fail: -unlock_page (page);page_cache_release (page);return err; }
fs/jfs/jfs_metapage.c renamed from fs/jfs/jfs_metapage.c~cleanup-020-write_one_page +4 -6
@@ -489,12 +489,10 @@ static inline void sync_metapage(metapaglock_page (page);/* we're done with this page - no need to check for errors */ -if (page_has_buffers (page)) { -writeout_one_page (page); -waitfor_one_page (page); - } - -unlock_page (page); +if (page_has_buffers (page)) +write_one_page (page,1 ); +else +unlock_page (page);page_cache_release (page); }
fs/minix/dir.c renamed from fs/minix/dir.c~cleanup-020-write_one_page +15 -13
@@ -48,13 +48,10 @@ static int dir_commit_chunk(struct pagestruct inode *dir = (struct inode *)page->mapping->host;int err =0 ; page->mapping->a_ops->commit_write (NULL , page, from, to); -if (IS_SYNC (dir)) { -int err2; - err =writeout_one_page (page); - err2 =waitfor_one_page (page); -if (err ==0 ) - err = err2; - } +if (IS_SYNC (dir)) + err =write_one_page (page,1 ); +else +unlock_page (page);return err; }
@@ -247,11 +244,13 @@ got_it: err =dir_commit_chunk (page, from, to); dir->i_mtime = dir->i_ctime =CURRENT_TIME ;mark_inode_dirty (dir); -out_unlock: -unlock_page (page); +out_put:dir_put_page (page); out:return err; +out_unlock: +unlock_page (page); + goto out_put; }int minix_delete_entry (struct minix_dir_entry *de,struct page *page)
@@ -268,8 +267,9 @@ int minix_delete_entry(struct minix_dir_if (err ==0 ) { de->inode =0 ; err =dir_commit_chunk (page, from, to); + }else { +unlock_page (page); } -unlock_page (page);dir_put_page (page); inode->i_ctime = inode->i_mtime =CURRENT_TIME ;mark_inode_dirty (inode);
@@ -288,8 +288,10 @@ int minix_make_empty(struct inode *inodeif (!page)return -ENOMEM ; err = mapping->a_ops->prepare_write (NULL , page,0 ,2 * sbi->s_dirsize); -if (err) +if (err) { +unlock_page (page); goto fail; + } base = (char *)page_address (page);memset (base,0 ,PAGE_CACHE_SIZE );
@@ -303,7 +305,6 @@ int minix_make_empty(struct inode *inode err =dir_commit_chunk (page,0 ,2 * sbi->s_dirsize); fail: -unlock_page (page);page_cache_release (page);return err; }
@@ -368,8 +369,9 @@ void minix_set_link(struct minix_dir_entif (err ==0 ) { de->inode = inode->i_ino; err =dir_commit_chunk (page, from, to); + }else { +unlock_page (page); } -unlock_page (page);dir_put_page (page); dir->i_mtime = dir->i_ctime =CURRENT_TIME ;mark_inode_dirty (dir);
fs/sysv/dir.c renamed from fs/sysv/dir.c~cleanup-020-write_one_page +10 -13
@@ -42,13 +42,10 @@ static int dir_commit_chunk(struct pageint err =0 ; page->mapping->a_ops->commit_write (NULL , page, from, to); -if (IS_SYNC (dir)) { -int err2; - err =writeout_one_page (page); - err2 =waitfor_one_page (page); -if (err ==0 ) - err = err2; - } +if (IS_SYNC (dir)) + err =write_one_page (page,1 ); +else +unlock_page (page);return err; }
@@ -232,12 +229,13 @@ got_it: err =dir_commit_chunk (page, from, to); dir->i_mtime = dir->i_ctime =CURRENT_TIME ;mark_inode_dirty (dir); -out_unlock: -unlock_page (page); out_page:dir_put_page (page); out:return err; +out_unlock: +unlock_page (page); + goto out_page; }int sysv_delete_entry (struct sysv_dir_entry *de,struct page *page)
@@ -255,7 +253,6 @@ int sysv_delete_entry(struct sysv_dir_enBUG (); de->inode =0 ; err =dir_commit_chunk (page, from, to); -unlock_page (page);dir_put_page (page); inode->i_ctime = inode->i_mtime =CURRENT_TIME ;mark_inode_dirty (inode);
@@ -273,8 +270,10 @@ int sysv_make_empty(struct inode *inode,if (!page)return -ENOMEM ; err = mapping->a_ops->prepare_write (NULL , page,0 ,2 *SYSV_DIRSIZE ); -if (err) +if (err) { +unlock_page (page); goto fail; + } base = (char *)page_address (page);memset (base,0 ,PAGE_CACHE_SIZE );
@@ -288,7 +287,6 @@ int sysv_make_empty(struct inode *inode, err =dir_commit_chunk (page,0 ,2 *SYSV_DIRSIZE ); fail: -unlock_page (page);page_cache_release (page);return err; }
@@ -352,7 +350,6 @@ void sysv_set_link(struct sysv_dir_entryBUG (); de->inode =cpu_to_fs16 (inode->i_sb, inode->i_ino); err =dir_commit_chunk (page, from, to); -unlock_page (page);dir_put_page (page); dir->i_mtime = dir->i_ctime =CURRENT_TIME ;mark_inode_dirty (dir);
include/linux/fs.h renamed from include/linux/fs.h~cleanup-020-write_one_page +0 -3
@@ -1559,8 +1559,6 @@ sector_t generic_block_bmap(struct addreint generic_commit_write (struct file *,struct page *,unsigned ,unsigned );int block_truncate_page (struct address_space *,loff_t ,get_block_t *);extern int generic_direct_IO (int ,struct inode *,struct kiobuf *,unsigned long ,int ,get_block_t *); -extern int waitfor_one_page (struct page *); -extern int writeout_one_page (struct page *);extern int generic_file_mmap (struct file *,struct vm_area_struct *);extern int file_read_actor (read_descriptor_t * desc,struct page *page,unsigned long offset,unsigned long size);
@@ -1613,7 +1611,6 @@ extern ssize_t char_write(struct file *,extern ssize_t block_write (struct file *,const char *,size_t ,loff_t *);extern int file_fsync (struct file *,struct dentry *,int ); -extern int generic_buffer_fdatasync (struct inode *inode,unsigned long start_idx,unsigned long end_idx);extern int generic_osync_inode (struct inode *,int );#define OSYNC_METADATA (1<<0)#define OSYNC_DATA (1<<1)
mm/filemap.c renamed from mm/filemap.c~cleanup-020-write_one_page +0 -70
76 lines not on this page · raw message
kernel/ksyms.c renamed from kernel/ksyms.c~cleanup-020-write_one_page +0 -1
@@ -224,7 +224,6 @@ EXPORT_SYMBOL(do_generic_file_read);EXPORT_SYMBOL (generic_file_write);EXPORT_SYMBOL (generic_file_mmap);EXPORT_SYMBOL (generic_ro_fops); -EXPORT_SYMBOL (generic_buffer_fdatasync);EXPORT_SYMBOL (file_lock_list);EXPORT_SYMBOL (locks_init_lock);EXPORT_SYMBOL (locks_copy_lock);