linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* RFC: Changes to fs/buffer.c?
@ 2004-10-29 14:28 Anton Altaparmakov
  2004-10-29 20:34 ` Andrew Morton
  0 siblings, 1 reply; 6+ messages in thread
From: Anton Altaparmakov @ 2004-10-29 14:28 UTC (permalink / raw)
  To: Andrew Morton, Linus Torvalds; +Cc: linux-kernel

Hi Andrew, hi Linus,

I would like to use create_buffers() and __set_page_buffers() in ntfs but 
both are static functions in fs/buffer.c.  Is it ok to export 
create_buffers() and to make __set_page_buffers() static inline and move 
it to include/linux/buffer.h?  In other words, is the below patch 
acceptable?

If you are curious why I need these, it is because 
mark_ntfs_record_dirty() needs to create buffers if they are not present 
so that it can set only some of them dirty and create_empty_buffers() sets 
all buffers dirty which is not useful.  Also create_empty_buffers() relies 
on the page being locked which is not necessarily the case when 
mark_ntfs_record_dirty() is called.  This allows me to only mark parts of 
a page as dirty which means ->writepage() does not need to write the whole 
page but only the dirty ntfs records in the page.  The function I am 
talking about is at the end of this email if you want to see it.

Thanks a lot in advance.

Best regards,

	Anton
-- 
Anton Altaparmakov <aia21 at cam.ac.uk> (replace at with @)
Unix Support, Computing Service, University of Cambridge, CB2 3QH, UK
Linux NTFS maintainer / IRC: #ntfs on irc.freenode.net
WWW: http://linux-ntfs.sf.net/ & http://www-stu.christs.cam.ac.uk/~aia21/

--- ntfs-2.6-devel/include/linux/buffer_head.h.old	2004-10-29 14:38:11.543109318 +0100
+++ ntfs-2.6-devel/include/linux/buffer_head.h	2004-10-29 14:38:48.718192623 +0100
@@ -10,6 +10,7 @@
 #include <linux/types.h>
 #include <linux/fs.h>
 #include <linux/linkage.h>
+#include <linux/pagemap.h>
 #include <linux/wait.h>
 #include <asm/atomic.h>
 
@@ -136,6 +137,8 @@ void init_buffer(struct buffer_head *, b
 void set_bh_page(struct buffer_head *bh,
 		struct page *page, unsigned long offset);
 int try_to_free_buffers(struct page *);
+struct buffer_head *create_buffers(struct page *page, unsigned long size,
+		int retry);
 void create_empty_buffers(struct page *, unsigned long,
 			unsigned long b_state);
 void end_buffer_read_sync(struct buffer_head *bh, int uptodate);
@@ -205,6 +208,14 @@ int nobh_truncate_page(struct address_sp
  * inline definitions
  */
 
+static inline void __set_page_buffers(struct page *page,
+		struct buffer_head *head)
+{
+	page_cache_get(page);
+	SetPagePrivate(page);
+	page->private = (unsigned long)head;
+}
+
 static inline void get_bh(struct buffer_head *bh)
 {
         atomic_inc(&bh->b_count);
--- ntfs-2.6-devel/fs/buffer.c.old	2004-10-29 12:50:57.271105103 +0100
+++ ntfs-2.6-devel/fs/buffer.c	2004-10-29 14:35:29.254207332 +0100
@@ -91,14 +91,6 @@ void __wait_on_buffer(struct buffer_head
 }
 
 static void
-__set_page_buffers(struct page *page, struct buffer_head *head)
-{
-	page_cache_get(page);
-	SetPagePrivate(page);
-	page->private = (unsigned long)head;
-}
-
-static void
 __clear_page_buffers(struct page *page)
 {
 	ClearPagePrivate(page);
@@ -1013,8 +1005,8 @@ int remove_inode_buffers(struct inode *i
  * The retry flag is used to differentiate async IO (paging, swapping)
  * which may not fail from ordinary buffer allocations.
  */
-static struct buffer_head *
-create_buffers(struct page * page, unsigned long size, int retry)
+struct buffer_head *create_buffers(struct page *page, unsigned long size,
+		int retry)
 {
 	struct buffer_head *bh, *head;
 	long offset;
@@ -1072,6 +1064,7 @@ no_grow:
 	free_more_memory();
 	goto try_again;
 }
+EXPORT_SYMBOL(create_buffers);
 
 static inline void
 link_dev_buffers(struct page *page, struct buffer_head *head)


------------- this is mark_ntfs_record_dirty() --------------

/**
 * mark_ntfs_record_dirty - mark an ntfs record dirty
 * @page:	page containing the ntfs record to mark dirty
 * @ofs:	byte offset within @page at which the ntfs record begins
 *
 * Set the buffers and the page in which the ntfs record is located dirty.
 *
 * The latter also marks the vfs inode the ntfs record belongs to dirty
 * (I_DIRTY_PAGES only).
 *
 * If the page does not have buffers, we create them and set them uptodate.
 * The page may not be locked which is why we need to handle the buffers under
 * the mapping->private_lock.  Once the buffers are marked dirty we no longer
 * need the lock since try_to_free_buffers() does not free dirty buffers.
 */
void mark_ntfs_record_dirty(struct page *page, const unsigned int ofs) {
	struct address_space *mapping = page->mapping;
	ntfs_inode *ni = NTFS_I(mapping->host);
	struct buffer_head *bh, *head, *buffers_to_free = NULL;
	unsigned int end, bh_size, bh_ofs;

	BUG_ON(!PageUptodate(page));
	end = ofs + ni->itype.index.block_size;
	bh_size = 1 << VFS_I(ni)->i_blkbits;
	spin_lock(&mapping->private_lock);
	if (unlikely(!page_has_buffers(page))) {
		spin_unlock(&mapping->private_lock);
		bh = head = create_buffers(page, bh_size, 1);
		spin_lock(&mapping->private_lock);
		if (likely(!page_has_buffers(page))) {
			struct buffer_head *tail;

			do {
				set_buffer_uptodate(bh);
				tail = bh;
				bh = bh->b_this_page;
			} while (bh);
			tail->b_this_page = head;
			__set_page_buffers(page, head);
		} else
			buffers_to_free = bh;
	}
	bh = head = page_buffers(page);
	do {
		bh_ofs = bh_offset(bh);
		if (bh_ofs + bh_size <= ofs)
			continue;
		if (unlikely(bh_ofs >= end))
			break;
		set_buffer_dirty(bh);
	} while ((bh = bh->b_this_page) != head);
	spin_unlock(&mapping->private_lock);
	__set_page_dirty_nobuffers(page);
	if (unlikely(buffers_to_free)) {
		do {
			bh = buffers_to_free->b_this_page;
			free_buffer_head(buffers_to_free);
			buffers_to_free = bh;
		} while (buffers_to_free);
	}
}

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

* Re: RFC: Changes to fs/buffer.c?
  2004-10-29 14:28 RFC: Changes to fs/buffer.c? Anton Altaparmakov
@ 2004-10-29 20:34 ` Andrew Morton
  2004-10-29 20:45   ` Linus Torvalds
  2004-10-29 21:46   ` Anton Altaparmakov
  0 siblings, 2 replies; 6+ messages in thread
