Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0 2 : : /* 3 : : * linux/fs/ext4/symlink.c 4 : : * 5 : : * Only fast symlinks left here - the rest is done by generic code. AV, 1999 6 : : * 7 : : * Copyright (C) 1992, 1993, 1994, 1995 8 : : * Remy Card (card@masi.ibp.fr) 9 : : * Laboratoire MASI - Institut Blaise Pascal 10 : : * Universite Pierre et Marie Curie (Paris VI) 11 : : * 12 : : * from 13 : : * 14 : : * linux/fs/minix/symlink.c 15 : : * 16 : : * Copyright (C) 1991, 1992 Linus Torvalds 17 : : * 18 : : * ext4 symlink handling code 19 : : */ 20 : : 21 : : #include <linux/fs.h> 22 : : #include <linux/namei.h> 23 : : #include "ext4.h" 24 : : #include "xattr.h" 25 : : 26 : 0 : static const char *ext4_encrypted_get_link(struct dentry *dentry, 27 : : struct inode *inode, 28 : : struct delayed_call *done) 29 : : { 30 : : struct page *cpage = NULL; 31 : : const void *caddr; 32 : : unsigned int max_size; 33 : : const char *paddr; 34 : : 35 : 0 : if (!dentry) 36 : : return ERR_PTR(-ECHILD); 37 : : 38 : 0 : if (ext4_inode_is_fast_symlink(inode)) { 39 : 0 : caddr = EXT4_I(inode)->i_data; 40 : : max_size = sizeof(EXT4_I(inode)->i_data); 41 : : } else { 42 : 0 : cpage = read_mapping_page(inode->i_mapping, 0, NULL); 43 : 0 : if (IS_ERR(cpage)) 44 : : return ERR_CAST(cpage); 45 : : caddr = page_address(cpage); 46 : 0 : max_size = inode->i_sb->s_blocksize; 47 : : } 48 : : 49 : 0 : paddr = fscrypt_get_symlink(inode, caddr, max_size, done); 50 : 0 : if (cpage) 51 : 0 : put_page(cpage); 52 : 0 : return paddr; 53 : : } 54 : : 55 : : const struct inode_operations ext4_encrypted_symlink_inode_operations = { 56 : : .get_link = ext4_encrypted_get_link, 57 : : .setattr = ext4_setattr, 58 : : .getattr = ext4_getattr, 59 : : .listxattr = ext4_listxattr, 60 : : }; 61 : : 62 : : const struct inode_operations ext4_symlink_inode_operations = { 63 : : .get_link = page_get_link, 64 : : .setattr = ext4_setattr, 65 : : .getattr = ext4_getattr, 66 : : .listxattr = ext4_listxattr, 67 : : }; 68 : : 69 : : const struct inode_operations ext4_fast_symlink_inode_operations = { 70 : : .get_link = simple_get_link, 71 : : .setattr = ext4_setattr, 72 : : .getattr = ext4_getattr, 73 : : .listxattr = ext4_listxattr, 74 : : };