[mandatory]
        any symlink that might use page_follow_link_light/page_put_link() must
        have inode_nohighmem(inode) called before anything might start playing with
-       its pagecache.
+       its pagecache.  No highmem pages should end up in the pagecache of such
+       symlinks.  That includes any preseeding that might be done during symlink
+       creation.  __page_symlink() will honour the mapping gfp flags, so once
+       you've done inode_nohighmem() it's safe to use, but if you allocate and
+       insert the page manually, make sure to use the right gfp flags.
 --
 [mandatory]
        ->follow_link() is replaced with ->get_link(); same API, except that
 
        attr.ia_mode = S_IFLNK | S_IRWXUGO;
        attr.ia_valid = ATTR_MODE;
 
-       page = alloc_page(GFP_HIGHUSER);
+       page = alloc_page(GFP_USER);
        if (!page)
                return -ENOMEM;
 
-       kaddr = kmap_atomic(page);
+       kaddr = page_address(page);
        memcpy(kaddr, symname, pathlen);
        if (pathlen < PAGE_SIZE)
                memset(kaddr + pathlen, 0, PAGE_SIZE - pathlen);
-       kunmap_atomic(kaddr);
 
        trace_nfs_symlink_enter(dir, dentry);
        error = NFS_PROTO(dir)->symlink(dir, dentry, page, pathlen, &attr);
 
                inode->i_op = &shmem_short_symlink_operations;
                inode->i_link = info->symlink;
        } else {
+               inode_nohighmem(inode);
                error = shmem_getpage(inode, 0, &page, SGP_WRITE, NULL);
                if (error) {
                        iput(inode);
                }
                inode->i_mapping->a_ops = &shmem_aops;
                inode->i_op = &shmem_symlink_inode_operations;
-               inode_nohighmem(inode);
                memcpy(page_address(page), symname, len);
                SetPageUptodate(page);
                set_page_dirty(page);