Re: [PATCH] libfs: Open code simple_commit_write into only user

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 30 Dec 2009 17:40:35 +0200 Boaz Harrosh wrote:

> 
> * simple_commit_write was only called by simple_write_end.
>   Open coding it makes it tiny bit less heavy on the arithmetic and
>   much more readable.
> 
> * While at it use zero_user() for clearing a partial page.
> * While at it add a docbook comment for simple_write_end.

Yep, thanks.


> Signed-off-by: Boaz Harrosh <bharrosh@xxxxxxxxxxx>
> ---
>  fs/libfs.c |   59 +++++++++++++++++++++++++++++++++++------------------------
>  1 files changed, 35 insertions(+), 24 deletions(-)
> 
> diff --git a/fs/libfs.c b/fs/libfs.c
> index 6e8d17e..4afb933 100644
> --- a/fs/libfs.c
> +++ b/fs/libfs.c
> @@ -370,40 +370,51 @@ int simple_write_begin(struct file *file, struct address_space *mapping,
>  	return simple_prepare_write(file, page, from, from+len);
>  }
>  
> -static int simple_commit_write(struct file *file, struct page *page,
> -			       unsigned from, unsigned to)
> -{
> -	struct inode *inode = page->mapping->host;
> -	loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to;
> -
> -	if (!PageUptodate(page))
> -		SetPageUptodate(page);
> -	/*
> -	 * No need to use i_size_read() here, the i_size
> -	 * cannot change under us because we hold the i_mutex.
> -	 */
> -	if (pos > inode->i_size)
> -		i_size_write(inode, pos);
> -	set_page_dirty(page);
> -	return 0;
> -}
> -
> +/**
> + * simple_write_end - .write_end helper for none block-device FSs

                                           for non-block-device FSes
(well, I would spell it "FSes")

> + * @available: See .write_end of address_space_operations
> + * @file: 		"
> + * @mapping: 		"
> + * @pos: 		"
> + * @len: 		"
> + * @copied: 		"
> + * @page: 		"
> + * @fsdata: 		"
> + *
> + * simple_write_end does the minimum needed for updating a page after writing is
> + * done. It has the same API signature as the .write_end of
> + * address_space_operations vector. So it can just be set onto .write_end for
> + * FSs that don't need any other processing. i_mutex is assumed to be held.

      FSes

> + * Block based filesystems should use generic_write_end().
> + * NOTE: Even though i_size might get updated by this function mark_inode_dirty

                                                         function,

> + * is not called, so a filesystem that actually does store data in .write_inode
> + * should extend on what's done here with a call to mark_inode_dirty() in the
> + * case that i_size has changed.
> + **/

    */

>  int simple_write_end(struct file *file, struct address_space *mapping,
>  			loff_t pos, unsigned len, unsigned copied,
>  			struct page *page, void *fsdata)
>  {
> -	unsigned from = pos & (PAGE_CACHE_SIZE - 1);
> +	struct inode *inode = page->mapping->host;
> +	loff_t last_pos = pos + copied;
>  
>  	/* zero the stale part of the page if we did a short copy */
>  	if (copied < len) {
> -		void *kaddr = kmap_atomic(page, KM_USER0);
> -		memset(kaddr + from + copied, 0, len - copied);
> -		flush_dcache_page(page);
> -		kunmap_atomic(kaddr, KM_USER0);
> +		unsigned from = pos & (PAGE_CACHE_SIZE - 1);
> +
> +		zero_user(page, from + copied, len - copied);
>  	}
>  
> -	simple_commit_write(file, page, from, from+copied);
> +	if (!PageUptodate(page))
> +		SetPageUptodate(page);
> +	/*
> +	 * No need to use i_size_read() here, the i_size
> +	 * cannot change under us because we hold the i_mutex.
> +	 */
> +	if (last_pos > inode->i_size)
> +		i_size_write(inode, last_pos);
>  
> +	set_page_dirty(page);
>  	unlock_page(page);
>  	page_cache_release(page);
>  
> -- 
> 1.6.5.2

---
~Randy
--
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

[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux