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 0 : struct page *cpage = NULL; 31 0 : const void *caddr; 32 0 : unsigned int max_size; 33 0 : const char *paddr; 34 : 35 0 : if (!dentry) 36 0 : return ERR_PTR(-ECHILD); 37 : 38 0 : if (ext4_inode_is_fast_symlink(inode)) { 39 0 : caddr = EXT4_I(inode)->i_data; 40 0 : 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 0 : return ERR_CAST(cpage); 45 0 : 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 : 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 : };