summaryrefslogtreecommitdiff
path: root/fs/logfs
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-11-17 09:07:57 +0300
committerAl Viro <viro@zeniv.linux.org.uk>2015-12-09 06:41:36 +0300
commit21fc61c73c3903c4c312d0802da01ec2b323d174 (patch)
treea26c29e3fbb766f00b023724e9e5b8b9bba9b879 /fs/logfs
parentaa80deab33a8fb180e718f5e45514db19aade165 (diff)
downloadlinux-21fc61c73c3903c4c312d0802da01ec2b323d174.tar.xz
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/logfs')
-rw-r--r--fs/logfs/dir.c1
-rw-r--r--fs/logfs/inode.c1
2 files changed, 2 insertions, 0 deletions
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,
return PTR_ERR(inode);
inode->i_op = &page_symlink_inode_operations;
+ inode_nohighmem(inode);
inode->i_mapping->a_ops = &logfs_reg_aops;
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)
break;
case S_IFLNK:
inode->i_op = &page_symlink_inode_operations;
+ inode_nohighmem(inode);
inode->i_mapping->a_ops = &logfs_reg_aops;
break;
case S_IFSOCK: /* fall through */