From: Andrew Morton @ 2004-10-29 20:34 UTC (permalink / raw)
  To: Anton Altaparmakov; +Cc: torvalds, linux-kernel

Anton Altaparmakov <aia21@cam.ac.uk> wrote:
>
> Is it ok to export 
>  create_buffers() and to make __set_page_buffers() static inline and move 
>  it to include/linux/buffer.h?

ho, hum - if you must ;)

I'd be inclined to rename it to attach_page_buffers() or something though -
create_buffers() is a bit generic-sounding.


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

* Re: RFC: Changes to fs/buffer.c?
  2004-10-29 20:34 ` Andrew Morton
@ 2004-10-29 20:45   ` Linus Torvalds
  2004-10-29 21:48     ` Anton Altaparmakov
  2004-10-29 21:46   ` Anton Altaparmakov
  1 sibling, 1 reply; 6+ messages in thread
From: Linus Torvalds @ 2004-10-29 20:45 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Anton Altaparmakov, linux-kernel



On Fri, 29 Oct 2004, Andrew Morton wrote:
>
> Anton Altaparmakov <aia21@cam.ac.uk> wrote:
> >
> > Is it ok to export 
> >  create_buffers() and to make __set_page_buffers() static inline and move 
> >  it to include/linux/buffer.h?
> 
> ho, hum - if you must ;)
> 
> I'd be inclined to rename it to attach_page_buffers() or something though -
> create_buffers() is a bit generic-sounding.

Also, I think we should at least start out limiting it to GPL-only usage. 
Those page buffers are pretty intertwined with the VM usage, I'd hate to 
see people think this is some kind of external interface..

		Linus

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

* Re: RFC: Changes to fs/buffer.c?
  2004-10-29 20:34 ` Andrew Morton
  2004-10-29 20:45   ` Linus Torvalds
@ 2004-10-29 21:46   ` Anton Altaparmakov
  2004-11-01 22:42     ` [PATCH 2.6] " Anton Altaparmakov
  1 sibling, 1 reply; 6+ messages in thread
From: Anton Altaparmakov @ 2004-10-29 21:46 UTC (permalink / raw)
  To: Andrew Morton; +Cc: torvalds, linux-kernel

