diff options
| -rw-r--r-- | include/asm-alpha/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-arm/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-arm26/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-cris/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-frv/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-h8300/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-i386/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-ia64/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-m32r/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-m68k/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-mips/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-parisc/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-powerpc/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-s390/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-sh/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-sparc/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-sparc64/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-v850/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-x86_64/mman.h | 1 | ||||
| -rw-r--r-- | include/asm-xtensa/mman.h | 1 | ||||
| -rw-r--r-- | include/linux/fs.h | 1 | ||||
| -rw-r--r-- | include/linux/mm.h | 1 | ||||
| -rw-r--r-- | mm/madvise.c | 35 | ||||
| -rw-r--r-- | mm/memory.c | 25 | ||||
| -rw-r--r-- | mm/shmem.c | 32 |
25 files changed, 105 insertions, 9 deletions
diff --git a/include/asm-alpha/mman.h b/include/asm-alpha/mman.h index eb9c279045ef..f6439532a262 100644 --- a/include/asm-alpha/mman.h +++ b/include/asm-alpha/mman.h | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #define MADV_WILLNEED 3 /* will need these pages */ | 42 | #define MADV_WILLNEED 3 /* will need these pages */ |
| 43 | #define MADV_SPACEAVAIL 5 /* ensure resources are available */ | 43 | #define MADV_SPACEAVAIL 5 /* ensure resources are available */ |
| 44 | #define MADV_DONTNEED 6 /* don't need these pages */ | 44 | #define MADV_DONTNEED 6 /* don't need these pages */ |
| 45 | #define MADV_REMOVE 7 /* remove these pages & resources */ | ||
| 45 | 46 | ||
| 46 | /* compatibility flags */ | 47 | /* compatibility flags */ |
| 47 | #define MAP_ANON MAP_ANONYMOUS | 48 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-arm/mman.h b/include/asm-arm/mman.h index 8e4f69c4fa5f..f0bebca2ac21 100644 --- a/include/asm-arm/mman.h +++ b/include/asm-arm/mman.h | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 38 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 38 | 39 | ||
| 39 | /* compatibility flags */ | 40 | /* compatibility flags */ |
| 40 | #define MAP_ANON MAP_ANONYMOUS | 41 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-arm26/mman.h b/include/asm-arm26/mman.h index cc27b8240265..0ed7780541fa 100644 --- a/include/asm-arm26/mman.h +++ b/include/asm-arm26/mman.h | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 38 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 38 | 39 | ||
| 39 | /* compatibility flags */ | 40 | /* compatibility flags */ |
| 40 | #define MAP_ANON MAP_ANONYMOUS | 41 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-cris/mman.h b/include/asm-cris/mman.h index 8570e72b9502..5a382b8bf3f7 100644 --- a/include/asm-cris/mman.h +++ b/include/asm-cris/mman.h | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 37 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 38 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 38 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 39 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 39 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 40 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 40 | 41 | ||
| 41 | /* compatibility flags */ | 42 | /* compatibility flags */ |
| 42 | #define MAP_ANON MAP_ANONYMOUS | 43 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-frv/mman.h b/include/asm-frv/mman.h index c684720dfbdd..8af4a41c255e 100644 --- a/include/asm-frv/mman.h +++ b/include/asm-frv/mman.h | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 38 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 38 | 39 | ||
| 39 | /* compatibility flags */ | 40 | /* compatibility flags */ |
| 40 | #define MAP_ANON MAP_ANONYMOUS | 41 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-h8300/mman.h b/include/asm-h8300/mman.h index 63f727a59850..744a8fb485c2 100644 --- a/include/asm-h8300/mman.h +++ b/include/asm-h8300/mman.h | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 38 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 38 | 39 | ||
| 39 | /* compatibility flags */ | 40 | /* compatibility flags */ |
| 40 | #define MAP_ANON MAP_ANONYMOUS | 41 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-i386/mman.h b/include/asm-i386/mman.h index 196619a83854..ba4941e6f643 100644 --- a/include/asm-i386/mman.h +++ b/include/asm-i386/mman.h | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 38 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 38 | 39 | ||
| 39 | /* compatibility flags */ | 40 | /* compatibility flags */ |
| 40 | #define MAP_ANON MAP_ANONYMOUS | 41 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-ia64/mman.h b/include/asm-ia64/mman.h index 1c0a73af1461..828beb24a20e 100644 --- a/include/asm-ia64/mman.h +++ b/include/asm-ia64/mman.h | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 43 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 44 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 44 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 45 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 45 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 46 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 46 | 47 | ||
| 47 | /* compatibility flags */ | 48 | /* compatibility flags */ |
| 48 | #define MAP_ANON MAP_ANONYMOUS | 49 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-m32r/mman.h b/include/asm-m32r/mman.h index 011f6d9ec5cc..12e29747bc84 100644 --- a/include/asm-m32r/mman.h +++ b/include/asm-m32r/mman.h | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 37 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 38 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 38 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 39 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 39 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 40 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 40 | 41 | ||
| 41 | /* compatibility flags */ | 42 | /* compatibility flags */ |
| 42 | #define MAP_ANON MAP_ANONYMOUS | 43 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-m68k/mman.h b/include/asm-m68k/mman.h index f831c4eeae6e..ea262ab88b3b 100644 --- a/include/asm-m68k/mman.h +++ b/include/asm-m68k/mman.h | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 38 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 38 | 39 | ||
| 39 | /* compatibility flags */ | 40 | /* compatibility flags */ |
| 40 | #define MAP_ANON MAP_ANONYMOUS | 41 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-mips/mman.h b/include/asm-mips/mman.h index 62060957ba93..dd17c8bd62a1 100644 --- a/include/asm-mips/mman.h +++ b/include/asm-mips/mman.h | |||
| @@ -65,6 +65,7 @@ | |||
| 65 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 65 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 66 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 66 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 67 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 67 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 68 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 68 | 69 | ||
| 69 | /* compatibility flags */ | 70 | /* compatibility flags */ |
| 70 | #define MAP_ANON MAP_ANONYMOUS | 71 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-parisc/mman.h b/include/asm-parisc/mman.h index e829607eb8bc..736b0abcac05 100644 --- a/include/asm-parisc/mman.h +++ b/include/asm-parisc/mman.h | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #define MADV_SPACEAVAIL 5 /* insure that resources are reserved */ | 38 | #define MADV_SPACEAVAIL 5 /* insure that resources are reserved */ |
| 39 | #define MADV_VPS_PURGE 6 /* Purge pages from VM page cache */ | 39 | #define MADV_VPS_PURGE 6 /* Purge pages from VM page cache */ |
| 40 | #define MADV_VPS_INHERIT 7 /* Inherit parents page size */ | 40 | #define MADV_VPS_INHERIT 7 /* Inherit parents page size */ |
| 41 | #define MADV_REMOVE 8 /* remove these pages & resources */ | ||
| 41 | 42 | ||
| 42 | /* The range 12-64 is reserved for page size specification. */ | 43 | /* The range 12-64 is reserved for page size specification. */ |
| 43 | #define MADV_4K_PAGES 12 /* Use 4K pages */ | 44 | #define MADV_4K_PAGES 12 /* Use 4K pages */ |
diff --git a/include/asm-powerpc/mman.h b/include/asm-powerpc/mman.h index f5e5342fcac5..a2e34c21b44f 100644 --- a/include/asm-powerpc/mman.h +++ b/include/asm-powerpc/mman.h | |||
| @@ -44,6 +44,7 @@ | |||
| 44 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 44 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 45 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 45 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 46 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 46 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 47 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 47 | 48 | ||
| 48 | /* compatibility flags */ | 49 | /* compatibility flags */ |
| 49 | #define MAP_ANON MAP_ANONYMOUS | 50 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-s390/mman.h b/include/asm-s390/mman.h index ea86bd12204f..c8d5409b5d56 100644 --- a/include/asm-s390/mman.h +++ b/include/asm-s390/mman.h | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 43 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 44 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 44 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 45 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 45 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 46 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 46 | 47 | ||
| 47 | /* compatibility flags */ | 48 | /* compatibility flags */ |
| 48 | #define MAP_ANON MAP_ANONYMOUS | 49 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-sh/mman.h b/include/asm-sh/mman.h index 3ebab5f79db7..693bd55a3710 100644 --- a/include/asm-sh/mman.h +++ b/include/asm-sh/mman.h | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 37 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 38 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 38 | 39 | ||
| 39 | /* compatibility flags */ | 40 | /* compatibility flags */ |
| 40 | #define MAP_ANON MAP_ANONYMOUS | 41 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-sparc/mman.h b/include/asm-sparc/mman.h index 138eb81dd70d..98435ad8619e 100644 --- a/include/asm-sparc/mman.h +++ b/include/asm-sparc/mman.h | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 54 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 55 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 55 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 56 | #define MADV_FREE 0x5 /* (Solaris) contents can be freed */ | 56 | #define MADV_FREE 0x5 /* (Solaris) contents can be freed */ |
| 57 | #define MADV_REMOVE 0x6 /* remove these pages & resources */ | ||
| 57 | 58 | ||
| 58 | /* compatibility flags */ | 59 | /* compatibility flags */ |
| 59 | #define MAP_ANON MAP_ANONYMOUS | 60 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-sparc64/mman.h b/include/asm-sparc64/mman.h index 01cecf54357b..cb4b6156194d 100644 --- a/include/asm-sparc64/mman.h +++ b/include/asm-sparc64/mman.h | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 54 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 55 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 55 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 56 | #define MADV_FREE 0x5 /* (Solaris) contents can be freed */ | 56 | #define MADV_FREE 0x5 /* (Solaris) contents can be freed */ |
| 57 | #define MADV_REMOVE 0x6 /* remove these pages & resources */ | ||
| 57 | 58 | ||
| 58 | /* compatibility flags */ | 59 | /* compatibility flags */ |
| 59 | #define MAP_ANON MAP_ANONYMOUS | 60 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-v850/mman.h b/include/asm-v850/mman.h index e2b90081b56f..edc79965193a 100644 --- a/include/asm-v850/mman.h +++ b/include/asm-v850/mman.h | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 32 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 33 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 33 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 34 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 34 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 35 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 35 | 36 | ||
| 36 | /* compatibility flags */ | 37 | /* compatibility flags */ |
| 37 | #define MAP_ANON MAP_ANONYMOUS | 38 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-x86_64/mman.h b/include/asm-x86_64/mman.h index 78e60a4fd4ee..d0e97b74f735 100644 --- a/include/asm-x86_64/mman.h +++ b/include/asm-x86_64/mman.h | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 36 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 37 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 37 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 38 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 38 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 39 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 39 | 40 | ||
| 40 | /* compatibility flags */ | 41 | /* compatibility flags */ |
| 41 | #define MAP_ANON MAP_ANONYMOUS | 42 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/asm-xtensa/mman.h b/include/asm-xtensa/mman.h index 9a95a45df996..082a7504925e 100644 --- a/include/asm-xtensa/mman.h +++ b/include/asm-xtensa/mman.h | |||
| @@ -72,6 +72,7 @@ | |||
| 72 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | 72 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ |
| 73 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | 73 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ |
| 74 | #define MADV_DONTNEED 0x4 /* discard these pages */ | 74 | #define MADV_DONTNEED 0x4 /* discard these pages */ |
| 75 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 75 | 76 | ||
| 76 | /* compatibility flags */ | 77 | /* compatibility flags */ |
| 77 | #define MAP_ANON MAP_ANONYMOUS | 78 | #define MAP_ANON MAP_ANONYMOUS |
diff --git a/include/linux/fs.h b/include/linux/fs.h index ed9a41a71e8b..115e72be25d0 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -1050,6 +1050,7 @@ struct inode_operations { | |||
| 1050 | ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); | 1050 | ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); |
| 1051 | ssize_t (*listxattr) (struct dentry *, char *, size_t); | 1051 | ssize_t (*listxattr) (struct dentry *, char *, size_t); |
| 1052 | int (*removexattr) (struct dentry *, const char *); | 1052 | int (*removexattr) (struct dentry *, const char *); |
| 1053 | void (*truncate_range)(struct inode *, loff_t, loff_t); | ||
| 1053 | }; | 1054 | }; |
| 1054 | 1055 | ||
| 1055 | struct seq_file; | 1056 | struct seq_file; |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 92acae9f1f4c..6c9be99429f3 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -690,6 +690,7 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping, | |||
| 690 | } | 690 | } |
| 691 | 691 | ||
| 692 | extern int vmtruncate(struct inode * inode, loff_t offset); | 692 | extern int vmtruncate(struct inode * inode, loff_t offset); |
| 693 | extern int vmtruncate_range(struct inode * inode, loff_t offset, loff_t end); | ||
| 693 | extern int install_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, struct page *page, pgprot_t prot); | 694 | extern int install_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, struct page *page, pgprot_t prot); |
| 694 | extern int install_file_pte(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long pgoff, pgprot_t prot); | 695 | extern int install_file_pte(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long pgoff, pgprot_t prot); |
| 695 | extern int __handle_mm_fault(struct mm_struct *mm,struct vm_area_struct *vma, unsigned long address, int write_access); | 696 | extern int __handle_mm_fault(struct mm_struct *mm,struct vm_area_struct *vma, unsigned long address, int write_access); |
diff --git a/mm/madvise.c b/mm/madvise.c index 2b7cf0400a21..ae0ae3ea299a 100644 --- a/mm/madvise.c +++ b/mm/madvise.c | |||
| @@ -140,6 +140,36 @@ static long madvise_dontneed(struct vm_area_struct * vma, | |||
| 140 | return 0; | 140 | return 0; |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | /* | ||
| 144 | * Application wants to free up the pages and associated backing store. | ||
| 145 | * This is effectively punching a hole into the middle of a file. | ||
| 146 | * | ||
| 147 | * NOTE: Currently, only shmfs/tmpfs is supported for this operation. | ||
| 148 | * Other filesystems return -ENOSYS. | ||
| 149 | */ | ||
| 150 | static long madvise_remove(struct vm_area_struct *vma, | ||
| 151 | unsigned long start, unsigned long end) | ||
| 152 | { | ||
| 153 | struct address_space *mapping; | ||
| 154 | loff_t offset, endoff; | ||
| 155 | |||
| 156 | if (vma->vm_flags & (VM_LOCKED|VM_NONLINEAR|VM_HUGETLB)) | ||
| 157 | return -EINVAL; | ||
| 158 | |||
| 159 | if (!vma->vm_file || !vma->vm_file->f_mapping | ||
| 160 | || !vma->vm_file->f_mapping->host) { | ||
| 161 | return -EINVAL; | ||
| 162 | } | ||
| 163 | |||
| 164 | mapping = vma->vm_file->f_mapping; | ||
| 165 | |||
| 166 | offset = (loff_t)(start - vma->vm_start) | ||
| 167 | + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); | ||
| 168 | endoff = (loff_t)(end - vma->vm_start - 1) | ||
| 169 | + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); | ||
| 170 | return vmtruncate_range(mapping->host, offset, endoff); | ||
| 171 | } | ||
| 172 | |||
| 143 | static long | 173 | static long |
| 144 | madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev, | 174 | madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev, |
| 145 | unsigned long start, unsigned long end, int behavior) | 175 | unsigned long start, unsigned long end, int behavior) |
| @@ -152,6 +182,9 @@ madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev, | |||
| 152 | case MADV_RANDOM: | 182 | case MADV_RANDOM: |
| 153 | error = madvise_behavior(vma, prev, start, end, behavior); | 183 | error = madvise_behavior(vma, prev, start, end, behavior); |
| 154 | break; | 184 | break; |
| 185 | case MADV_REMOVE: | ||
| 186 | error = madvise_remove(vma, start, end); | ||
| 187 | break; | ||
| 155 | 188 | ||
| 156 | case MADV_WILLNEED: | 189 | case MADV_WILLNEED: |
| 157 | error = madvise_willneed(vma, prev, start, end); | 190 | error = madvise_willneed(vma, prev, start, end); |
| @@ -190,6 +223,8 @@ madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev, | |||
| 190 | * some pages ahead. | 223 | * some pages ahead. |
| 191 | * MADV_DONTNEED - the application is finished with the given range, | 224 | * MADV_DONTNEED - the application is finished with the given range, |
| 192 | * so the kernel can free resources associated with it. | 225 | * so the kernel can free resources associated with it. |
| 226 | * MADV_REMOVE - the application wants to free up the given range of | ||
| 227 | * pages and associated backing store. | ||
| 193 | * | 228 | * |
| 194 | * return values: | 229 | * return values: |
| 195 | * zero - success | 230 | * zero - success |
diff --git a/mm/memory.c b/mm/memory.c index d8dde07a3656..e249088908c4 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -1770,9 +1770,32 @@ out_big: | |||
| 1770 | out_busy: | 1770 | out_busy: |
| 1771 | return -ETXTBSY; | 1771 | return -ETXTBSY; |
| 1772 | } | 1772 | } |
| 1773 | |||
| 1774 | EXPORT_SYMBOL(vmtruncate); | 1773 | EXPORT_SYMBOL(vmtruncate); |
| 1775 | 1774 | ||
| 1775 | int vmtruncate_range(struct inode *inode, loff_t offset, loff_t end) | ||
| 1776 | { | ||
| 1777 | struct address_space *mapping = inode->i_mapping; | ||
| 1778 | |||
| 1779 | /* | ||
| 1780 | * If the underlying filesystem is not going to provide | ||
| 1781 | * a way to truncate a range of blocks (punch a hole) - | ||
| 1782 | * we should return failure right now. | ||
| 1783 | */ | ||
| 1784 | if (!inode->i_op || !inode->i_op->truncate_range) | ||
| 1785 | return -ENOSYS; | ||
| 1786 | |||
| 1787 | down(&inode->i_sem); | ||
| 1788 | down_write(&inode->i_alloc_sem); | ||
| 1789 | unmap_mapping_range(mapping, offset, (end - offset), 1); | ||
| 1790 | truncate_inode_pages_range(mapping, offset, end); | ||
| 1791 | inode->i_op->truncate_range(inode, offset, end); | ||
| 1792 | up_write(&inode->i_alloc_sem); | ||
| 1793 | up(&inode->i_sem); | ||
| 1794 | |||
| 1795 | return 0; | ||
| 1796 | } | ||
| 1797 | EXPORT_SYMBOL(vmtruncate_range); | ||
| 1798 | |||
| 1776 | /* | 1799 | /* |
| 1777 | * Primitive swap readahead code. We simply read an aligned block of | 1800 | * Primitive swap readahead code. We simply read an aligned block of |
| 1778 | * (1 << page_cluster) entries in the swap area. This method is chosen | 1801 | * (1 << page_cluster) entries in the swap area. This method is chosen |
diff --git a/mm/shmem.c b/mm/shmem.c index d9fc277940da..65c148efa2ed 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
| @@ -457,7 +457,7 @@ static void shmem_free_pages(struct list_head *next) | |||
| 457 | } while (next); | 457 | } while (next); |
| 458 | } | 458 | } |
| 459 | 459 | ||
| 460 | static void shmem_truncate(struct inode *inode) | 460 | static void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end) |
| 461 | { | 461 | { |
| 462 | struct shmem_inode_info *info = SHMEM_I(inode); | 462 | struct shmem_inode_info *info = SHMEM_I(inode); |
| 463 | unsigned long idx; | 463 | unsigned long idx; |
| @@ -475,18 +475,27 @@ static void shmem_truncate(struct inode *inode) | |||
| 475 | long nr_swaps_freed = 0; | 475 | long nr_swaps_freed = 0; |
| 476 | int offset; | 476 | int offset; |
| 477 | int freed; | 477 | int freed; |
| 478 | int punch_hole = 0; | ||
| 478 | 479 | ||
| 479 | inode->i_ctime = inode->i_mtime = CURRENT_TIME; | 480 | inode->i_ctime = inode->i_mtime = CURRENT_TIME; |
| 480 | idx = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | 481 | idx = (start + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; |
| 481 | if (idx >= info->next_index) | 482 | if (idx >= info->next_index) |
| 482 | return; | 483 | return; |
| 483 | 484 | ||
| 484 | spin_lock(&info->lock); | 485 | spin_lock(&info->lock); |
| 485 | info->flags |= SHMEM_TRUNCATE; | 486 | info->flags |= SHMEM_TRUNCATE; |
| 486 | limit = info->next_index; | 487 | if (likely(end == (loff_t) -1)) { |
| 487 | info->next_index = idx; | 488 | limit = info->next_index; |
| 489 | info->next_index = idx; | ||
| 490 | } else { | ||
| 491 | limit = (end + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | ||
| 492 | if (limit > info->next_index) | ||
| 493 | limit = info->next_index; | ||
| 494 | punch_hole = 1; | ||
| 495 | } | ||
| 496 | |||
| 488 | topdir = info->i_indirect; | 497 | topdir = info->i_indirect; |
| 489 | if (topdir && idx <= SHMEM_NR_DIRECT) { | 498 | if (topdir && idx <= SHMEM_NR_DIRECT && !punch_hole) { |
| 490 | info->i_indirect = NULL; | 499 | info->i_indirect = NULL; |
| 491 | nr_pages_to_free++; | 500 | nr_pages_to_free++; |
| 492 | list_add(&topdir->lru, &pages_to_free); | 501 | list_add(&topdir->lru, &pages_to_free); |
| @@ -573,11 +582,12 @@ static void shmem_truncate(struct inode *inode) | |||
| 573 | set_page_private(subdir, page_private(subdir) - freed); | 582 | set_page_private(subdir, page_private(subdir) - freed); |
| 574 | if (offset) | 583 | if (offset) |
| 575 | spin_unlock(&info->lock); | 584 | spin_unlock(&info->lock); |
| 576 | BUG_ON(page_private(subdir) > offset); | 585 | if (!punch_hole) |
| 586 | BUG_ON(page_private(subdir) > offset); | ||
| 577 | } | 587 | } |
| 578 | if (offset) | 588 | if (offset) |
| 579 | offset = 0; | 589 | offset = 0; |
| 580 | else if (subdir) { | 590 | else if (subdir && !page_private(subdir)) { |
| 581 | dir[diroff] = NULL; | 591 | dir[diroff] = NULL; |
| 582 | nr_pages_to_free++; | 592 | nr_pages_to_free++; |
| 583 | list_add(&subdir->lru, &pages_to_free); | 593 | list_add(&subdir->lru, &pages_to_free); |
| @@ -594,7 +604,7 @@ done2: | |||
| 594 | * Also, though shmem_getpage checks i_size before adding to | 604 | * Also, though shmem_getpage checks i_size before adding to |
| 595 | * cache, no recheck after: so fix the narrow window there too. | 605 | * cache, no recheck after: so fix the narrow window there too. |
| 596 | */ | 606 | */ |
| 597 | truncate_inode_pages(inode->i_mapping, inode->i_size); | 607 | truncate_inode_pages_range(inode->i_mapping, start, end); |
| 598 | } | 608 | } |
| 599 | 609 | ||
| 600 | spin_lock(&info->lock); | 610 | spin_lock(&info->lock); |
| @@ -614,6 +624,11 @@ done2: | |||
| 614 | } | 624 | } |
| 615 | } | 625 | } |
| 616 | 626 | ||
| 627 | static void shmem_truncate(struct inode *inode) | ||
| 628 | { | ||
| 629 | shmem_truncate_range(inode, inode->i_size, (loff_t)-1); | ||
| 630 | } | ||
| 631 | |||
| 617 | static int shmem_notify_change(struct dentry *dentry, struct iattr *attr) | 632 | static int shmem_notify_change(struct dentry *dentry, struct iattr *attr) |
| 618 | { | 633 | { |
| 619 | struct inode *inode = dentry->d_inode; | 634 | struct inode *inode = dentry->d_inode; |
| @@ -2083,6 +2098,7 @@ static struct file_operations shmem_file_operations = { | |||
| 2083 | static struct inode_operations shmem_inode_operations = { | 2098 | static struct inode_operations shmem_inode_operations = { |
| 2084 | .truncate = shmem_truncate, | 2099 | .truncate = shmem_truncate, |
| 2085 | .setattr = shmem_notify_change, | 2100 | .setattr = shmem_notify_change, |
| 2101 | .truncate_range = shmem_truncate_range, | ||
| 2086 | }; | 2102 | }; |
| 2087 | 2103 | ||
| 2088 | static struct inode_operations shmem_dir_inode_operations = { | 2104 | static struct inode_operations shmem_dir_inode_operations = { |
