2007-01-01 23:28:46

by Anton Altaparmakov

[permalink] [raw]
Subject: [2.6 PATCH] Export invalidate_mapping_pages() to modules.

Hi Linus and Andrew,

Please apply below patch which exports invalidate_mapping_pages() to
modules. It makes no sense to me to export invalidate_inode_pages() and
not invalidate_mapping_pages() and I actually need
invalidate_mapping_pages() because of its range specification ability...

It would be great if this could make it into 2.6.20!

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, http://www.linux-ntfs.org/

---

Export invalidate_mapping_pages() to modules.

Signed-off-by: Anton Altaparmakov <[email protected]>
---

diff --git a/mm/truncate.c b/mm/truncate.c
index ecdfdcc..26acee6 100644
--- a/mm/truncate.c
+++ b/mm/truncate.c
@@ -303,6 +303,7 @@ unlock:
}
return ret;
}
+EXPORT_SYMBOL(invalidate_mapping_pages);

unsigned long invalidate_inode_pages(struct address_space *mapping)
{


2007-01-03 13:29:38

by Arjan van de Ven

[permalink] [raw]
Subject: Re: [2.6 PATCH] Export invalidate_mapping_pages() to modules.

On Mon, 2007-01-01 at 23:28 +0000, Anton Altaparmakov wrote:
> Hi Linus and Andrew,
>
> Please apply below patch which exports invalidate_mapping_pages() to
> modules. It makes no sense to me to export invalidate_inode_pages() and
> not invalidate_mapping_pages() and I actually need
> invalidate_mapping_pages() because of its range specification ability...
>
> It would be great if this could make it into 2.6.20!


yet.. if there's not a single user it makes the kernel binary 100 to 150
bytes bigger in memory......

2007-01-03 18:59:17

by Anton Altaparmakov

[permalink] [raw]
Subject: Re: [2.6 PATCH] Export invalidate_mapping_pages() to modules.

On Wed, 3 Jan 2007, Arjan van de Ven wrote:
> On Mon, 2007-01-01 at 23:28 +0000, Anton Altaparmakov wrote:
> > Hi Linus and Andrew,
> >
> > Please apply below patch which exports invalidate_mapping_pages() to
> > modules. It makes no sense to me to export invalidate_inode_pages() and
> > not invalidate_mapping_pages() and I actually need
> > invalidate_mapping_pages() because of its range specification ability...
> >
> > It would be great if this could make it into 2.6.20!
>
> yet.. if there's not a single user it makes the kernel binary 100 to 150
> bytes bigger in memory......

Well I call it from two different places but the code is not in the kernel
(yet)... Also the way Andrew has added this to -mm it does not use the
extra space as you say because he added the export as per my patch but
then removed the export for invalidate_inode_pages() and turned that into
a static inline instead.

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, http://www.linux-ntfs.org/

2007-01-03 19:03:43

by Andrew Morton

[permalink] [raw]
Subject: Re: [2.6 PATCH] Export invalidate_mapping_pages() to modules.

On Wed, 03 Jan 2007 05:29:31 -0800
Arjan van de Ven <[email protected]> wrote:

> On Mon, 2007-01-01 at 23:28 +0000, Anton Altaparmakov wrote:
> > Hi Linus and Andrew,
> >
> > Please apply below patch which exports invalidate_mapping_pages() to
> > modules. It makes no sense to me to export invalidate_inode_pages() and
> > not invalidate_mapping_pages() and I actually need
> > invalidate_mapping_pages() because of its range specification ability...
> >
> > It would be great if this could make it into 2.6.20!
>
>
> yet.. if there's not a single user it makes the kernel binary 100 to 150
> bytes bigger in memory......

I fixed that.


From: Anton Altaparmakov <[email protected]>

It makes no sense to me to export invalidate_inode_pages() and not
invalidate_mapping_pages() and I actually need invalidate_mapping_pages()
because of its range specification ability...

akpm: also remove the export of invalidate_inode_pages() by making it an
inlined wrapper.

Signed-off-by: Anton Altaparmakov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
---

include/linux/fs.h | 8 +++++++-
mm/truncate.c | 7 +------
2 files changed, 8 insertions(+), 7 deletions(-)

diff -puN mm/truncate.c~export-invalidate_mapping_pages-to-modules mm/truncate.c
--- a/mm/truncate.c~export-invalidate_mapping_pages-to-modules
+++ a/mm/truncate.c
@@ -303,12 +303,7 @@ unlock:
}
return ret;
}
-
-unsigned long invalidate_inode_pages(struct address_space *mapping)
-{
- return invalidate_mapping_pages(mapping, 0, ~0UL);
-}
-EXPORT_SYMBOL(invalidate_inode_pages);
+EXPORT_SYMBOL(invalidate_mapping_pages);