On Fri, 29 Oct 2004, Andrew Morton wrote:
> Anton Altaparmakov <aia21@cam.ac.uk> wrote:
> >
> > Is it ok to export 
> >  create_buffers() and to make __set_page_buffers() static inline and move 
> >  it to include/linux/buffer.h?
> 
> ho, hum - if you must ;)

I don't have to.  It is very easy for me to take a copy of each of these 
and stick it in fs/ntfs/aops.c.  Works out of the box.  Just seems silly 
to proliferate code like that rather than to make use of existing 
functions...  Would you not agree?  If not, I will just copy the functions 
and that's that.

> I'd be inclined to rename it to attach_page_buffers() or something though -
> create_buffers() is a bit generic-sounding.

create_empty_buffers() which is already exported and used by pretty much 
all fs is just as generic sounding...  However renaming create_buffers() 
to alloc_page_buffers() might be better as it doesn't actually attach the 
buffers to the page.  You still need the __set_page_buffers() to do that.  
Perhaps you meant to rename __set_page_buffers() to attach_page_buffers()?

Its time for bed now but I will cook up a new patch tomorrow or Monday 
depending on when I get some time on the computer...

Cheers,

	Anton
-- 
Anton Altaparmakov <aia21 at cam.ac.uk> (replace at with @)
Unix Support, Computing Service, University of Cambridge, CB2 3QH, UK
Linux NTFS maintainer / IRC: #ntfs on irc.freenode.net
WWW: http://linux-ntfs.sf.net/ & http://www-stu.christs.cam.ac.uk/~aia21/

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

* Re: RFC: Changes to fs/buffer.c?
  2004-10-29 20:45   ` Linus Torvalds
@ 2004-10-29 21:48     ` Anton Altaparmakov
  0 siblings, 0 replies; 6+ messages in thread
From: Anton Altaparmakov @ 2004-10-29 21:48 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Andrew Morton, linux-kernel

On Fri, 29 Oct 2004, Linus Torvalds wrote:
> On Fri, 29 Oct 2004, Andrew Morton wrote:
> > Anton Altaparmakov <aia21@cam.ac.uk> wrote:
> > >
> > > Is it ok to export 
> > >  create_buffers() and to make __set_page_buffers() static inline and move 
> > >  it to include/linux/buffer.h?
> > 
> > ho, hum - if you must ;)
> > 
> > I'd be inclined to rename it to attach_page_buffers() or something though -
> > create_buffers() is a bit generic-sounding.
> 
> Also, I think we should at least start out limiting it to GPL-only usage. 
> Those page buffers are pretty intertwined with the VM usage, I'd hate to 
> see people think this is some kind of external interface..

Yes, sure.  I will use the _GPL version for the symbol export.  I only 
used the non-GPL-only form since create_empty_buffers() is simply exported 
and create_buffers() is kind of the same thing but does less...

Best regards,

	Anton
-- 
Anton Altaparmakov <aia21 at cam.ac.uk> (replace at with @)
Unix Support, Computing Service, University of Cambridge, CB2 3QH, UK
Linux NTFS maintainer / IRC: #ntfs on irc.freenode.net
WWW: http://linux-ntfs.sf.net/ & http://www-stu.christs.cam.ac.uk/~aia21/

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

* [PATCH 2.6] Re: RFC: Changes to fs/buffer.c?
  2004-10-29 21:46   ` Anton Altaparmakov
@ 2004-11-01 22:42     ` Anton Altaparmakov
  0 siblings, 0 replies; 6+ messages in thread
From: Anton Altaparmakov @ 2004-11-01 22:42 UTC (permalink / raw)
  To: Andrew Morton, Linus Torvalds; +Cc: linux-kernel

Hi Andrew, Hi Linus,

On Fri, 29 Oct 2004, Anton Altaparmakov wrote:
> On Fri, 29 Oct 2004, Andrew Morton wrote:
> > Anton Altaparmakov <aia21@cam.ac.uk> wrote:
> > >
> > > Is it ok to export 
> > >  create_buffers() and to make __set_page_buffers() static inline and move 
> > >  it to include/linux/buffer.h?
> > 
> > ho, hum - if you must ;)

Ok, below is the patch, as requested I renamed the functions to more 
descriptive names:

	create_buffers -> alloc_page_buffers
	__set_page_buffers -> attach_page_buffers

And I added a EXPORT_SYMBOL_GPL for alloc_page_buffers and made
attach_page_buffers static inline and moved it to <linux/buffer_head.h>.

Assuming you are both happy with it, please apply.  Thanks!

Signed-off-by: Anton Altaparmakov <aia21@cantab.net>

Best regards,

	Anton

PS. If you prefer me to submit this as part of the next ntfs update just 
let me know...

-- 
Anton Altaparmakov <aia21 at cam.ac.uk> (replace at with @)
Unix Support, Computing Service, University of Cambridge, CB2 3QH, UK
Linux NTFS maintainer / IRC: #ntfs on irc.freenode.net
WWW: http://linux-ntfs.sf.net/ & http://www-stu.christs.cam.ac.uk/~aia21/

