diff options
57 files changed, 81 insertions, 46 deletions
diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting index f24d1b833957..3eb7c35c9698 100644 --- a/Documentation/filesystems/porting +++ b/Documentation/filesystems/porting | |||
@@ -504,3 +504,8 @@ in your dentry operations instead. | |||
504 | [mandatory] | 504 | [mandatory] |
505 | __fd_install() & fd_install() can now sleep. Callers should not | 505 | __fd_install() & fd_install() can now sleep. Callers should not |
506 | hold a spinlock or other resources that do not allow a schedule. | 506 | hold a spinlock or other resources that do not allow a schedule. |
507 | -- | ||
508 | [mandatory] | ||
509 | any symlink that might use page_follow_link_light/page_put_link() must | ||
510 | have inode_nohighmem(inode) called before anything might start playing with | ||
511 | its pagecache. | ||
diff --git a/fs/affs/inode.c b/fs/affs/inode.c index 17349500592d..0fdb0f5b2239 100644 --- a/fs/affs/inode.c +++ b/fs/affs/inode.c | |||
@@ -140,6 +140,7 @@ struct inode *affs_iget(struct super_block *sb, unsigned long ino) | |||
140 | break; | 140 | break; |
141 | case ST_SOFTLINK: | 141 | case ST_SOFTLINK: |
142 | inode->i_mode |= S_IFLNK; | 142 | inode->i_mode |= S_IFLNK; |
143 | inode_nohighmem(inode); | ||
143 | inode->i_op = &affs_symlink_inode_operations; | 144 | inode->i_op = &affs_symlink_inode_operations; |
144 | inode->i_data.a_ops = &affs_symlink_aops; | 145 | inode->i_data.a_ops = &affs_symlink_aops; |
145 | break; | 146 | break; |
diff --git a/fs/affs/namei.c b/fs/affs/namei.c index 181e05b46e72..00d3002a6780 100644 --- a/fs/affs/namei.c +++ b/fs/affs/namei.c | |||
@@ -344,6 +344,7 @@ affs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) | |||
344 | return -ENOSPC; | 344 | return -ENOSPC; |
345 | 345 | ||
346 | inode->i_op = &affs_symlink_inode_operations; | 346 | inode->i_op = &affs_symlink_inode_operations; |
347 | inode_nohighmem(inode); | ||
347 | inode->i_data.a_ops = &affs_symlink_aops; | 348 | inode->i_data.a_ops = &affs_symlink_aops; |
348 | inode->i_mode = S_IFLNK | 0777; | 349 | inode->i_mode = S_IFLNK | 0777; |
349 | mode_to_prot(inode); | 350 | mode_to_prot(inode); |
diff --git a/fs/affs/symlink.c b/fs/affs/symlink.c index ea5b69a18ba9..e3f9dc3ae8cc 100644 --- a/fs/affs/symlink.c +++ b/fs/affs/symlink.c | |||
@@ -14,7 +14,7 @@ static int affs_symlink_readpage(struct file *file, struct page *page) | |||
14 | { | 14 | { |
15 | struct buffer_head *bh; | 15 | struct buffer_head *bh; |
16 | struct inode *inode = page->mapping->host; | 16 | struct inode *inode = page->mapping->host; |
17 | char *link = kmap(page); | 17 | char *link = page_address(page); |
18 | struct slink_front *lf; | 18 | struct slink_front *lf; |
19 | int i, j; | 19 | int i, j; |
20 | char c; | 20 | char c; |
@@ -57,12 +57,10 @@ static int affs_symlink_readpage(struct file *file, struct page *page) | |||
57 | link[i] = '\0'; | 57 | link[i] = '\0'; |
58 | affs_brelse(bh); | 58 | affs_brelse(bh); |
59 | SetPageUptodate(page); | 59 | SetPageUptodate(page); |
60 | kunmap(page); | ||
61 | unlock_page(page); | 60 | unlock_page(page); |
62 | return 0; | 61 | return 0; |
63 | fail: | 62 | fail: |
64 | SetPageError(page); | 63 | SetPageError(page); |
65 | kunmap(page); | ||
66 | unlock_page(page); | 64 | unlock_page(page); |
67 | return -EIO; | 65 | return -EIO; |
68 | } | 66 | } |
diff --git a/fs/afs/inode.c b/fs/afs/inode.c index e06f5a23352a..86cc7264c21c 100644 --- a/fs/afs/inode.c +++ b/fs/afs/inode.c | |||
@@ -56,6 +56,7 @@ static int afs_inode_map_status(struct afs_vnode *vnode, struct key *key) | |||
56 | case AFS_FTYPE_SYMLINK: | 56 | case AFS_FTYPE_SYMLINK: |
57 | inode->i_mode = S_IFLNK | vnode->status.mode; | 57 | inode->i_mode = S_IFLNK | vnode->status.mode; |
58 | inode->i_op = &page_symlink_inode_operations; | 58 | inode->i_op = &page_symlink_inode_operations; |
59 | inode_nohighmem(inode); | ||
59 | break; | 60 | break; |
60 | default: | 61 | default: |
61 | printk("kAFS: AFS vnode with undefined type\n"); | 62 | printk("kAFS: AFS vnode with undefined type\n"); |
diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index 1c8b0dca8b50..25250fa87086 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c | |||
@@ -397,6 +397,7 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino) | |||
397 | } else if (S_ISLNK(inode->i_mode)) { | 397 | } else if (S_ISLNK(inode->i_mode)) { |
398 | if (befs_ino->i_flags & BEFS_LONG_SYMLINK) { | 398 | if (befs_ino->i_flags & BEFS_LONG_SYMLINK) { |
399 | inode->i_op = &page_symlink_inode_operations; | 399 | inode->i_op = &page_symlink_inode_operations; |
400 | inode_nohighmem(inode); | ||
400 | inode->i_mapping->a_ops = &befs_symlink_aops; | 401 | inode->i_mapping->a_ops = &befs_symlink_aops; |
401 | } else { | 402 | } else { |
402 | inode->i_link = befs_ino->i_data.symlink; | 403 | inode->i_link = befs_ino->i_data.symlink; |
@@ -469,7 +470,7 @@ static int befs_symlink_readpage(struct file *unused, struct page *page) | |||
469 | struct befs_inode_info *befs_ino = BEFS_I(inode); | 470 | struct befs_inode_info *befs_ino = BEFS_I(inode); |
470 | befs_data_stream *data = &befs_ino->i_data.ds; | 471 | befs_data_stream *data = &befs_ino->i_data.ds; |
471 | befs_off_t len = data->size; | 472 | befs_off_t len = data->size; |
472 | char *link = kmap(page); | 473 | char *link = page_address(page); |
473 | 474 | ||
474 | if (len == 0 || len > PAGE_SIZE) { | 475 | if (len == 0 || len > PAGE_SIZE) { |
475 | befs_error(sb, "Long symlink with illegal length"); | 476 | befs_error(sb, "Long symlink with illegal length"); |
@@ -483,12 +484,10 @@ static int befs_symlink_readpage(struct file *unused, struct page *page) | |||
483 | } | 484 | } |
484 | link[len - 1] = '\0'; | 485 | link[len - 1] = '\0'; |
485 | SetPageUptodate(page); | 486 | SetPageUptodate(page); |
486 | kunmap(page); | ||
487 | unlock_page(page); | 487 | unlock_page(page); |
488 | return 0; | 488 | return 0; |
489 | fail: | 489 | fail: |
490 | SetPageError(page); | 490 | SetPageError(page); |
491 | kunmap(page); | ||
492 | unlock_page(page); | 491 | unlock_page(page); |
493 | return -EIO; | 492 | return -EIO; |
494 | } | 493 | } |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index a70c5790f8f5..70f98bfde277 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -3774,6 +3774,7 @@ cache_acl: | |||
3774 | break; | 3774 | break; |
3775 | case S_IFLNK: | 3775 | case S_IFLNK: |
3776 | inode->i_op = &btrfs_symlink_inode_operations; | 3776 | inode->i_op = &btrfs_symlink_inode_operations; |
3777 | inode_nohighmem(inode); | ||
3777 | inode->i_mapping->a_ops = &btrfs_symlink_aops; | 3778 | inode->i_mapping->a_ops = &btrfs_symlink_aops; |
3778 | break; | 3779 | break; |
3779 | default: | 3780 | default: |
@@ -9705,6 +9706,7 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
9705 | btrfs_free_path(path); | 9706 | btrfs_free_path(path); |
9706 | 9707 | ||
9707 | inode->i_op = &btrfs_symlink_inode_operations; | 9708 | inode->i_op = &btrfs_symlink_inode_operations; |
9709 | inode_nohighmem(inode); | ||
9708 | inode->i_mapping->a_ops = &btrfs_symlink_aops; | 9710 | inode->i_mapping->a_ops = &btrfs_symlink_aops; |
9709 | inode_set_bytes(inode, name_len); | 9711 | inode_set_bytes(inode, name_len); |
9710 | btrfs_i_size_write(inode, name_len); | 9712 | btrfs_i_size_write(inode, name_len); |
diff --git a/fs/coda/cnode.c b/fs/coda/cnode.c index 7740b1c871c1..dd6a79ef4750 100644 --- a/fs/coda/cnode.c +++ b/fs/coda/cnode.c | |||
@@ -8,6 +8,7 @@ | |||
8 | 8 | ||
9 | #include <linux/coda.h> | 9 | #include <linux/coda.h> |
10 | #include <linux/coda_psdev.h> | 10 | #include <linux/coda_psdev.h> |
11 | #include <linux/pagemap.h> | ||
11 | #include "coda_linux.h" | 12 | #include "coda_linux.h" |
12 | 13 | ||
13 | static inline int coda_fideq(struct CodaFid *fid1, struct CodaFid *fid2) | 14 | static inline int coda_fideq(struct CodaFid *fid1, struct CodaFid *fid2) |
@@ -35,6 +36,7 @@ static void coda_fill_inode(struct inode *inode, struct coda_vattr *attr) | |||
35 | inode->i_fop = &coda_dir_operations; | 36 | inode->i_fop = &coda_dir_operations; |
36 | } else if (S_ISLNK(inode->i_mode)) { | 37 | } else if (S_ISLNK(inode->i_mode)) { |
37 | inode->i_op = &coda_symlink_inode_operations; | 38 | inode->i_op = &coda_symlink_inode_operations; |
39 | inode_nohighmem(inode); | ||
38 | inode->i_data.a_ops = &coda_symlink_aops; | 40 | inode->i_data.a_ops = &coda_symlink_aops; |
39 | inode->i_mapping = &inode->i_data; | 41 | inode->i_mapping = &inode->i_data; |
40 | } else | 42 | } else |
diff --git a/fs/coda/symlink.c b/fs/coda/symlink.c index ab94ef63caef..03736e20d720 100644 --- a/fs/coda/symlink.c +++ b/fs/coda/symlink.c | |||
@@ -26,7 +26,7 @@ static int coda_symlink_filler(struct file *file, struct page *page) | |||
26 | int error; | 26 | int error; |
27 | struct coda_inode_info *cii; | 27 | struct coda_inode_info *cii; |
28 | unsigned int len = PAGE_SIZE; | 28 | unsigned int len = PAGE_SIZE; |
29 | char *p = kmap(page); | 29 | char *p = page_address(page); |
30 | 30 | ||
31 | cii = ITOC(inode); | 31 | cii = ITOC(inode); |
32 | 32 | ||
@@ -34,13 +34,11 @@ static int coda_symlink_filler(struct file *file, struct page *page) | |||
34 | if (error) | 34 | if (error) |
35 | goto fail; | 35 | goto fail; |
36 | SetPageUptodate(page); | 36 | SetPageUptodate(page); |
37 | kunmap(page); | ||
38 | unlock_page(page); | 37 | unlock_page(page); |
39 | return 0; | 38 | return 0; |
40 | 39 | ||
41 | fail: | 40 | fail: |
42 | SetPageError(page); | 41 | SetPageError(page); |
43 | kunmap(page); | ||
44 | unlock_page(page); | 42 | unlock_page(page); |
45 | return error; | 43 | return error; |
46 | } | 44 | } |
diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index 355c522f3585..b862bc219cd7 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c | |||
@@ -100,6 +100,7 @@ static struct inode *get_cramfs_inode(struct super_block *sb, | |||
100 | break; | 100 | break; |
101 | case S_IFLNK: | 101 | case S_IFLNK: |
102 | inode->i_op = &page_symlink_inode_operations; | 102 | inode->i_op = &page_symlink_inode_operations; |
103 | inode_nohighmem(inode); | ||
103 | inode->i_data.a_ops = &cramfs_aops; | 104 | inode->i_data.a_ops = &cramfs_aops; |
104 | break; | 105 | break; |
105 | default: | 106 | default: |
diff --git a/fs/efs/inode.c b/fs/efs/inode.c index 079d20306ee1..cdf0872382af 100644 --- a/fs/efs/inode.c +++ b/fs/efs/inode.c | |||
@@ -151,6 +151,7 @@ struct inode *efs_iget(struct super_block *super, unsigned long ino) | |||
151 | break; | 151 | break; |
152 | case S_IFLNK: | 152 | case S_IFLNK: |
153 | inode->i_op = &page_symlink_inode_operations; | 153 | inode->i_op = &page_symlink_inode_operations; |
154 | inode_nohighmem(inode); | ||
154 | inode->i_data.a_ops = &efs_symlink_aops; | 155 | inode->i_data.a_ops = &efs_symlink_aops; |
155 | break; | 156 | break; |
156 | case S_IFCHR: | 157 | case S_IFCHR: |
diff --git a/fs/efs/symlink.c b/fs/efs/symlink.c index 75117d0dac2b..4870cc82deb0 100644 --- a/fs/efs/symlink.c +++ b/fs/efs/symlink.c | |||
@@ -13,7 +13,7 @@ | |||
13 | 13 | ||
14 | static int efs_symlink_readpage(struct file *file, struct page *page) | 14 | static int efs_symlink_readpage(struct file *file, struct page *page) |
15 | { | 15 | { |
16 | char *link = kmap(page); | 16 | char *link = page_address(page); |
17 | struct buffer_head * bh; | 17 | struct buffer_head * bh; |
18 | struct inode * inode = page->mapping->host; | 18 | struct inode * inode = page->mapping->host; |
19 | efs_block_t size = inode->i_size; | 19 | efs_block_t size = inode->i_size; |
@@ -39,12 +39,10 @@ static int efs_symlink_readpage(struct file *file, struct page *page) | |||
39 | } | 39 | } |
40 | link[size] = '\0'; | 40 | link[size] = '\0'; |
41 | SetPageUptodate(page); | 41 | SetPageUptodate(page); |
42 | kunmap(page); | ||
43 | unlock_page(page); | 42 | unlock_page(page); |
44 | return 0; | 43 | return 0; |
45 | fail: | 44 | fail: |
46 | SetPageError(page); | 45 | SetPageError(page); |
47 | kunmap(page); | ||
48 | unlock_page(page); | 46 | unlock_page(page); |
49 | return err; | 47 | return err; |
50 | } | 48 | } |
diff --git a/fs/exofs/inode.c b/fs/exofs/inode.c index 73c64daa0f55..d8e9c18171a9 100644 --- a/fs/exofs/inode.c +++ b/fs/exofs/inode.c | |||
@@ -1227,6 +1227,7 @@ struct inode *exofs_iget(struct super_block *sb, unsigned long ino) | |||
1227 | inode->i_link = (char *)oi->i_data; | 1227 | inode->i_link = (char *)oi->i_data; |
1228 | } else { | 1228 | } else { |
1229 | inode->i_op = &page_symlink_inode_operations; | 1229 | inode->i_op = &page_symlink_inode_operations; |
1230 | inode_nohighmem(inode); | ||
1230 | inode->i_mapping->a_ops = &exofs_aops; | 1231 | inode->i_mapping->a_ops = &exofs_aops; |
1231 | } | 1232 | } |
1232 | } else { | 1233 | } else { |
diff --git a/fs/exofs/namei.c b/fs/exofs/namei.c index 994e078da4bb..c20d77df2679 100644 --- a/fs/exofs/namei.c +++ b/fs/exofs/namei.c | |||
@@ -111,6 +111,7 @@ static int exofs_symlink(struct inode *dir, struct dentry *dentry, | |||
111 | if (l > sizeof(oi->i_data)) { | 111 | if (l > sizeof(oi->i_data)) { |
112 | /* slow symlink */ | 112 | /* slow symlink */ |
113 | inode->i_op = &page_symlink_inode_operations; | 113 | inode->i_op = &page_symlink_inode_operations; |
114 | inode_nohighmem(inode); | ||
114 | inode->i_mapping->a_ops = &exofs_aops; | 115 | inode->i_mapping->a_ops = &exofs_aops; |
115 | memset(oi->i_data, 0, sizeof(oi->i_data)); | 116 | memset(oi->i_data, 0, sizeof(oi->i_data)); |
116 | 117 | ||
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 0aa9bf6e6e53..338eefda70c6 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c | |||
@@ -1420,6 +1420,7 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino) | |||
1420 | sizeof(ei->i_data) - 1); | 1420 | sizeof(ei->i_data) - 1); |
1421 | } else { | 1421 | } else { |
1422 | inode->i_op = &ext2_symlink_inode_operations; | 1422 | inode->i_op = &ext2_symlink_inode_operations; |
1423 | inode_nohighmem(inode); | ||
1423 | if (test_opt(inode->i_sb, NOBH)) | 1424 | if (test_opt(inode->i_sb, NOBH)) |
1424 | inode->i_mapping->a_ops = &ext2_nobh_aops; | 1425 | inode->i_mapping->a_ops = &ext2_nobh_aops; |
1425 | else | 1426 | else |
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index 3267a80dbbe2..7a2be8f7f3c3 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c | |||
@@ -183,6 +183,7 @@ static int ext2_symlink (struct inode * dir, struct dentry * dentry, | |||
183 | if (l > sizeof (EXT2_I(inode)->i_data)) { | 183 | if (l > sizeof (EXT2_I(inode)->i_data)) { |
184 | /* slow symlink */ | 184 | /* slow symlink */ |
185 | inode->i_op = &ext2_symlink_inode_operations; | 185 | inode->i_op = &ext2_symlink_inode_operations; |
186 | inode_nohighmem(inode); | ||
186 | if (test_opt(inode->i_sb, NOBH)) | 187 | if (test_opt(inode->i_sb, NOBH)) |
187 | inode->i_mapping->a_ops = &ext2_nobh_aops; | 188 | inode->i_mapping->a_ops = &ext2_nobh_aops; |
188 | else | 189 | else |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index ea433a7f4bca..b3bd912df6bf 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -4283,6 +4283,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
4283 | inode->i_op = &ext4_symlink_inode_operations; | 4283 | inode->i_op = &ext4_symlink_inode_operations; |
4284 | ext4_set_aops(inode); | 4284 | ext4_set_aops(inode); |
4285 | } | 4285 | } |
4286 | inode_nohighmem(inode); | ||
4286 | } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || | 4287 | } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || |
4287 | S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { | 4288 | S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { |
4288 | inode->i_op = &ext4_special_inode_operations; | 4289 | inode->i_op = &ext4_special_inode_operations; |
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index a969ab39f302..f27e0c2598c5 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
@@ -3132,6 +3132,7 @@ static int ext4_symlink(struct inode *dir, | |||
3132 | if ((disk_link.len > EXT4_N_BLOCKS * 4)) { | 3132 | if ((disk_link.len > EXT4_N_BLOCKS * 4)) { |
3133 | if (!encryption_required) | 3133 | if (!encryption_required) |
3134 | inode->i_op = &ext4_symlink_inode_operations; | 3134 | inode->i_op = &ext4_symlink_inode_operations; |
3135 | inode_nohighmem(inode); | ||
3135 | ext4_set_aops(inode); | 3136 | ext4_set_aops(inode); |
3136 | /* | 3137 | /* |
3137 | * We cannot call page_symlink() with transaction started | 3138 | * We cannot call page_symlink() with transaction started |
diff --git a/fs/ext4/symlink.c b/fs/ext4/symlink.c index abe2401ce405..0e6dc44c5ebf 100644 --- a/fs/ext4/symlink.c +++ b/fs/ext4/symlink.c | |||
@@ -45,7 +45,7 @@ static const char *ext4_encrypted_follow_link(struct dentry *dentry, void **cook | |||
45 | cpage = read_mapping_page(inode->i_mapping, 0, NULL); | 45 | cpage = read_mapping_page(inode->i_mapping, 0, NULL); |
46 | if (IS_ERR(cpage)) | 46 | if (IS_ERR(cpage)) |
47 | return ERR_CAST(cpage); | 47 | return ERR_CAST(cpage); |
48 | caddr = kmap(cpage); | 48 | caddr = page_address(cpage); |
49 | caddr[size] = 0; | 49 | caddr[size] = 0; |
50 | } | 50 | } |
51 | 51 | ||
@@ -75,16 +75,12 @@ static const char *ext4_encrypted_follow_link(struct dentry *dentry, void **cook | |||
75 | /* Null-terminate the name */ | 75 | /* Null-terminate the name */ |
76 | if (res <= plen) | 76 | if (res <= plen) |
77 | paddr[res] = '\0'; | 77 | paddr[res] = '\0'; |
78 | if (cpage) { | 78 | if (cpage) |
79 | kunmap(cpage); | ||
80 | page_cache_release(cpage); | 79 | page_cache_release(cpage); |
81 | } | ||
82 | return *cookie = paddr; | 80 | return *cookie = paddr; |
83 | errout: | 81 | errout: |
84 | if (cpage) { | 82 | if (cpage) |
85 | kunmap(cpage); | ||
86 | page_cache_release(cpage); | 83 | page_cache_release(cpage); |
87 | } | ||
88 | kfree(paddr); | 84 | kfree(paddr); |
89 | return ERR_PTR(res); | 85 | return ERR_PTR(res); |
90 | } | 86 | } |
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 97e20decacb4..5528801a5baf 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c | |||
@@ -202,6 +202,7 @@ make_now: | |||
202 | inode->i_op = &f2fs_encrypted_symlink_inode_operations; | 202 | inode->i_op = &f2fs_encrypted_symlink_inode_operations; |
203 | else | 203 | else |
204 | inode->i_op = &f2fs_symlink_inode_operations; | 204 | inode->i_op = &f2fs_symlink_inode_operations; |
205 | inode_nohighmem(inode); | ||
205 | inode->i_mapping->a_ops = &f2fs_dblock_aops; | 206 | inode->i_mapping->a_ops = &f2fs_dblock_aops; |
206 | } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || | 207 | } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || |
207 | S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { | 208 | S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { |
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 2c32110f9fc0..484df6850747 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c | |||
@@ -351,6 +351,7 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry, | |||
351 | inode->i_op = &f2fs_encrypted_symlink_inode_operations; | 351 | inode->i_op = &f2fs_encrypted_symlink_inode_operations; |
352 | else | 352 | else |
353 | inode->i_op = &f2fs_symlink_inode_operations; | 353 | inode->i_op = &f2fs_symlink_inode_operations; |
354 | inode_nohighmem(inode); | ||
354 | inode->i_mapping->a_ops = &f2fs_dblock_aops; | 355 | inode->i_mapping->a_ops = &f2fs_dblock_aops; |
355 | 356 | ||
356 | f2fs_lock_op(sbi); | 357 | f2fs_lock_op(sbi); |
@@ -942,7 +943,7 @@ static const char *f2fs_encrypted_follow_link(struct dentry *dentry, void **cook | |||
942 | cpage = read_mapping_page(inode->i_mapping, 0, NULL); | 943 | cpage = read_mapping_page(inode->i_mapping, 0, NULL); |
943 | if (IS_ERR(cpage)) | 944 | if (IS_ERR(cpage)) |
944 | return ERR_CAST(cpage); | 945 | return ERR_CAST(cpage); |
945 | caddr = kmap(cpage); | 946 | caddr = page_address(cpage); |
946 | caddr[size] = 0; | 947 | caddr[size] = 0; |
947 | 948 | ||
948 | /* Symlink is encrypted */ | 949 | /* Symlink is encrypted */ |
@@ -982,13 +983,11 @@ static const char *f2fs_encrypted_follow_link(struct dentry *dentry, void **cook | |||
982 | /* Null-terminate the name */ | 983 | /* Null-terminate the name */ |
983 | paddr[res] = '\0'; | 984 | paddr[res] = '\0'; |
984 | 985 | ||
985 | kunmap(cpage); | ||
986 | page_cache_release(cpage); | 986 | page_cache_release(cpage); |
987 | return *cookie = paddr; | 987 | return *cookie = paddr; |
988 | errout: | 988 | errout: |
989 | kfree(cstr.name); | 989 | kfree(cstr.name); |
990 | f2fs_fname_crypto_free_buffer(&pstr); | 990 | f2fs_fname_crypto_free_buffer(&pstr); |
991 | kunmap(cpage); | ||
992 | page_cache_release(cpage); | 991 | page_cache_release(cpage); |
993 | return ERR_PTR(res); | 992 | return ERR_PTR(res); |
994 | } | 993 | } |
diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c index ef73ed674a27..3e2ccade61ed 100644 --- a/fs/freevxfs/vxfs_inode.c +++ b/fs/freevxfs/vxfs_inode.c | |||
@@ -326,6 +326,7 @@ vxfs_iget(struct super_block *sbp, ino_t ino) | |||
326 | } else if (S_ISLNK(ip->i_mode)) { | 326 | } else if (S_ISLNK(ip->i_mode)) { |
327 | if (!VXFS_ISIMMED(vip)) { | 327 | if (!VXFS_ISIMMED(vip)) { |
328 | ip->i_op = &page_symlink_inode_operations; | 328 | ip->i_op = &page_symlink_inode_operations; |
329 | inode_nohighmem(ip); | ||
329 | ip->i_mapping->a_ops = &vxfs_aops; | 330 | ip->i_mapping->a_ops = &vxfs_aops; |
330 | } else { | 331 | } else { |
331 | ip->i_op = &simple_symlink_inode_operations; | 332 | ip->i_op = &simple_symlink_inode_operations; |
diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index 6dd107d7421e..19b33f8151f1 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c | |||
@@ -403,6 +403,7 @@ struct inode *hfsplus_new_inode(struct super_block *sb, umode_t mode) | |||
403 | } else if (S_ISLNK(inode->i_mode)) { | 403 | } else if (S_ISLNK(inode->i_mode)) { |
404 | sbi->file_count++; | 404 | sbi->file_count++; |
405 | inode->i_op = &page_symlink_inode_operations; | 405 | inode->i_op = &page_symlink_inode_operations; |
406 | inode_nohighmem(inode); | ||
406 | inode->i_mapping->a_ops = &hfsplus_aops; | 407 | inode->i_mapping->a_ops = &hfsplus_aops; |
407 | hip->clump_blocks = 1; | 408 | hip->clump_blocks = 1; |
408 | } else | 409 | } else |
@@ -526,6 +527,7 @@ int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd) | |||
526 | inode->i_mapping->a_ops = &hfsplus_aops; | 527 | inode->i_mapping->a_ops = &hfsplus_aops; |
527 | } else if (S_ISLNK(inode->i_mode)) { | 528 | } else if (S_ISLNK(inode->i_mode)) { |
528 | inode->i_op = &page_symlink_inode_operations; | 529 | inode->i_op = &page_symlink_inode_operations; |
530 | inode_nohighmem(inode); | ||
529 | inode->i_mapping->a_ops = &hfsplus_aops; | 531 | inode->i_mapping->a_ops = &hfsplus_aops; |
530 | } else { | 532 | } else { |
531 | init_special_inode(inode, inode->i_mode, | 533 | init_special_inode(inode, inode->i_mode, |
diff --git a/fs/hpfs/inode.c b/fs/hpfs/inode.c index 933c73780813..1f3c6d76200b 100644 --- a/fs/hpfs/inode.c +++ b/fs/hpfs/inode.c | |||
@@ -77,6 +77,7 @@ void hpfs_read_inode(struct inode *i) | |||
77 | kfree(ea); | 77 | kfree(ea); |
78 | i->i_mode = S_IFLNK | 0777; | 78 | i->i_mode = S_IFLNK | 0777; |
79 | i->i_op = &page_symlink_inode_operations; | 79 | i->i_op = &page_symlink_inode_operations; |
80 | inode_nohighmem(i); | ||
80 | i->i_data.a_ops = &hpfs_symlink_aops; | 81 | i->i_data.a_ops = &hpfs_symlink_aops; |
81 | set_nlink(i, 1); | 82 | set_nlink(i, 1); |
82 | i->i_size = ea_size; | 83 | i->i_size = ea_size; |
diff --git a/fs/hpfs/namei.c b/fs/hpfs/namei.c index ae4d5a1fa4c9..506765afa1a3 100644 --- a/fs/hpfs/namei.c +++ b/fs/hpfs/namei.c | |||
@@ -332,6 +332,7 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy | |||
332 | result->i_blocks = 1; | 332 | result->i_blocks = 1; |
333 | set_nlink(result, 1); | 333 | set_nlink(result, 1); |
334 | result->i_size = strlen(symlink); | 334 | result->i_size = strlen(symlink); |
335 | inode_nohighmem(result); | ||
335 | result->i_op = &page_symlink_inode_operations; | 336 | result->i_op = &page_symlink_inode_operations; |
336 | result->i_data.a_ops = &hpfs_symlink_aops; | 337 | result->i_data.a_ops = &hpfs_symlink_aops; |
337 | 338 | ||
@@ -500,7 +501,7 @@ out: | |||
500 | 501 | ||
501 | static int hpfs_symlink_readpage(struct file *file, struct page *page) | 502 | static int hpfs_symlink_readpage(struct file *file, struct page *page) |
502 | { | 503 | { |
503 | char *link = kmap(page); | 504 | char *link = page_address(page); |
504 | struct inode *i = page->mapping->host; | 505 | struct inode *i = page->mapping->host; |
505 | struct fnode *fnode; | 506 | struct fnode *fnode; |
506 | struct buffer_head *bh; | 507 | struct buffer_head *bh; |
@@ -516,14 +517,12 @@ static int hpfs_symlink_readpage(struct file *file, struct page *page) | |||
516 | goto fail; | 517 | goto fail; |
517 | hpfs_unlock(i->i_sb); | 518 | hpfs_unlock(i->i_sb); |
518 | SetPageUptodate(page); | 519 | SetPageUptodate(page); |
519 | kunmap(page); | ||
520 | unlock_page(page); | 520 | unlock_page(page); |
521 | return 0; | 521 | return 0; |
522 | 522 | ||
523 | fail: | 523 | fail: |
524 | hpfs_unlock(i->i_sb); | 524 | hpfs_unlock(i->i_sb); |
525 | SetPageError(page); | 525 | SetPageError(page); |
526 | kunmap(page); | ||
527 | unlock_page(page); | 526 | unlock_page(page); |
528 | return err; | 527 | return err; |
529 | } | 528 | } |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index de4bdfac0cec..d8f51ee8126b 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -760,6 +760,7 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, | |||
760 | break; | 760 | break; |
761 | case S_IFLNK: | 761 | case S_IFLNK: |
762 | inode->i_op = &page_symlink_inode_operations; | 762 | inode->i_op = &page_symlink_inode_operations; |
763 | inode_nohighmem(inode); | ||
763 | break; | 764 | break; |
764 | } | 765 | } |
765 | lockdep_annotate_inode_mutex_key(inode); | 766 | lockdep_annotate_inode_mutex_key(inode); |
diff --git a/fs/inode.c b/fs/inode.c index 1be5f9003eb3..5bb85a064ce7 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -2028,3 +2028,9 @@ void inode_set_flags(struct inode *inode, unsigned int flags, | |||
2028 | new_flags) != old_flags)); | 2028 | new_flags) != old_flags)); |
2029 | } | 2029 | } |
2030 | EXPORT_SYMBOL(inode_set_flags); | 2030 | EXPORT_SYMBOL(inode_set_flags); |
2031 | |||
2032 | void inode_nohighmem(struct inode *inode) | ||
2033 | { | ||
2034 | mapping_set_gfp_mask(inode->i_mapping, GFP_USER); | ||
2035 | } | ||
2036 | EXPORT_SYMBOL(inode_nohighmem); | ||
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index d67a16f2a45d..61abdc4920da 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c | |||
@@ -1417,6 +1417,7 @@ static int isofs_read_inode(struct inode *inode, int relocated) | |||
1417 | inode->i_fop = &isofs_dir_operations; | 1417 | inode->i_fop = &isofs_dir_operations; |
1418 | } else if (S_ISLNK(inode->i_mode)) { | 1418 | } else if (S_ISLNK(inode->i_mode)) { |
1419 | inode->i_op = &page_symlink_inode_operations; | 1419 | inode->i_op = &page_symlink_inode_operations; |
1420 | inode_nohighmem(inode); | ||
1420 | inode->i_data.a_ops = &isofs_symlink_aops; | 1421 | inode->i_data.a_ops = &isofs_symlink_aops; |
1421 | } else | 1422 | } else |
1422 | /* XXX - parse_rock_ridge_inode() had already set i_rdev. */ | 1423 | /* XXX - parse_rock_ridge_inode() had already set i_rdev. */ |
diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c index 735d7522a3a9..5384ceb35b1c 100644 --- a/fs/isofs/rock.c +++ b/fs/isofs/rock.c | |||
@@ -687,7 +687,7 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page) | |||
687 | struct inode *inode = page->mapping->host; | 687 | struct inode *inode = page->mapping->host; |
688 | struct iso_inode_info *ei = ISOFS_I(inode); | 688 | struct iso_inode_info *ei = ISOFS_I(inode); |
689 | struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb); | 689 | struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb); |
690 | char *link = kmap(page); | 690 | char *link = page_address(page); |
691 | unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); | 691 | unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); |
692 | struct buffer_head *bh; | 692 | struct buffer_head *bh; |
693 | char *rpnt = link; | 693 | char *rpnt = link; |
@@ -774,7 +774,6 @@ repeat: | |||
774 | brelse(bh); | 774 | brelse(bh); |
775 | *rpnt = '\0'; | 775 | *rpnt = '\0'; |
776 | SetPageUptodate(page); | 776 | SetPageUptodate(page); |
777 | kunmap(page); | ||
778 | unlock_page(page); | 777 | unlock_page(page); |
779 | return 0; | 778 | return 0; |
780 | 779 | ||
@@ -791,7 +790,6 @@ fail: | |||
791 | brelse(bh); | 790 | brelse(bh); |
792 | error: | 791 | error: |
793 | SetPageError(page); | 792 | SetPageError(page); |
794 | kunmap(page); | ||
795 | unlock_page(page); | 793 | unlock_page(page); |
796 | return -EIO; | 794 | return -EIO; |
797 | } | 795 | } |
diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index 41aa3ca6a6a4..9d9bae63ae2a 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c | |||
@@ -60,6 +60,7 @@ struct inode *jfs_iget(struct super_block *sb, unsigned long ino) | |||
60 | } else if (S_ISLNK(inode->i_mode)) { | 60 | } else if (S_ISLNK(inode->i_mode)) { |
61 | if (inode->i_size >= IDATASIZE) { | 61 | if (inode->i_size >= IDATASIZE) { |
62 | inode->i_op = &page_symlink_inode_operations; | 62 | inode->i_op = &page_symlink_inode_operations; |
63 | inode_nohighmem(inode); | ||
63 | inode->i_mapping->a_ops = &jfs_aops; | 64 | inode->i_mapping->a_ops = &jfs_aops; |
64 | } else { | 65 | } else { |
65 | inode->i_op = &jfs_fast_symlink_inode_operations; | 66 | inode->i_op = &jfs_fast_symlink_inode_operations; |
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index 9d7551f5c32a..701f89370de7 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c | |||
@@ -983,6 +983,7 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry, | |||
983 | jfs_info("jfs_symlink: allocate extent ip:0x%p", ip); | 983 | jfs_info("jfs_symlink: allocate extent ip:0x%p", ip); |
984 | 984 | ||
985 | ip->i_op = &jfs_symlink_inode_operations; | 985 | ip->i_op = &jfs_symlink_inode_operations; |
986 | inode_nohighmem(ip); | ||
986 | ip->i_mapping->a_ops = &jfs_aops; | 987 | ip->i_mapping->a_ops = &jfs_aops; |
987 | 988 | ||
988 | /* | 989 | /* |
diff --git a/fs/logfs/dir.c b/fs/logfs/dir.c index 99944a406a29..542468e9bfb4 100644 --- a/fs/logfs/dir.c +++ b/fs/logfs/dir.c | |||
@@ -529,6 +529,7 @@ static int logfs_symlink(struct inode *dir, struct dentry *dentry, | |||
529 | return PTR_ERR(inode); | 529 | return PTR_ERR(inode); |
530 | 530 | ||
531 | inode->i_op = &page_symlink_inode_operations; | 531 | inode->i_op = &page_symlink_inode_operations; |
532 | inode_nohighmem(inode); | ||
532 | inode->i_mapping->a_ops = &logfs_reg_aops; | 533 | inode->i_mapping->a_ops = &logfs_reg_aops; |
533 | 534 | ||
534 | return __logfs_create(dir, dentry, inode, target, destlen); | 535 | return __logfs_create(dir, dentry, inode, target, destlen); |
diff --git a/fs/logfs/inode.c b/fs/logfs/inode.c index 06baa926a7a0..0fce46d62b9c 100644 --- a/fs/logfs/inode.c +++ b/fs/logfs/inode.c | |||
@@ -65,6 +65,7 @@ static void logfs_inode_setops(struct inode *inode) | |||
65 | break; | 65 | break; |
66 | case S_IFLNK: | 66 | case S_IFLNK: |
67 | inode->i_op = &page_symlink_inode_operations; | 67 | inode->i_op = &page_symlink_inode_operations; |
68 | inode_nohighmem(inode); | ||
68 | inode->i_mapping->a_ops = &logfs_reg_aops; | 69 | inode->i_mapping->a_ops = &logfs_reg_aops; |
69 | break; | 70 | break; |
70 | case S_IFSOCK: /* fall through */ | 71 | case S_IFSOCK: /* fall through */ |
diff --git a/fs/minix/inode.c b/fs/minix/inode.c index 086cd0a61e80..67a23bfd7303 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c | |||
@@ -452,6 +452,7 @@ void minix_set_inode(struct inode *inode, dev_t rdev) | |||
452 | inode->i_mapping->a_ops = &minix_aops; | 452 | inode->i_mapping->a_ops = &minix_aops; |
453 | } else if (S_ISLNK(inode->i_mode)) { | 453 | } else if (S_ISLNK(inode->i_mode)) { |
454 | inode->i_op = &minix_symlink_inode_operations; | 454 | inode->i_op = &minix_symlink_inode_operations; |
455 | inode_nohighmem(inode); | ||
455 | inode->i_mapping->a_ops = &minix_aops; | 456 | inode->i_mapping->a_ops = &minix_aops; |
456 | } else | 457 | } else |
457 | init_special_inode(inode, inode->i_mode, rdev); | 458 | init_special_inode(inode, inode->i_mode, rdev); |
diff --git a/fs/namei.c b/fs/namei.c index 4bae5cbfaa85..2808958e6c67 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -4527,7 +4527,8 @@ static const char *page_getlink(struct dentry * dentry, void **cookie) | |||
4527 | if (IS_ERR(page)) | 4527 | if (IS_ERR(page)) |
4528 | return (char*)page; | 4528 | return (char*)page; |
4529 | *cookie = page; | 4529 | *cookie = page; |
4530 | kaddr = kmap(page); | 4530 | BUG_ON(mapping_gfp_mask(mapping) & __GFP_HIGHMEM); |
4531 | kaddr = page_address(page); | ||
4531 | nd_terminate_link(kaddr, dentry->d_inode->i_size, PAGE_SIZE - 1); | 4532 | nd_terminate_link(kaddr, dentry->d_inode->i_size, PAGE_SIZE - 1); |
4532 | return kaddr; | 4533 | return kaddr; |
4533 | } | 4534 | } |
@@ -4541,7 +4542,6 @@ EXPORT_SYMBOL(page_follow_link_light); | |||
4541 | void page_put_link(struct inode *unused, void *cookie) | 4542 | void page_put_link(struct inode *unused, void *cookie) |
4542 | { | 4543 | { |
4543 | struct page *page = cookie; | 4544 | struct page *page = cookie; |
4544 | kunmap(page); | ||
4545 | page_cache_release(page); | 4545 | page_cache_release(page); |
4546 | } | 4546 | } |
4547 | EXPORT_SYMBOL(page_put_link); | 4547 | EXPORT_SYMBOL(page_put_link); |
@@ -4565,7 +4565,6 @@ int __page_symlink(struct inode *inode, const char *symname, int len, int nofs) | |||
4565 | struct page *page; | 4565 | struct page *page; |
4566 | void *fsdata; | 4566 | void *fsdata; |
4567 | int err; | 4567 | int err; |
4568 | char *kaddr; | ||
4569 | unsigned int flags = AOP_FLAG_UNINTERRUPTIBLE; | 4568 | unsigned int flags = AOP_FLAG_UNINTERRUPTIBLE; |
4570 | if (nofs) | 4569 | if (nofs) |
4571 | flags |= AOP_FLAG_NOFS; | 4570 | flags |= AOP_FLAG_NOFS; |
@@ -4576,9 +4575,7 @@ retry: | |||
4576 | if (err) | 4575 | if (err) |
4577 | goto fail; | 4576 | goto fail; |
4578 | 4577 | ||
4579 | kaddr = kmap_atomic(page); | 4578 | memcpy(page_address(page), symname, len-1); |
4580 | memcpy(kaddr, symname, len-1); | ||
4581 | kunmap_atomic(kaddr); | ||
4582 | 4579 | ||
4583 | err = pagecache_write_end(NULL, mapping, 0, len-1, len-1, | 4580 | err = pagecache_write_end(NULL, mapping, 0, len-1, len-1, |
4584 | page, fsdata); | 4581 | page, fsdata); |
diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index 9605a2f63549..bb856f7e05fd 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c | |||
@@ -283,6 +283,7 @@ ncp_iget(struct super_block *sb, struct ncp_entry_info *info) | |||
283 | #if defined(CONFIG_NCPFS_EXTRAS) || defined(CONFIG_NCPFS_NFS_NS) | 283 | #if defined(CONFIG_NCPFS_EXTRAS) || defined(CONFIG_NCPFS_NFS_NS) |
284 | } else if (S_ISLNK(inode->i_mode)) { | 284 | } else if (S_ISLNK(inode->i_mode)) { |
285 | inode->i_op = &ncp_symlink_inode_operations; | 285 | inode->i_op = &ncp_symlink_inode_operations; |
286 | inode_nohighmem(inode); | ||
286 | inode->i_data.a_ops = &ncp_symlink_aops; | 287 | inode->i_data.a_ops = &ncp_symlink_aops; |
287 | #endif | 288 | #endif |
288 | } else { | 289 | } else { |
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 31b0a52223a7..ae9aa0b8155c 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
@@ -408,9 +408,10 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st | |||
408 | inode->i_fop = NULL; | 408 | inode->i_fop = NULL; |
409 | inode->i_flags |= S_AUTOMOUNT; | 409 | inode->i_flags |= S_AUTOMOUNT; |
410 | } | 410 | } |
411 | } else if (S_ISLNK(inode->i_mode)) | 411 | } else if (S_ISLNK(inode->i_mode)) { |
412 | inode->i_op = &nfs_symlink_inode_operations; | 412 | inode->i_op = &nfs_symlink_inode_operations; |
413 | else | 413 | inode_nohighmem(inode); |
414 | } else | ||
414 | init_special_inode(inode, inode->i_mode, fattr->rdev); | 415 | init_special_inode(inode, inode->i_mode, fattr->rdev); |
415 | 416 | ||
416 | memset(&inode->i_atime, 0, sizeof(inode->i_atime)); | 417 | memset(&inode->i_atime, 0, sizeof(inode->i_atime)); |
diff --git a/fs/nfs/symlink.c b/fs/nfs/symlink.c index b6de433da5db..abd93bf015d6 100644 --- a/fs/nfs/symlink.c +++ b/fs/nfs/symlink.c | |||
@@ -56,7 +56,7 @@ static const char *nfs_follow_link(struct dentry *dentry, void **cookie) | |||
56 | if (IS_ERR(page)) | 56 | if (IS_ERR(page)) |
57 | return ERR_CAST(page); | 57 | return ERR_CAST(page); |
58 | *cookie = page; | 58 | *cookie = page; |
59 | return kmap(page); | 59 | return page_address(page); |
60 | } | 60 | } |
61 | 61 | ||
62 | /* | 62 | /* |
diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c index ac2f64943ff4..10b22527a617 100644 --- a/fs/nilfs2/inode.c +++ b/fs/nilfs2/inode.c | |||
@@ -510,6 +510,7 @@ static int __nilfs_read_inode(struct super_block *sb, | |||
510 | inode->i_mapping->a_ops = &nilfs_aops; | 510 | inode->i_mapping->a_ops = &nilfs_aops; |
511 | } else if (S_ISLNK(inode->i_mode)) { | 511 | } else if (S_ISLNK(inode->i_mode)) { |
512 | inode->i_op = &nilfs_symlink_inode_operations; | 512 | inode->i_op = &nilfs_symlink_inode_operations; |
513 | inode_nohighmem(inode); | ||
513 | inode->i_mapping->a_ops = &nilfs_aops; | 514 | inode->i_mapping->a_ops = &nilfs_aops; |
514 | } else { | 515 | } else { |
515 | inode->i_op = &nilfs_special_inode_operations; | 516 | inode->i_op = &nilfs_special_inode_operations; |
diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c index c9a1a491aa91..90b3ba960b9b 100644 --- a/fs/nilfs2/namei.c +++ b/fs/nilfs2/namei.c | |||
@@ -161,6 +161,7 @@ static int nilfs_symlink(struct inode *dir, struct dentry *dentry, | |||
161 | 161 | ||
162 | /* slow symlink */ | 162 | /* slow symlink */ |
163 | inode->i_op = &nilfs_symlink_inode_operations; | 163 | inode->i_op = &nilfs_symlink_inode_operations; |
164 | inode_nohighmem(inode); | ||
164 | inode->i_mapping->a_ops = &nilfs_aops; | 165 | inode->i_mapping->a_ops = &nilfs_aops; |
165 | err = page_symlink(inode, symname, l); | 166 | err = page_symlink(inode, symname, l); |
166 | if (err) | 167 | if (err) |
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 8f87e05ee25d..97a563bab9a8 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c | |||
@@ -361,6 +361,7 @@ void ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, | |||
361 | break; | 361 | break; |
362 | case S_IFLNK: | 362 | case S_IFLNK: |
363 | inode->i_op = &ocfs2_symlink_inode_operations; | 363 | inode->i_op = &ocfs2_symlink_inode_operations; |
364 | inode_nohighmem(inode); | ||
364 | i_size_write(inode, le64_to_cpu(fe->i_size)); | 365 | i_size_write(inode, le64_to_cpu(fe->i_size)); |
365 | break; | 366 | break; |
366 | default: | 367 | default: |
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index a03f6f433075..2efe8afc82c5 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
@@ -1960,6 +1960,7 @@ static int ocfs2_symlink(struct inode *dir, | |||
1960 | inode->i_rdev = 0; | 1960 | inode->i_rdev = 0; |
1961 | newsize = l - 1; | 1961 | newsize = l - 1; |
1962 | inode->i_op = &ocfs2_symlink_inode_operations; | 1962 | inode->i_op = &ocfs2_symlink_inode_operations; |
1963 | inode_nohighmem(inode); | ||
1963 | if (l > ocfs2_fast_symlink_chars(sb)) { | 1964 | if (l > ocfs2_fast_symlink_chars(sb)) { |
1964 | u32 offset = 0; | 1965 | u32 offset = 0; |
1965 | 1966 | ||
diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c index c4bcb778886e..f37b3deb01b4 100644 --- a/fs/qnx4/inode.c +++ b/fs/qnx4/inode.c | |||
@@ -316,6 +316,7 @@ struct inode *qnx4_iget(struct super_block *sb, unsigned long ino) | |||
316 | inode->i_fop = &qnx4_dir_operations; | 316 | inode->i_fop = &qnx4_dir_operations; |
317 | } else if (S_ISLNK(inode->i_mode)) { | 317 | } else if (S_ISLNK(inode->i_mode)) { |
318 | inode->i_op = &page_symlink_inode_operations; | 318 | inode->i_op = &page_symlink_inode_operations; |
319 | inode_nohighmem(inode); | ||
319 | inode->i_mapping->a_ops = &qnx4_aops; | 320 | inode->i_mapping->a_ops = &qnx4_aops; |
320 | qnx4_i(inode)->mmu_private = inode->i_size; | 321 | qnx4_i(inode)->mmu_private = inode->i_size; |
321 | } else { | 322 | } else { |
diff --git a/fs/qnx6/inode.c b/fs/qnx6/inode.c index 32d2e1a9774c..9728b5499e1d 100644 --- a/fs/qnx6/inode.c +++ b/fs/qnx6/inode.c | |||
@@ -582,6 +582,7 @@ struct inode *qnx6_iget(struct super_block *sb, unsigned ino) | |||
582 | inode->i_mapping->a_ops = &qnx6_aops; | 582 | inode->i_mapping->a_ops = &qnx6_aops; |
583 | } else if (S_ISLNK(inode->i_mode)) { | 583 | } else if (S_ISLNK(inode->i_mode)) { |
584 | inode->i_op = &page_symlink_inode_operations; | 584 | inode->i_op = &page_symlink_inode_operations; |
585 | inode_nohighmem(inode); | ||
585 | inode->i_mapping->a_ops = &qnx6_aops; | 586 | inode->i_mapping->a_ops = &qnx6_aops; |
586 | } else | 587 | } else |
587 | init_special_inode(inode, inode->i_mode, 0); | 588 | init_special_inode(inode, inode->i_mode, 0); |
diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c index 889d558b4e05..38981b037524 100644 --- a/fs/ramfs/inode.c +++ b/fs/ramfs/inode.c | |||
@@ -79,6 +79,7 @@ struct inode *ramfs_get_inode(struct super_block *sb, | |||
79 | break; | 79 | break; |
80 | case S_IFLNK: | 80 | case S_IFLNK: |
81 | inode->i_op = &page_symlink_inode_operations; | 81 | inode->i_op = &page_symlink_inode_operations; |
82 | inode_nohighmem(inode); | ||
82 | break; | 83 | break; |
83 | } | 84 | } |
84 | } | 85 | } |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 3d8e7e671d5b..ae9e5b308cf9 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
@@ -1361,6 +1361,7 @@ static void init_inode(struct inode *inode, struct treepath *path) | |||
1361 | inode->i_fop = &reiserfs_dir_operations; | 1361 | inode->i_fop = &reiserfs_dir_operations; |
1362 | } else if (S_ISLNK(inode->i_mode)) { | 1362 | } else if (S_ISLNK(inode->i_mode)) { |
1363 | inode->i_op = &reiserfs_symlink_inode_operations; | 1363 | inode->i_op = &reiserfs_symlink_inode_operations; |
1364 | inode_nohighmem(inode); | ||
1364 | inode->i_mapping->a_ops = &reiserfs_address_space_operations; | 1365 | inode->i_mapping->a_ops = &reiserfs_address_space_operations; |
1365 | } else { | 1366 | } else { |
1366 | inode->i_blocks = 0; | 1367 | inode->i_blocks = 0; |
diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c index 47f96988fdd4..4fc2326fac03 100644 --- a/fs/reiserfs/namei.c +++ b/fs/reiserfs/namei.c | |||
@@ -1170,6 +1170,7 @@ static int reiserfs_symlink(struct inode *parent_dir, | |||
1170 | reiserfs_update_inode_transaction(parent_dir); | 1170 | reiserfs_update_inode_transaction(parent_dir); |
1171 | 1171 | ||
1172 | inode->i_op = &reiserfs_symlink_inode_operations; | 1172 | inode->i_op = &reiserfs_symlink_inode_operations; |
1173 | inode_nohighmem(inode); | ||
1173 | inode->i_mapping->a_ops = &reiserfs_address_space_operations; | 1174 | inode->i_mapping->a_ops = &reiserfs_address_space_operations; |
1174 | 1175 | ||
1175 | retval = reiserfs_add_entry(&th, parent_dir, dentry->d_name.name, | 1176 | retval = reiserfs_add_entry(&th, parent_dir, dentry->d_name.name, |
diff --git a/fs/romfs/super.c b/fs/romfs/super.c index 268733cda397..bb894e78a821 100644 --- a/fs/romfs/super.c +++ b/fs/romfs/super.c | |||
@@ -360,6 +360,7 @@ static struct inode *romfs_iget(struct super_block *sb, unsigned long pos) | |||
360 | break; | 360 | break; |
361 | case ROMFH_SYM: | 361 | case ROMFH_SYM: |
362 | i->i_op = &page_symlink_inode_operations; | 362 | i->i_op = &page_symlink_inode_operations; |
363 | inode_nohighmem(i); | ||
363 | i->i_data.a_ops = &romfs_aops; | 364 | i->i_data.a_ops = &romfs_aops; |
364 | mode |= S_IRWXUGO; | 365 | mode |= S_IRWXUGO; |
365 | break; | 366 | break; |
diff --git a/fs/squashfs/inode.c b/fs/squashfs/inode.c index a1ce5ce60632..0927b1e80ab6 100644 --- a/fs/squashfs/inode.c +++ b/fs/squashfs/inode.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/fs.h> | 41 | #include <linux/fs.h> |
42 | #include <linux/vfs.h> | 42 | #include <linux/vfs.h> |
43 | #include <linux/xattr.h> | 43 | #include <linux/xattr.h> |
44 | #include <linux/pagemap.h> | ||
44 | 45 | ||
45 | #include "squashfs_fs.h" | 46 | #include "squashfs_fs.h" |
46 | #include "squashfs_fs_sb.h" | 47 | #include "squashfs_fs_sb.h" |
@@ -291,6 +292,7 @@ int squashfs_read_inode(struct inode *inode, long long ino) | |||
291 | set_nlink(inode, le32_to_cpu(sqsh_ino->nlink)); | 292 | set_nlink(inode, le32_to_cpu(sqsh_ino->nlink)); |
292 | inode->i_size = le32_to_cpu(sqsh_ino->symlink_size); | 293 | inode->i_size = le32_to_cpu(sqsh_ino->symlink_size); |
293 | inode->i_op = &squashfs_symlink_inode_ops; | 294 | inode->i_op = &squashfs_symlink_inode_ops; |
295 | inode_nohighmem(inode); | ||
294 | inode->i_data.a_ops = &squashfs_symlink_aops; | 296 | inode->i_data.a_ops = &squashfs_symlink_aops; |
295 | inode->i_mode |= S_IFLNK; | 297 | inode->i_mode |= S_IFLNK; |
296 | squashfs_i(inode)->start = block; | 298 | squashfs_i(inode)->start = block; |
diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c index 02fa1dcc5969..ef8bcdb80aca 100644 --- a/fs/sysv/inode.c +++ b/fs/sysv/inode.c | |||
@@ -163,6 +163,7 @@ void sysv_set_inode(struct inode *inode, dev_t rdev) | |||
163 | inode->i_mapping->a_ops = &sysv_aops; | 163 | inode->i_mapping->a_ops = &sysv_aops; |
164 | } else if (S_ISLNK(inode->i_mode)) { | 164 | } else if (S_ISLNK(inode->i_mode)) { |
165 | inode->i_op = &sysv_symlink_inode_operations; | 165 | inode->i_op = &sysv_symlink_inode_operations; |
166 | inode_nohighmem(inode); | ||
166 | inode->i_mapping->a_ops = &sysv_aops; | 167 | inode->i_mapping->a_ops = &sysv_aops; |
167 | } else | 168 | } else |
168 | init_special_inode(inode, inode->i_mode, rdev); | 169 | init_special_inode(inode, inode->i_mode, rdev); |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 8675c2b53a71..055746350d16 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
@@ -1541,6 +1541,7 @@ reread: | |||
1541 | case ICBTAG_FILE_TYPE_SYMLINK: | 1541 | case ICBTAG_FILE_TYPE_SYMLINK: |
1542 | inode->i_data.a_ops = &udf_symlink_aops; | 1542 | inode->i_data.a_ops = &udf_symlink_aops; |
1543 | inode->i_op = &page_symlink_inode_operations; | 1543 | inode->i_op = &page_symlink_inode_operations; |
1544 | inode_nohighmem(inode); | ||
1544 | inode->i_mode = S_IFLNK | S_IRWXUGO; | 1545 | inode->i_mode = S_IFLNK | S_IRWXUGO; |
1545 | break; | 1546 | break; |
1546 | case ICBTAG_FILE_TYPE_MAIN: | 1547 | case ICBTAG_FILE_TYPE_MAIN: |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index d0e6de1d148c..42eafb91f7ff 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
@@ -922,6 +922,7 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
922 | 922 | ||
923 | inode->i_data.a_ops = &udf_symlink_aops; | 923 | inode->i_data.a_ops = &udf_symlink_aops; |
924 | inode->i_op = &page_symlink_inode_operations; | 924 | inode->i_op = &page_symlink_inode_operations; |
925 | inode_nohighmem(inode); | ||
925 | 926 | ||
926 | if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { | 927 | if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { |
927 | struct kernel_lb_addr eloc; | 928 | struct kernel_lb_addr eloc; |
diff --git a/fs/udf/symlink.c b/fs/udf/symlink.c index 862535b3ba58..8d619773056b 100644 --- a/fs/udf/symlink.c +++ b/fs/udf/symlink.c | |||
@@ -107,7 +107,7 @@ static int udf_symlink_filler(struct file *file, struct page *page) | |||
107 | struct buffer_head *bh = NULL; | 107 | struct buffer_head *bh = NULL; |
108 | unsigned char *symlink; | 108 | unsigned char *symlink; |
109 | int err; | 109 | int err; |
110 | unsigned char *p = kmap(page); | 110 | unsigned char *p = page_address(page); |
111 | struct udf_inode_info *iinfo; | 111 | struct udf_inode_info *iinfo; |
112 | uint32_t pos; | 112 | uint32_t pos; |
113 | 113 | ||
@@ -141,7 +141,6 @@ static int udf_symlink_filler(struct file *file, struct page *page) | |||
141 | 141 | ||
142 | up_read(&iinfo->i_data_sem); | 142 | up_read(&iinfo->i_data_sem); |
143 | SetPageUptodate(page); | 143 | SetPageUptodate(page); |
144 | kunmap(page); | ||
145 | unlock_page(page); | 144 | unlock_page(page); |
146 | return 0; | 145 | return 0; |
147 | 146 | ||
@@ -149,7 +148,6 @@ out_unlock_inode: | |||
149 | up_read(&iinfo->i_data_sem); | 148 | up_read(&iinfo->i_data_sem); |
150 | SetPageError(page); | 149 | SetPageError(page); |
151 | out_unmap: | 150 | out_unmap: |
152 | kunmap(page); | ||
153 | unlock_page(page); | 151 | unlock_page(page); |
154 | return err; | 152 | return err; |
155 | } | 153 | } |
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 737160a7b819..d897e169ab9c 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
@@ -533,6 +533,7 @@ static void ufs_set_inode_ops(struct inode *inode) | |||
533 | } else { | 533 | } else { |
534 | inode->i_mapping->a_ops = &ufs_aops; | 534 | inode->i_mapping->a_ops = &ufs_aops; |
535 | inode->i_op = &page_symlink_inode_operations; | 535 | inode->i_op = &page_symlink_inode_operations; |
536 | inode_nohighmem(inode); | ||
536 | } | 537 | } |
537 | } else | 538 | } else |
538 | init_special_inode(inode, inode->i_mode, | 539 | init_special_inode(inode, inode->i_mode, |
diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c index 24b0cbd2d917..acf4a3b61b81 100644 --- a/fs/ufs/namei.c +++ b/fs/ufs/namei.c | |||
@@ -124,6 +124,7 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry, | |||
124 | if (l > UFS_SB(sb)->s_uspi->s_maxsymlinklen) { | 124 | if (l > UFS_SB(sb)->s_uspi->s_maxsymlinklen) { |
125 | /* slow symlink */ | 125 | /* slow symlink */ |
126 | inode->i_op = &page_symlink_inode_operations; | 126 | inode->i_op = &page_symlink_inode_operations; |
127 | inode_nohighmem(inode); | ||
127 | inode->i_mapping->a_ops = &ufs_aops; | 128 | inode->i_mapping->a_ops = &ufs_aops; |
128 | err = page_symlink(inode, symname, l); | 129 | err = page_symlink(inode, symname, l); |
129 | if (err) | 130 | if (err) |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 3aa514254161..dfeda44b9ba4 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -3025,5 +3025,6 @@ static inline bool dir_relax(struct inode *inode) | |||
3025 | } | 3025 | } |
3026 | 3026 | ||
3027 | extern bool path_noexec(const struct path *path); | 3027 | extern bool path_noexec(const struct path *path); |
3028 | extern void inode_nohighmem(struct inode *inode); | ||
3028 | 3029 | ||
3029 | #endif /* _LINUX_FS_H */ | 3030 | #endif /* _LINUX_FS_H */ |
diff --git a/mm/shmem.c b/mm/shmem.c index 9187eee4128b..64bf5acb49fe 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -2444,7 +2444,6 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s | |||
2444 | int len; | 2444 | int len; |
2445 | struct inode *inode; | 2445 | struct inode *inode; |
2446 | struct page *page; | 2446 | struct page *page; |
2447 | char *kaddr; | ||
2448 | struct shmem_inode_info *info; | 2447 | struct shmem_inode_info *info; |
2449 | 2448 | ||
2450 | len = strlen(symname) + 1; | 2449 | len = strlen(symname) + 1; |
@@ -2483,9 +2482,8 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s | |||
2483 | } | 2482 | } |
2484 | inode->i_mapping->a_ops = &shmem_aops; | 2483 | inode->i_mapping->a_ops = &shmem_aops; |
2485 | inode->i_op = &shmem_symlink_inode_operations; | 2484 | inode->i_op = &shmem_symlink_inode_operations; |
2486 | kaddr = kmap_atomic(page); | 2485 | inode_nohighmem(inode); |
2487 | memcpy(kaddr, symname, len); | 2486 | memcpy(page_address(page), symname, len); |
2488 | kunmap_atomic(kaddr); | ||
2489 | SetPageUptodate(page); | 2487 | SetPageUptodate(page); |
2490 | set_page_dirty(page); | 2488 | set_page_dirty(page); |
2491 | unlock_page(page); | 2489 | unlock_page(page); |
@@ -2506,13 +2504,12 @@ static const char *shmem_follow_link(struct dentry *dentry, void **cookie) | |||
2506 | return ERR_PTR(error); | 2504 | return ERR_PTR(error); |
2507 | unlock_page(page); | 2505 | unlock_page(page); |
2508 | *cookie = page; | 2506 | *cookie = page; |
2509 | return kmap(page); | 2507 | return page_address(page); |
2510 | } | 2508 | } |
2511 | 2509 | ||
2512 | static void shmem_put_link(struct inode *unused, void *cookie) | 2510 | static void shmem_put_link(struct inode *unused, void *cookie) |
2513 | { | 2511 | { |
2514 | struct page *page = cookie; | 2512 | struct page *page = cookie; |
2515 | kunmap(page); | ||
2516 | mark_page_accessed(page); | 2513 | mark_page_accessed(page); |
2517 | page_cache_release(page); | 2514 | page_cache_release(page); |
2518 | } | 2515 | } |