Re: [PATCH v3 14/18] ext4: remove unuseddiscard_partial_page_buffers

From: Jan Kara
Date: Fri Apr 19 2013 - 01:22:24 EST


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@xxxxxxxxxx>
Looks good, obviously ;) You can add:
Reviewed-by: Jan Kara <jack@xxxxxxx>

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@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Jan Kara <jack@xxxxxxx>
SUSE Labs, CR
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/