linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] libfs: Open code simple_commit_write into only user
@ 2009-12-30 15:40 Boaz Harrosh
  2009-12-30 15:57 ` Boaz Harrosh
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Boaz Harrosh @ 2009-12-30 15:40 UTC (permalink / raw)
  To: Al Viro, linux-fsdevel; +Cc: Randy Dunlap


* 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.

Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
 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
+ * @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.
+ * Block based filesystems should use generic_write_end().
+ * NOTE: Even though i_size might get updated by this function mark_inode_dirty
+ * 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


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] libfs: Open code simple_commit_write into only user
  2009-12-30 15:40 [PATCH] libfs: Open code simple_commit_write into only user Boaz Harrosh
@ 2009-12-30 15:57 ` Boaz Harrosh
  2009-12-30 17:39 ` Randy Dunlap
  2010-01-12 13:13 ` [PATCH version2] " Boaz Harrosh
  2 siblings, 0 replies; 7+ messages in thread
From: Boaz Harrosh @ 2009-12-30 15:57 UTC (permalink / raw)
  To: Al Viro, linux-fsdevel; +Cc: Randy Dunlap

On 12/30/2009 05:40 PM, 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.
> 
> Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>

Al Hi

When looking in fs/libfs.c I can see that also simple_prepare_write() is only used
once, locally, but is exported nonetheless. Has its time expired by now?

[And what does EXPORT_UNUSED_SYMBOL() means ?].

This patch was triggered by this fix:
http://marc.info/?l=linux-fsdevel&m=126193226815716&w=2

Thanks
Boaz

> ---
>  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
> + * @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.
> + * Block based filesystems should use generic_write_end().
> + * NOTE: Even though i_size might get updated by this function mark_inode_dirty
> + * 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);
>  


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] libfs: Open code simple_commit_write into only user
  2009-12-30 15:40 [PATCH] libfs: Open code simple_commit_write into only user Boaz Harrosh
  2009-12-30 15:57 ` Boaz Harrosh
@ 2009-12-30 17:39 ` Randy Dunlap
  2010-01-12 13:13 ` [PATCH version2] " Boaz Harrosh
  2 siblings, 0 replies; 7+ messages in thread
From: Randy Dunlap @ 2009-12-30 17:39 UTC (permalink / raw)
  To: Boaz Harrosh; +Cc: Al Viro, linux-fsdevel

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@panasas.com>
> ---
>  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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH version2] libfs: Open code simple_commit_write into only user
  2009-12-30 15:40 [PATCH] libfs: Open code simple_commit_write into only user Boaz Harrosh
  2009-12-30 15:57 ` Boaz Harrosh
  2009-12-30 17:39 ` Randy Dunlap
@ 2010-01-12 13:13 ` Boaz Harrosh
  2010-01-12 13:18   ` Boaz Harrosh
  2010-01-12 14:18   ` [PATCH 2/2] libfs: Unexport and kill simple_prepare_write Boaz Harrosh
  2 siblings, 2 replies; 7+ messages in thread
From: Boaz Harrosh @ 2010-01-12 13:13 UTC (permalink / raw)
  To: Al Viro, linux-fsdevel; +Cc: Randy Dunlap


* 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.

Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
 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 non-block-device 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
+ * FSes that don't need any other processing. i_mutex is assumed to be held.
+ * Block based filesystems should use generic_write_end().
+ * NOTE: Even though i_size might get updated by this function, mark_inode_dirty
+ * 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.6



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH version2] libfs: Open code simple_commit_write into only user
  2010-01-12 13:13 ` [PATCH version2] " Boaz Harrosh
@ 2010-01-12 13:18   ` Boaz Harrosh
  2010-01-12 13:28     ` Christoph Hellwig
  2010-01-12 14:18   ` [PATCH 2/2] libfs: Unexport and kill simple_prepare_write Boaz Harrosh
  1 sibling, 1 reply; 7+ messages in thread
From: Boaz Harrosh @ 2010-01-12 13:18 UTC (permalink / raw)
  To: Al Viro, linux-fsdevel; +Cc: Randy Dunlap

On 01/12/2010 03:13 PM, 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.
> 
> Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
> ---

Al should I do the same for simple_prepare_write()?

It is EXPORT_UNUSED_SYMBOL() now, could I remove that
export?

Boaz

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH version2] libfs: Open code simple_commit_write into only user
  2010-01-12 13:18   ` Boaz Harrosh
@ 2010-01-12 13:28     ` Christoph Hellwig
  0 siblings, 0 replies; 7+ messages in thread
