Message ID | 1365498867-27782-15-git-send-email-lczerner@redhat.com |
---|---|
State | Superseded, archived |
Headers | show |
On Tue 09-04-13 11:14:23, Lukas Czerner wrote: > The discard_partial_page_buffers is no longer used anywhere so we can > simply remove it including the *_no_lock variant and > EXT4_DISCARD_PARTIAL_PG_ZERO_UNMAPPED define. > > Signed-off-by: Lukas Czerner <lczerner@redhat.com> Looks good, obviously ;) You can add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > fs/ext4/ext4.h | 8 -- > fs/ext4/inode.c | 206 ------------------------------------------------------- > 2 files changed, 0 insertions(+), 214 deletions(-) > > diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h > index 2428244..cc9020e 100644 > --- a/fs/ext4/ext4.h > +++ b/fs/ext4/ext4.h > @@ -593,11 +593,6 @@ enum { > #define EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER 0x0020 > > /* > - * Flags used by ext4_discard_partial_page_buffers > - */ > -#define EXT4_DISCARD_PARTIAL_PG_ZERO_UNMAPPED 0x0001 > - > -/* > * ioctl commands > */ > #define EXT4_IOC_GETFLAGS FS_IOC_GETFLAGS > @@ -2111,9 +2106,6 @@ extern int ext4_block_zero_page_range(handle_t *handle, > struct address_space *mapping, loff_t from, loff_t length); > extern int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode, > loff_t lstart, loff_t lend); > -extern int ext4_discard_partial_page_buffers(handle_t *handle, > - struct address_space *mapping, loff_t from, > - loff_t length, int flags); > extern int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf); > extern qsize_t *ext4_get_reserved_space(struct inode *inode); > extern void ext4_da_update_reserve_space(struct inode *inode, > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index 6003fd1..0d452c1 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -135,9 +135,6 @@ static void ext4_invalidatepage(struct page *page, unsigned int offset, > unsigned int length); > static int __ext4_journalled_writepage(struct page *page, unsigned int len); > static int ext4_bh_delay_or_unwritten(handle_t *handle, struct buffer_head *bh); > -static int ext4_discard_partial_page_buffers_no_lock(handle_t *handle, > - struct inode *inode, struct page *page, loff_t from, > - loff_t length, int flags); > > /* > * Test whether an inode is a fast symlink. > @@ -3352,209 +3349,6 @@ void ext4_set_aops(struct inode *inode) > inode->i_mapping->a_ops = &ext4_aops; > } > > - > -/* > - * ext4_discard_partial_page_buffers() > - * Wrapper function for ext4_discard_partial_page_buffers_no_lock. > - * This function finds and locks the page containing the offset > - * "from" and passes it to ext4_discard_partial_page_buffers_no_lock. > - * Calling functions that already have the page locked should call > - * ext4_discard_partial_page_buffers_no_lock directly. > - */ > -int ext4_discard_partial_page_buffers(handle_t *handle, > - struct address_space *mapping, loff_t from, > - loff_t length, int flags) > -{ > - struct inode *inode = mapping->host; > - struct page *page; > - int err = 0; > - > - page = find_or_create_page(mapping, from >> PAGE_CACHE_SHIFT, > - mapping_gfp_mask(mapping) & ~__GFP_FS); > - if (!page) > - return -ENOMEM; > - > - err = ext4_discard_partial_page_buffers_no_lock(handle, inode, page, > - from, length, flags); > - > - unlock_page(page); > - page_cache_release(page); > - return err; > -} > - > -/* > - * ext4_discard_partial_page_buffers_no_lock() > - * Zeros a page range of length 'length' starting from offset 'from'. > - * Buffer heads that correspond to the block aligned regions of the > - * zeroed range will be unmapped. Unblock aligned regions > - * will have the corresponding buffer head mapped if needed so that > - * that region of the page can be updated with the partial zero out. > - * > - * This function assumes that the page has already been locked. The > - * The range to be discarded must be contained with in the given page. > - * If the specified range exceeds the end of the page it will be shortened > - * to the end of the page that corresponds to 'from'. This function is > - * appropriate for updating a page and it buffer heads to be unmapped and > - * zeroed for blocks that have been either released, or are going to be > - * released. > - * > - * handle: The journal handle > - * inode: The files inode > - * page: A locked page that contains the offset "from" > - * from: The starting byte offset (from the beginning of the file) > - * to begin discarding > - * len: The length of bytes to discard > - * flags: Optional flags that may be used: > - * > - * EXT4_DISCARD_PARTIAL_PG_ZERO_UNMAPPED > - * Only zero the regions of the page whose buffer heads > - * have already been unmapped. This flag is appropriate > - * for updating the contents of a page whose blocks may > - * have already been released, and we only want to zero > - * out the regions that correspond to those released blocks. > - * > - * Returns zero on success or negative on failure. > - */ > -static int ext4_discard_partial_page_buffers_no_lock(handle_t *handle, > - struct inode *inode, struct page *page, loff_t from, > - loff_t length, int flags) > -{ > - ext4_fsblk_t index = from >> PAGE_CACHE_SHIFT; > - unsigned int offset = from & (PAGE_CACHE_SIZE-1); > - unsigned int blocksize, max, pos; > - ext4_lblk_t iblock; > - struct buffer_head *bh; > - int err = 0; > - > - blocksize = inode->i_sb->s_blocksize; > - max = PAGE_CACHE_SIZE - offset; > - > - if (index != page->index) > - return -EINVAL; > - > - /* > - * correct length if it does not fall between > - * 'from' and the end of the page > - */ > - if (length > max || length < 0) > - length = max; > - > - iblock = index << (PAGE_CACHE_SHIFT - inode->i_sb->s_blocksize_bits); > - > - if (!page_has_buffers(page)) > - create_empty_buffers(page, blocksize, 0); > - > - /* Find the buffer that contains "offset" */ > - bh = page_buffers(page); > - pos = blocksize; > - while (offset >= pos) { > - bh = bh->b_this_page; > - iblock++; > - pos += blocksize; > - } > - > - pos = offset; > - while (pos < offset + length) { > - unsigned int end_of_block, range_to_discard; > - > - err = 0; > - > - /* The length of space left to zero and unmap */ > - range_to_discard = offset + length - pos; > - > - /* The length of space until the end of the block */ > - end_of_block = blocksize - (pos & (blocksize-1)); > - > - /* > - * Do not unmap or zero past end of block > - * for this buffer head > - */ > - if (range_to_discard > end_of_block) > - range_to_discard = end_of_block; > - > - > - /* > - * Skip this buffer head if we are only zeroing unampped > - * regions of the page > - */ > - if (flags & EXT4_DISCARD_PARTIAL_PG_ZERO_UNMAPPED && > - buffer_mapped(bh)) > - goto next; > - > - /* If the range is block aligned, unmap */ > - if (range_to_discard == blocksize) { > - clear_buffer_dirty(bh); > - bh->b_bdev = NULL; > - clear_buffer_mapped(bh); > - clear_buffer_req(bh); > - clear_buffer_new(bh); > - clear_buffer_delay(bh); > - clear_buffer_unwritten(bh); > - clear_buffer_uptodate(bh); > - zero_user(page, pos, range_to_discard); > - BUFFER_TRACE(bh, "Buffer discarded"); > - goto next; > - } > - > - /* > - * If this block is not completely contained in the range > - * to be discarded, then it is not going to be released. Because > - * we need to keep this block, we need to make sure this part > - * of the page is uptodate before we modify it by writeing > - * partial zeros on it. > - */ > - if (!buffer_mapped(bh)) { > - /* > - * Buffer head must be mapped before we can read > - * from the block > - */ > - BUFFER_TRACE(bh, "unmapped"); > - ext4_get_block(inode, iblock, bh, 0); > - /* unmapped? It's a hole - nothing to do */ > - if (!buffer_mapped(bh)) { > - BUFFER_TRACE(bh, "still unmapped"); > - goto next; > - } > - } > - > - /* Ok, it's mapped. Make sure it's up-to-date */ > - if (PageUptodate(page)) > - set_buffer_uptodate(bh); > - > - if (!buffer_uptodate(bh)) { > - err = -EIO; > - ll_rw_block(READ, 1, &bh); > - wait_on_buffer(bh); > - /* Uhhuh. Read error. Complain and punt.*/ > - if (!buffer_uptodate(bh)) > - goto next; > - } > - > - if (ext4_should_journal_data(inode)) { > - BUFFER_TRACE(bh, "get write access"); > - err = ext4_journal_get_write_access(handle, bh); > - if (err) > - goto next; > - } > - > - zero_user(page, pos, range_to_discard); > - > - err = 0; > - if (ext4_should_journal_data(inode)) { > - err = ext4_handle_dirty_metadata(handle, inode, bh); > - } else > - mark_buffer_dirty(bh); > - > - BUFFER_TRACE(bh, "Partial buffer zeroed"); > -next: > - bh = bh->b_this_page; > - iblock++; > - pos += range_to_discard; > - } > - > - return err; > -} > - > /* > * ext4_block_truncate_page() zeroes out a mapping from file offset `from' > * up to the end of the block which corresponds to `from'. > -- > 1.7.7.6 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 2428244..cc9020e 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -593,11 +593,6 @@ enum { #define EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER 0x0020 /* - * Flags used by ext4_discard_partial_page_buffers - */ -#define EXT4_DISCARD_PARTIAL_PG_ZERO_UNMAPPED 0x0001 - -/* * ioctl commands */ #define EXT4_IOC_GETFLAGS FS_IOC_GETFLAGS @@ -2111,9 +2106,6 @@ extern int ext4_block_zero_page_range(handle_t *handle, struct address_space *mapping, loff_t from, loff_t length); extern int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode, loff_t lstart, loff_t lend); -extern int ext4_discard_partial_page_buffers(handle_t *handle, - struct address_space *mapping, loff_t from, - loff_t length, int flags); extern int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf); extern qsize_t *ext4_get_reserved_space(struct inode *inode); extern void ext4_da_update_reserve_space(struct inode *inode, diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 6003fd1..0d452c1 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -135,9 +135,6 @@ static void ext4_invalidatepage(struct page *page, unsigned int offset, unsigned int length); static int __ext4_journalled_writepage(struct page *page, unsigned int len); static int ext4_bh_delay_or_unwritten(handle_t *handle, struct buffer_head *bh); -static int ext4_discard_partial_page_buffers_no_lock(handle_t *handle, - struct inode *inode, struct page *page, loff_t from, - loff_t length, int flags); /* * Test whether an inode is a fast symlink. @@ -3352,209 +3349,6 @@ void ext4_set_aops(struct inode *inode) inode->i_mapping->a_ops = &ext4_aops; } - -/* - * ext4_discard_partial_page_buffers() - * Wrapper function for ext4_discard_partial_page_buffers_no_lock. - * This function finds and locks the page containing the offset - * "from" and passes it to ext4_discard_partial_page_buffers_no_lock. - * Calling functions that already have the page locked should call - * ext4_discard_partial_page_buffers_no_lock directly. - */ -int ext4_discard_partial_page_buffers(handle_t *handle, - struct address_space *mapping, loff_t from, - loff_t length, int flags) -{ - struct inode *inode = mapping->host; - struct page *page; - int err = 0; - - page = find_or_create_page(mapping, from >> PAGE_CACHE_SHIFT, - mapping_gfp_mask(mapping) & ~__GFP_FS); - if (!page) - return -ENOMEM; - - err = ext4_discard_partial_page_buffers_no_lock(handle, inode, page, - from, length, flags); - - unlock_page(page); - page_cache_release(page); - return err; -} - -/* - * ext4_discard_partial_page_buffers_no_lock() - * Zeros a page range of length 'length' starting from offset 'from'. - * Buffer heads that correspond to the block aligned regions of the - * zeroed range will be unmapped. Unblock aligned regions - * will have the corresponding buffer head mapped if needed so that - * that region of the page can be updated with the partial zero out. - * - * This function assumes that the page has already been locked. The - * The range to be discarded must be contained with in the given page. - * If the specified range exceeds the end of the page it will be shortened - * to the end of the page that corresponds to 'from'. This function is - * appropriate for updating a page and it buffer heads to be unmapped and - * zeroed for blocks that have been either released, or are going to be - * released. - * - * handle: The journal handle - * inode: The files inode - * page: A locked page that contains the offset "from" - * from: The starting byte offset (from the beginning of the file) - * to begin discarding - * len: The length of bytes to discard - * flags: Optional flags that may be used: - * - * EXT4_DISCARD_PARTIAL_PG_ZERO_UNMAPPED - * Only zero the regions of the page whose buffer heads - * have already been unmapped. This flag is appropriate - * for updating the contents of a page whose blocks may - * have already been released, and we only want to zero - * out the regions that correspond to those released blocks. - * - * Returns zero on success or negative on failure. - */ -static int ext4_discard_partial_page_buffers_no_lock(handle_t *handle, - struct inode *inode, struct page *page, loff_t from, - loff_t length, int flags) -{ - ext4_fsblk_t index = from >> PAGE_CACHE_SHIFT; - unsigned int offset = from & (PAGE_CACHE_SIZE-1); - unsigned int blocksize, max, pos; - ext4_lblk_t iblock; - struct buffer_head *bh; - int err = 0; - - blocksize = inode->i_sb->s_blocksize; - max = PAGE_CACHE_SIZE - offset; - - if (index != page->index) - return -EINVAL; - - /* - * correct length if it does not fall between - * 'from' and the end of the page - */ - if (length > max || length < 0) - length = max; - - iblock = index << (PAGE_CACHE_SHIFT - inode->i_sb->s_blocksize_bits); - - if (!page_has_buffers(page)) - create_empty_buffers(page, blocksize, 0); - - /* Find the buffer that contains "offset" */ - bh = page_buffers(page); - pos = blocksize; - while (offset >= pos) { - bh = bh->b_this_page; - iblock++; - pos += blocksize; - } - - pos = offset; - while (pos < offset + length) { - unsigned int end_of_block, range_to_discard; - - err = 0; - - /* The length of space left to zero and unmap */ - range_to_discard = offset + length - pos; - - /* The length of space until the end of the block */ - end_of_block = blocksize - (pos & (blocksize-1)); - - /* - * Do not unmap or zero past end of block - * for this buffer head - */ - if (range_to_discard > end_of_block) - range_to_discard = end_of_block; - - - /* - * Skip this buffer head if we are only zeroing unampped - * regions of the page - */ - if (flags & EXT4_DISCARD_PARTIAL_PG_ZERO_UNMAPPED && - buffer_mapped(bh)) - goto next; - - /* If the range is block aligned, unmap */ - if (range_to_discard == blocksize) { - clear_buffer_dirty(bh); - bh->b_bdev = NULL; - clear_buffer_mapped(bh); - clear_buffer_req(bh); - clear_buffer_new(bh); - clear_buffer_delay(bh); - clear_buffer_unwritten(bh); - clear_buffer_uptodate(bh); - zero_user(page, pos, range_to_discard); - BUFFER_TRACE(bh, "Buffer discarded"); - goto next; - } - - /* - * If this block is not completely contained in the range - * to be discarded, then it is not going to be released. Because - * we need to keep this block, we need to make sure this part - * of the page is uptodate before we modify it by writeing - * partial zeros on it. - */ - if (!buffer_mapped(bh)) { - /* - * Buffer head must be mapped before we can read - * from the block - */ - BUFFER_TRACE(bh, "unmapped"); - ext4_get_block(inode, iblock, bh, 0); - /* unmapped? It's a hole - nothing to do */ - if (!buffer_mapped(bh)) { - BUFFER_TRACE(bh, "still unmapped"); - goto next; - } - } - - /* Ok, it's mapped. Make sure it's up-to-date */ - if (PageUptodate(page)) - set_buffer_uptodate(bh); - - if (!buffer_uptodate(bh)) { - err = -EIO; - ll_rw_block(READ, 1, &bh); - wait_on_buffer(bh); - /* Uhhuh. Read error. Complain and punt.*/ - if (!buffer_uptodate(bh)) - goto next; - } - - if (ext4_should_journal_data(inode)) { - BUFFER_TRACE(bh, "get write access"); - err = ext4_journal_get_write_access(handle, bh); - if (err) - goto next; - } - - zero_user(page, pos, range_to_discard); - - err = 0; - if (ext4_should_journal_data(inode)) { - err = ext4_handle_dirty_metadata(handle, inode, bh); - } else - mark_buffer_dirty(bh); - - BUFFER_TRACE(bh, "Partial buffer zeroed"); -next: - bh = bh->b_this_page; - iblock++; - pos += range_to_discard; - } - - return err; -} - /* * ext4_block_truncate_page() zeroes out a mapping from file offset `from' * up to the end of the block which corresponds to `from'.
The discard_partial_page_buffers is no longer used anywhere so we can simply remove it including the *_no_lock variant and EXT4_DISCARD_PARTIAL_PG_ZERO_UNMAPPED define. Signed-off-by: Lukas Czerner <lczerner@redhat.com> --- fs/ext4/ext4.h | 8 -- fs/ext4/inode.c | 206 ------------------------------------------------------- 2 files changed, 0 insertions(+), 214 deletions(-)