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 = { |