From: Christoph Hellwig @ 2010-01-12 13:28 UTC (permalink / raw)
  To: Boaz Harrosh; +Cc: Al Viro, linux-fsdevel, Randy Dunlap

On Tue, Jan 12, 2010 at 03:18:15PM +0200, Boaz Harrosh wrote:
> Al should I do the same for simple_prepare_write()?
> 
> It is EXPORT_UNUSED_SYMBOL() now, could I remove that
> export?

Go ahead and kill it.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 2/2] libfs: Unexport and kill simple_prepare_write
  2010-01-12 13:13 ` [PATCH version2] " Boaz Harrosh
  2010-01-12 13:18   ` Boaz Harrosh
@ 2010-01-12 14:18   ` Boaz Harrosh
  1 sibling, 0 replies; 7+ messages in thread
From: Boaz Harrosh @ 2010-01-12 14:18 UTC (permalink / raw)
  To: Al Viro, linux-fsdevel; +Cc: Randy Dunlap, Christoph Hellwig


Remove the EXPORT_UNUSED_SYMBOL of simple_prepare_write

Collapse simple_prepare_write into it's only caller, though
making it simpler and clearer to understand.

Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
 fs/libfs.c         |   22 ++++++----------------
 include/linux/fs.h |    2 --
 2 files changed, 6 insertions(+), 18 deletions(-)

diff --git a/fs/libfs.c b/fs/libfs.c
index cd88abd..9e50bcf 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -338,28 +338,14 @@ int simple_readpage(struct file *file, struct page *page)
 	return 0;
 }
 
-int simple_prepare_write(struct file *file, struct page *page,
-			unsigned from, unsigned to)
-{
-	if (!PageUptodate(page)) {
-		if (to - from != PAGE_CACHE_SIZE)
-			zero_user_segments(page,
-				0, from,
-				to, PAGE_CACHE_SIZE);
-	}
-	return 0;
-}
-
 int simple_write_begin(struct file *file, struct address_space *mapping,
 			loff_t pos, unsigned len, unsigned flags,
 			struct page **pagep, void **fsdata)
 {
 	struct page *page;
 	pgoff_t index;
-	unsigned from;
 
 	index = pos >> PAGE_CACHE_SHIFT;
-	from = pos & (PAGE_CACHE_SIZE - 1);
 
 	page = grab_cache_page_write_begin(mapping, index, flags);
 	if (!page)
@@ -367,7 +353,12 @@ int simple_write_begin(struct file *file, struct address_space *mapping,
 
 	*pagep = page;
 
-	return simple_prepare_write(file, page, from, from+len);
+	if (!PageUptodate(page) && (len != PAGE_CACHE_SIZE)) {
+		unsigned from = pos & (PAGE_CACHE_SIZE - 1);
+
+		zero_user_segments(page, 0, from, from + len, PAGE_CACHE_SIZE);
+	}
+	return 0;
 }
 
 /**
@@ -864,7 +855,6 @@ EXPORT_SYMBOL(simple_getattr);
 EXPORT_SYMBOL(simple_link);
 EXPORT_SYMBOL(simple_lookup);
 EXPORT_SYMBOL(simple_pin_fs);
-EXPORT_UNUSED_SYMBOL(simple_prepare_write);
 EXPORT_SYMBOL(simple_readpage);
 EXPORT_SYMBOL(simple_release_fs);
 EXPORT_SYMBOL(simple_rename);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 9147ca8..d1e4c9d 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2340,8 +2340,6 @@ extern int simple_rename(struct inode *, struct dentry *, struct inode *, struct
 extern int simple_sync_file(struct file *, struct dentry *, int);
 extern int simple_empty(struct dentry *);
 extern int simple_readpage(struct file *file, struct page *page);
-extern int simple_prepare_write(struct file *file, struct page *page,
-			unsigned offset, unsigned to);
 extern int simple_write_begin(struct file *file, struct address_space *mapping,
 			loff_t pos, unsigned len, unsigned flags,
 			struct page **pagep, void **fsdata);
-- 
1.6.6



^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2010-01-12 14:18 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-30 15:40 [PATCH] libfs: Open code simple_commit_write into only user Boaz Harrosh
2009-12-30 15:57 ` Boaz Harrosh
2009-12-30 17:39 ` Randy Dunlap
2010-01-12 13:13 ` [PATCH version2] " Boaz Harrosh
2010-01-12 13:18   ` Boaz Harrosh
2010-01-12 13:28     ` Christoph Hellwig
2010-01-12 14:18   ` [PATCH 2/2] libfs: Unexport and kill simple_prepare_write Boaz Harrosh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).