/*
* This is like invalidate_complete_page(), except it ignores the page's
diff -puN include/linux/fs.h~export-invalidate_mapping_pages-to-modules include/linux/fs.h
--- a/include/linux/fs.h~export-invalidate_mapping_pages-to-modules
+++ a/include/linux/fs.h
@@ -1571,7 +1571,13 @@ extern int invalidate_partition(struct g
extern int invalidate_inodes(struct super_block *);
unsigned long invalidate_mapping_pages(struct address_space *mapping,
pgoff_t start, pgoff_t end);
-unsigned long invalidate_inode_pages(struct address_space *mapping);
+
+static inline unsigned long
+invalidate_inode_pages(struct address_space *mapping)
+{
+ return invalidate_mapping_pages(mapping, 0, ~0UL);
+}
+
static inline void invalidate_remote_inode(struct inode *inode)
{
if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
_

2007-01-03 20:11:30

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [2.6 PATCH] Export invalidate_mapping_pages() to modules.

On Wed, Jan 03, 2007 at 11:03:32AM -0800, Andrew Morton wrote:
> It makes no sense to me to export invalidate_inode_pages() and not
> invalidate_mapping_pages() and I actually need invalidate_mapping_pages()
> because of its range specification ability...
>
> akpm: also remove the export of invalidate_inode_pages() by making it an
> inlined wrapper.

What about just killing invalidate_inode_pages()? It only has about
a dozend callers, and it's already rather misnamed since it actually
operates on an address_space, not an inode.

2007-01-03 20:44:52

by Andrew Morton

[permalink] [raw]
Subject: Re: [2.6 PATCH] Export invalidate_mapping_pages() to modules.

On Wed, 3 Jan 2007 20:11:23 +0000
Christoph Hellwig <[email protected]> wrote:

> On Wed, Jan 03, 2007 at 11:03:32AM -0800, Andrew Morton wrote:
> > It makes no sense to me to export invalidate_inode_pages() and not
> > invalidate_mapping_pages() and I actually need invalidate_mapping_pages()
> > because of its range specification ability...
> >
> > akpm: also remove the export of invalidate_inode_pages() by making it an
> > inlined wrapper.
>
> What about just killing invalidate_inode_pages()? It only has about
> a dozend callers, and it's already rather misnamed since it actually
> operates on an address_space, not an inode.

spoze so. Like this?


From: Andrew Morton <[email protected]>

Convert all calls to invalidate_inode_pages() into open-coded calls to
invalidate_mapping_pages().

Leave the invalidate_inode_pages() wrapper in place for now, marked as
deprecated.


Signed-off-by: Andrew Morton <[email protected]>
---

drivers/md/bitmap.c | 2 +-
drivers/mtd/devices/block2mtd.c | 3 ++-
drivers/usb/gadget/file_storage.c | 2 +-
fs/9p/vfs_file.c | 4 ++--
fs/buffer.c | 2 +-
fs/drop_caches.c | 2 +-
fs/fuse/file.c | 2 +-
fs/fuse/inode.c | 2 +-
fs/inode.c | 3 ++-
fs/jffs/inode-v23.c | 4 ++--
include/linux/fs.h | 4 ++--
mm/truncate.c | 4 ++--
12 files changed, 18 insertions(+), 16 deletions(-)

diff -puN drivers/md/bitmap.c~remove-invalidate_inode_pages drivers/md/bitmap.c
--- a/drivers/md/bitmap.c~remove-invalidate_inode_pages
+++ a/drivers/md/bitmap.c
@@ -663,7 +663,7 @@ static void bitmap_file_put(struct bitma

if (file) {
struct inode *inode = file->f_path.dentry->d_inode;
- invalidate_inode_pages(inode->i_mapping);
+ invalidate_mapping_pages(inode->i_mapping, 0, -1);
fput(file);
}
}
diff -puN drivers/mtd/devices/block2mtd.c~remove-invalidate_inode_pages drivers/mtd/devices/block2mtd.c
--- a/drivers/mtd/devices/block2mtd.c~remove-invalidate_inode_pages
+++ a/drivers/mtd/devices/block2mtd.c
@@ -278,7 +278,8 @@ static void block2mtd_free_device(struct
kfree(dev->mtd.name);

if (dev->blkdev) {
- invalidate_inode_pages(dev->blkdev->bd_inode->i_mapping);
+ invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
+ 0, -1);
close_bdev_excl(dev->blkdev);
}

diff -puN drivers/usb/gadget/file_storage.c~remove-invalidate_inode_pages drivers/usb/gadget/file_storage.c
--- a/drivers/usb/gadget/file_storage.c~remove-invalidate_inode_pages
+++ a/drivers/usb/gadget/file_storage.c
@@ -1953,7 +1953,7 @@ static void invalidate_sub(struct lun *c
struct inode *inode = filp->f_path.dentry->d_inode;
unsigned long rc;

- rc = invalidate_inode_pages(inode->i_mapping);
+ rc = invalidate_mapping_pages(inode->i_mapping, 0, -1);
VLDBG(curlun, "invalidate_inode_pages -> %ld\n", rc);
}

diff -puN fs/9p/vfs_file.c~remove-invalidate_inode_pages fs/9p/vfs_file.c
--- a/fs/9p/vfs_file.c~remove-invalidate_inode_pages
+++ a/fs/9p/vfs_file.c
@@ -143,7 +143,7 @@ static int v9fs_file_lock(struct file *f

if ((IS_SETLK(cmd) || IS_SETLKW(cmd)) && fl->fl_type != F_UNLCK) {
filemap_write_and_wait(inode->i_mapping);
- invalidate_inode_pages(&inode->i_data);
+ invalidate_mapping_pages(&inode->i_data, 0, -1);
}

return res;
@@ -267,7 +267,7 @@ v9fs_file_write(struct file *filp, const
total += result;
} while (count);

- invalidate_inode_pages2(inode->i_mapping);
+ invalidate_inode_pages2(inode->i_mapping);
return total;
}

diff -puN fs/buffer.c~remove-invalidate_inode_pages fs/buffer.c
--- a/fs/buffer.c~remove-invalidate_inode_pages
+++ a/fs/buffer.c
@@ -345,7 +345,7 @@ void invalidate_bdev(struct block_device
* We really want to use invalidate_inode_pages2() for
* that, but not until that's cleaned up.
*/
- invalidate_inode_pages(mapping);
+ invalidate_mapping_pages(mapping, 0, -1);
}

