// SPDX-License-Identifier: GPL-2.0
/*
 *  linux/fs/ext4/symlink.c
 *
 * Only fast symlinks left here - the rest is done by generic code. AV, 1999
 *
 * Copyright (C) 1992, 1993, 1994, 1995
 * Remy Card (card@masi.ibp.fr)
 * Laboratoire MASI - Institut Blaise Pascal
 * Universite Pierre et Marie Curie (Paris VI)
 *
 *  from
 *
 *  linux/fs/minix/symlink.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 *
 *  ext4 symlink handling code
 */

#include <linux/fs.h>
#include <linux/namei.h>
#include "ext4.h"
#include "xattr.h"

static const char *ext4_encrypted_get_link(struct dentry *dentry,
					   struct inode *inode,
					   struct delayed_call *done)
{
	struct page *cpage = NULL;
	const void *caddr;
	unsigned int max_size;
	const char *paddr;

	if (!dentry)
		return ERR_PTR(-ECHILD);

	if (ext4_inode_is_fast_symlink(inode)) {
		caddr = EXT4_I(inode)->i_data;
		max_size = sizeof(EXT4_I(inode)->i_data);
	} else {
		cpage = read_mapping_page(inode->i_mapping, 0, NULL);
		if (IS_ERR(cpage))
			return ERR_CAST(cpage);
		caddr = page_address(cpage);
		max_size = inode->i_sb->s_blocksize;
	}

	paddr = fscrypt_get_symlink(inode, caddr, max_size, done);
	if (cpage)
		put_page(cpage);
	return paddr;
}

const struct inode_operations ext4_encrypted_symlink_inode_operations = {
	.get_link	= ext4_encrypted_get_link,
	.setattr	= ext4_setattr,
	.getattr	= ext4_getattr,
	.listxattr	= ext4_listxattr,
};

const struct inode_operations ext4_symlink_inode_operations = {
	.get_link	= page_get_link,
	.setattr	= ext4_setattr,
	.getattr	= ext4_getattr,
	.listxattr	= ext4_listxattr,
};

const struct inode_operations ext4_fast_symlink_inode_operations = {
	.get_link	= simple_get_link,
	.setattr	= ext4_setattr,
	.getattr	= ext4_getattr,
	.listxattr	= ext4_listxattr,
};
 href='/cgit/git.armlinux.org.uk/linux-net-next.git/diff/drivers/net/ethernet/mellanox/mlxsw/trap.h'>diff</a></td><td class='form'><form class='right' method='get' action='/cgit/git.armlinux.org.uk/linux-net-next.git/log/drivers/net/ethernet/mellanox/mlxsw/trap.h'>
<select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/cgit/git.armlinux.org.uk/linux-net-next.git/log/'>root</a>/<a href='/cgit/git.armlinux.org.uk/linux-net-next.git/log/drivers'>drivers</a>/<a href='/cgit/git.armlinux.org.uk/linux-net-next.git/log/drivers/net'>net</a>/<a href='/cgit/git.armlinux.org.uk/linux-net-next.git/log/drivers/net/ethernet'>ethernet</a>/<a href='/cgit/git.armlinux.org.uk/linux-net-next.git/log/drivers/net/ethernet/mellanox'>mellanox</a>/<a href='/cgit/git.armlinux.org.uk/linux-net-next.git/log/drivers/net/ethernet/mellanox/mlxsw'>mlxsw</a>/<a href='/cgit/git.armlinux.org.uk/linux-net-next.git/log/drivers/net/ethernet/mellanox/mlxsw/trap.h'>trap.h</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th class='left'>Age</th><th class='left'>Commit message (<a href='/cgit/git.armlinux.org.uk/linux-net-next.git/log/drivers/net/ethernet/mellanox/mlxsw/trap.h?showmsg=1'>Expand</a>)</th><th class='left'>Author</th></tr>
<tr><td><span title='2020-02-24 11:55:07 -0800'>2020-02-24</span></td><td><a href='/cgit/git.armlinux.org.uk/linux-net-next.git/commit/drivers/net/ethernet/mellanox/mlxsw/trap.h?id=3e6cacaf51d79ac38acf2764275d022bd61d0ef6'>mlxsw: acl_flex_actions: Trap all ACL dropped packets to DISCARD_*_ACL traps</a></td><td>Jiri Pirko</td></tr>