diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-30 15:07:01 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-30 15:07:01 -0400 |
| commit | 56f29d7fe452890eeeb7f2b0138b2d95b9745fb6 (patch) | |
| tree | 01b6b70297c53c9beb8d11eb186fbad9c166b1a2 /mm/truncate.c | |
| parent | e823aff2d6eb43083abcc75a32ddfb167c324089 (diff) | |
| parent | 059af497c23492cb1ddcbba11c09dad385960bc0 (diff) | |
Merge branch 'block' of git://brick.kernel.dk/data/git/linux-2.6-block
* 'block' of git://brick.kernel.dk/data/git/linux-2.6-block: (67 commits)
[PATCH] blk_queue_start_tag() shared map race fix
[PATCH] Update axboe@suse.de email address
[PATCH] fix creating zero sized bio mempools in low memory system
[PATCH] CONFIG_BLOCK: blk_congestion_wait() fix
[PATCH] CONFIG_BLOCK internal.h cleanups
[PATCH] BLOCK: Make USB storage depend on SCSI rather than selecting it [try #6]
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
[PATCH] BLOCK: Remove no-longer necessary linux/buffer_head.h inclusions [try #6]
[PATCH] BLOCK: Remove no-longer necessary linux/mpage.h inclusions [try #6]
[PATCH] BLOCK: Move the msdos device ioctl compat stuff to the msdos driver [try #6]
[PATCH] BLOCK: Move the Ext3 device ioctl compat stuff to the Ext3 driver [try #6]
[PATCH] BLOCK: Move the Ext2 device ioctl compat stuff to the Ext2 driver [try #6]
[PATCH] BLOCK: Move the ReiserFS device ioctl compat stuff to the ReiserFS driver [try #6]
[PATCH] BLOCK: Move common FS-specific ioctls to linux/fs.h [try #6]
[PATCH] BLOCK: Move the loop device ioctl compat stuff to the loop driver [try #6]
[PATCH] BLOCK: Move __invalidate_device() to block_dev.c [try #6]
[PATCH] BLOCK: Dissociate generic_writepages() from mpage stuff [try #6]
[PATCH] BLOCK: Remove dependence on existence of blockdev_superblock [try #6]
[PATCH] BLOCK: Move extern declarations out of fs/*.c into header files [try #6]
[PATCH] BLOCK: Don't call block_sync_page() from AFS [try #6]
...
Diffstat (limited to 'mm/truncate.c')
| -rw-r--r-- | mm/truncate.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/mm/truncate.c b/mm/truncate.c index a654928323dc..8fde6580657e 100644 --- a/mm/truncate.c +++ b/mm/truncate.c | |||
| @@ -17,6 +17,32 @@ | |||
| 17 | do_invalidatepage */ | 17 | do_invalidatepage */ |
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | /** | ||
| 21 | * do_invalidatepage - invalidate part of all of a page | ||
| 22 | * @page: the page which is affected | ||
| 23 | * @offset: the index of the truncation point | ||
| 24 | * | ||
| 25 | * do_invalidatepage() is called when all or part of the page has become | ||
| 26 | * invalidated by a truncate operation. | ||
| 27 | * | ||
| 28 | * do_invalidatepage() does not have to release all buffers, but it must | ||
| 29 | * ensure that no dirty buffer is left outside @offset and that no I/O | ||
| 30 | * is underway against any of the blocks which are outside the truncation | ||
| 31 | * point. Because the caller is about to free (and possibly reuse) those | ||
| 32 | * blocks on-disk. | ||
| 33 | */ | ||
| 34 | void do_invalidatepage(struct page *page, unsigned long offset) | ||
| 35 | { | ||
| 36 | void (*invalidatepage)(struct page *, unsigned long); | ||
| 37 | invalidatepage = page->mapping->a_ops->invalidatepage; | ||
| 38 | #ifdef CONFIG_BLOCK | ||
| 39 | if (!invalidatepage) | ||
| 40 | invalidatepage = block_invalidatepage; | ||
| 41 | #endif | ||
| 42 | if (invalidatepage) | ||
| 43 | (*invalidatepage)(page, offset); | ||
| 44 | } | ||
| 45 | |||
| 20 | static inline void truncate_partial_page(struct page *page, unsigned partial) | 46 | static inline void truncate_partial_page(struct page *page, unsigned partial) |
| 21 | { | 47 | { |
| 22 | memclear_highpage_flush(page, partial, PAGE_CACHE_SIZE-partial); | 48 | memclear_highpage_flush(page, partial, PAGE_CACHE_SIZE-partial); |