/*
diff -puN fs/drop_caches.c~remove-invalidate_inode_pages fs/drop_caches.c
--- a/fs/drop_caches.c~remove-invalidate_inode_pages
+++ a/fs/drop_caches.c
@@ -20,7 +20,7 @@ static void drop_pagecache_sb(struct sup
list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
if (inode->i_state & (I_FREEING|I_WILL_FREE))
continue;
- invalidate_inode_pages(inode->i_mapping);
+ invalidate_mapping_pages(inode->i_mapping, 0, -1);
}
spin_unlock(&inode_lock);
}
diff -puN fs/fuse/file.c~remove-invalidate_inode_pages fs/fuse/file.c
--- a/fs/fuse/file.c~remove-invalidate_inode_pages
+++ a/fs/fuse/file.c
@@ -69,7 +69,7 @@ void fuse_finish_open(struct inode *inod
if (outarg->open_flags & FOPEN_DIRECT_IO)
file->f_op = &fuse_direct_io_file_operations;
if (!(outarg->open_flags & FOPEN_KEEP_CACHE))
- invalidate_inode_pages(inode->i_mapping);
+ invalidate_mapping_pages(inode->i_mapping, 0, -1);
ff->fh = outarg->fh;
file->private_data = ff;
}
diff -puN fs/fuse/inode.c~remove-invalidate_inode_pages fs/fuse/inode.c
--- a/fs/fuse/inode.c~remove-invalidate_inode_pages
+++ a/fs/fuse/inode.c
@@ -112,7 +112,7 @@ void fuse_change_attributes(struct inode
{
struct fuse_conn *fc = get_fuse_conn(inode);
if (S_ISREG(inode->i_mode) && i_size_read(inode) != attr->size)
- invalidate_inode_pages(inode->i_mapping);
+ invalidate_mapping_pages(inode->i_mapping, 0, -1);

inode->i_ino = attr->ino;
inode->i_mode = (inode->i_mode & S_IFMT) + (attr->mode & 07777);
diff -puN fs/inode.c~remove-invalidate_inode_pages fs/inode.c
--- a/fs/inode.c~remove-invalidate_inode_pages
+++ a/fs/inode.c
@@ -414,7 +414,8 @@ static void prune_icache(int nr_to_scan)
__iget(inode);
spin_unlock(&inode_lock);
if (remove_inode_buffers(inode))
- reap += invalidate_inode_pages(&inode->i_data);
+ reap += invalidate_mapping_pages(&inode->i_data,
+ 0, -1);
iput(inode);
spin_lock(&inode_lock);

diff -puN fs/jffs/inode-v23.c~remove-invalidate_inode_pages fs/jffs/inode-v23.c
--- a/fs/jffs/inode-v23.c~remove-invalidate_inode_pages
+++ a/fs/jffs/inode-v23.c
@@ -296,7 +296,7 @@ jffs_setattr(struct dentry *dentry, stru
inode->i_blocks = (inode->i_size + 511) >> 9;

if (len) {
- invalidate_inode_pages(inode->i_mapping);
+ invalidate_mapping_pages(inode->i_mapping, 0, -1);
}
inode->i_ctime = CURRENT_TIME_SEC;
inode->i_mtime = inode->i_ctime;
@@ -1518,7 +1518,7 @@ jffs_file_write(struct file *filp, const
}
inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC;
mark_inode_dirty(inode);
- invalidate_inode_pages(inode->i_mapping);
+ invalidate_mapping_pages(inode->i_mapping, 0, -1);

out_isem:
return err;
diff -puN include/linux/fs.h~remove-invalidate_inode_pages include/linux/fs.h
--- a/include/linux/fs.h~remove-invalidate_inode_pages
+++ a/include/linux/fs.h
@@ -1573,7 +1573,7 @@ extern int invalidate_inodes(struct supe
unsigned long invalidate_mapping_pages(struct address_space *mapping,
pgoff_t start, pgoff_t end);

-static inline unsigned long
+static inline unsigned long __deprecated
invalidate_inode_pages(struct address_space *mapping)
{
return invalidate_mapping_pages(mapping, 0, ~0UL);
@@ -1583,7 +1583,7 @@ static inline void invalidate_remote_ino
{
if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
S_ISLNK(inode->i_mode))
- invalidate_inode_pages(inode->i_mapping);
+ invalidate_mapping_pages(inode->i_mapping, 0, -1);
}
extern int invalidate_inode_pages2(struct address_space *mapping);
extern int invalidate_inode_pages2_range(struct address_space *mapping,
diff -puN mm/truncate.c~remove-invalidate_inode_pages mm/truncate.c
--- a/mm/truncate.c~remove-invalidate_inode_pages
+++ a/mm/truncate.c
@@ -78,7 +78,7 @@ EXPORT_SYMBOL(cancel_dirty_page);
*
* We need to bale out if page->mapping is no longer equal to the original
* mapping. This happens a) when the VM reclaimed the page while we waited on
- * its lock, b) when a concurrent invalidate_inode_pages got there first and
+ * its lock, b) when a concurrent invalidate_mapping_pages got there first and
* c) when tmpfs swizzles a page between a tmpfs inode and swapper_space.
*/
static void
@@ -99,7 +99,7 @@ truncate_complete_page(struct address_sp
}

/*
- * This is for invalidate_inode_pages(). That function can be called at
+ * This is for invalidate_mapping_pages(). That function can be called at
* any time, and is not supposed to throw away dirty pages. But pages can
* be marked dirty at any time too, so use remove_mapping which safely
* discards clean, unused pages.
_