diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-11-17 01:07:57 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-12-08 22:41:36 -0500 |
commit | 21fc61c73c3903c4c312d0802da01ec2b323d174 (patch) | |
tree | a26c29e3fbb766f00b023724e9e5b8b9bba9b879 /fs/ufs | |
parent | aa80deab33a8fb180e718f5e45514db19aade165 (diff) |
don't put symlink bodies in pagecache into highmem
kmap() in page_follow_link_light() needed to go - allowing to hold
an arbitrary number of kmaps for long is a great way to deadlocking
the system.
new helper (inode_nohighmem(inode)) needs to be used for pagecache
symlinks inodes; done for all in-tree cases. page_follow_link_light()
instrumented to yell about anything missed.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/ufs')
-rw-r--r-- | fs/ufs/inode.c | 1 | ||||
-rw-r--r-- | fs/ufs/namei.c | 1 |
2 files changed, 2 insertions, 0 deletions
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) |