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 <[email protected]>
This commit is contained in:
Al Viro 2015-11-17 01:07:57 -05:00
commit 21fc61c73c
57 changed files with 81 additions and 46 deletions

View file

@ -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);

View file

@ -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 */