aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorHugh Dickins <hughd@google.com>2011-06-27 19:18:03 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2011-06-27 21:00:12 -0400
commit94c1e62df4494b79782cb9c7279f827212d1de70 (patch)
tree43013fb403e592c535e6a7770be105b635ac9b63 /include/linux
parent072441e21ddcd1140606b7d4ef6eab579a86b0b3 (diff)
tmpfs: take control of its truncate_range
2.6.35's new truncate convention gave tmpfs the opportunity to control its file truncation, no longer enforced from outside by vmtruncate(). We shall want to build upon that, to handle pagecache and swap together. Slightly redefine the ->truncate_range interface: let it now be called between the unmap_mapping_range()s, with the filesystem responsible for doing the truncate_inode_pages_range() from it - just as the filesystem is nowadays responsible for doing that from its ->setattr. Let's rename shmem_notify_change() to shmem_setattr(). Instead of calling the generic truncate_setsize(), bring that code in so we can call shmem_truncate_range() - which will later be updated to perform its own variant of truncate_inode_pages_range(). Remove the punch_hole unmap_mapping_range() from shmem_truncate_range(): now that the COW's unmap_mapping_range() comes after ->truncate_range, there is no need to call it a third time. Export shmem_truncate_range() and add it to the list in shmem_fs.h, so that i915_gem_object_truncate() can call it explicitly in future; get this patch in first, then update drm/i915 once this is available (until then, i915 will just be doing the truncate_inode_pages() twice). Though introduced five years ago, no other filesystem is implementing ->truncate_range, and its only other user is madvise(,,MADV_REMOVE): we expect to convert it to fallocate(,FALLOC_FL_PUNCH_HOLE,,) shortly, whereupon ->truncate_range can be removed from inode_operations - shmem_truncate_range() will help i915 across that transition too. Signed-off-by: Hugh Dickins <hughd@google.com> Cc: Christoph Hellwig <hch@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/shmem_fs.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h
index cae65dc42bcc..22a20af4d785 100644
--- a/include/linux/shmem_fs.h
+++ b/include/linux/shmem_fs.h
@@ -61,6 +61,7 @@ extern struct file *shmem_file_setup(const char *name,
61 loff_t size, unsigned long flags); 61 loff_t size, unsigned long flags);
62extern int shmem_zero_setup(struct vm_area_struct *); 62extern int shmem_zero_setup(struct vm_area_struct *);
63extern int shmem_lock(struct file *file, int lock, struct user_struct *user); 63extern int shmem_lock(struct file *file, int lock, struct user_struct *user);
64extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end);
64extern int shmem_unuse(swp_entry_t entry, struct page *page); 65extern int shmem_unuse(swp_entry_t entry, struct page *page);
65extern void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff, 66extern void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff,
66 struct page **pagep, swp_entry_t *ent); 67 struct page **pagep, swp_entry_t *ent);