---------- buffer-stuff2.diff ----------

--- ntfs-2.6-devel/include/linux/buffer_head.h.old	2004-11-01 22:30:58.854166673 +0000
+++ ntfs-2.6-devel/include/linux/buffer_head.h	2004-11-01 22:27:22.722940892 +0000
@@ -10,6 +10,7 @@
 #include <linux/types.h>
 #include <linux/fs.h>
 #include <linux/linkage.h>
+#include <linux/pagemap.h>
 #include <linux/wait.h>
 #include <asm/atomic.h>
 
@@ -136,6 +137,8 @@ void init_buffer(struct buffer_head *, b
 void set_bh_page(struct buffer_head *bh,
 		struct page *page, unsigned long offset);
 int try_to_free_buffers(struct page *);
+struct buffer_head *alloc_page_buffers(struct page *page, unsigned long size,
+		int retry);
 void create_empty_buffers(struct page *, unsigned long,
 			unsigned long b_state);
 void end_buffer_read_sync(struct buffer_head *bh, int uptodate);
@@ -205,6 +208,14 @@ int nobh_truncate_page(struct address_sp
  * inline definitions
  */
 
+static inline void attach_page_buffers(struct page *page,
+		struct buffer_head *head)
+{
+	page_cache_get(page);
+	SetPagePrivate(page);
+	page->private = (unsigned long)head;
+}
+
 static inline void get_bh(struct buffer_head *bh)
 {
         atomic_inc(&bh->b_count);
--- ntfs-2.6-devel/fs/buffer.c.old	2004-11-01 22:29:29.423590168 +0000
+++ ntfs-2.6-devel/fs/buffer.c	2004-11-01 22:27:57.582267689 +0000
@@ -91,14 +91,6 @@ void __wait_on_buffer(struct buffer_head
 }
 
 static void
-__set_page_buffers(struct page *page, struct buffer_head *head)
-{
-	page_cache_get(page);
-	SetPagePrivate(page);
-	page->private = (unsigned long)head;
-}
-
-static void
 __clear_page_buffers(struct page *page)
 {
 	ClearPagePrivate(page);
@@ -1013,8 +1005,8 @@ int remove_inode_buffers(struct inode *i
  * The retry flag is used to differentiate async IO (paging, swapping)
  * which may not fail from ordinary buffer allocations.
  */
-static struct buffer_head *
-create_buffers(struct page * page, unsigned long size, int retry)
+struct buffer_head *alloc_page_buffers(struct page *page, unsigned long size,
+		int retry)
 {
 	struct buffer_head *bh, *head;
 	long offset;
@@ -1072,6 +1064,7 @@ no_grow:
 	free_more_memory();
 	goto try_again;
 }
+EXPORT_SYMBOL_GPL(alloc_page_buffers);
 
 static inline void
 link_dev_buffers(struct page *page, struct buffer_head *head)
@@ -1084,7 +1077,7 @@ link_dev_buffers(struct page *page, stru
 		bh = bh->b_this_page;
 	} while (bh);
 	tail->b_this_page = head;
-	__set_page_buffers(page, head);
+	attach_page_buffers(page, head);
 }
 
 /*
@@ -1145,7 +1138,7 @@ grow_dev_page(struct block_device *bdev,
 	/*
 	 * Allocate some buffers for this page
 	 */
-	bh = create_buffers(page, size, 0);
+	bh = alloc_page_buffers(page, size, 0);
 	if (!bh)
 		goto failed;
 
@@ -1651,7 +1644,7 @@ void create_empty_buffers(struct page *p
 {
 	struct buffer_head *bh, *head, *tail;
 
-	head = create_buffers(page, blocksize, 1);
+	head = alloc_page_buffers(page, blocksize, 1);
 	bh = head;
 	do {
 		bh->b_state |= b_state;
@@ -1671,7 +1664,7 @@ void create_empty_buffers(struct page *p
 			bh = bh->b_this_page;
 		} while (bh != head);
 	}
-	__set_page_buffers(page, head);
+	attach_page_buffers(page, head);
 	spin_unlock(&page->mapping->private_lock);
 }
 EXPORT_SYMBOL(create_empty_buffers);

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

end of thread, other threads:[~2004-11-02  4:54 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-10-29 14:28 RFC: Changes to fs/buffer.c? Anton Altaparmakov
2004-10-29 20:34 ` Andrew Morton
2004-10-29 20:45   ` Linus Torvalds
2004-10-29 21:48     ` Anton Altaparmakov
2004-10-29 21:46   ` Anton Altaparmakov
2004-11-01 22:42     ` [PATCH 2.6] " Anton Altaparmakov

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