1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 2ac27a0ecSDave Kleikamp /* 3617ba13bSMingming Cao * linux/fs/ext4/symlink.c 4ac27a0ecSDave Kleikamp * 5ac27a0ecSDave Kleikamp * Only fast symlinks left here - the rest is done by generic code. AV, 1999 6ac27a0ecSDave Kleikamp * 7ac27a0ecSDave Kleikamp * Copyright (C) 1992, 1993, 1994, 1995 8ac27a0ecSDave Kleikamp * Remy Card (card@masi.ibp.fr) 9ac27a0ecSDave Kleikamp * Laboratoire MASI - Institut Blaise Pascal 10ac27a0ecSDave Kleikamp * Universite Pierre et Marie Curie (Paris VI) 11ac27a0ecSDave Kleikamp * 12ac27a0ecSDave Kleikamp * from 13ac27a0ecSDave Kleikamp * 14ac27a0ecSDave Kleikamp * linux/fs/minix/symlink.c 15ac27a0ecSDave Kleikamp * 16ac27a0ecSDave Kleikamp * Copyright (C) 1991, 1992 Linus Torvalds 17ac27a0ecSDave Kleikamp * 18617ba13bSMingming Cao * ext4 symlink handling code 19ac27a0ecSDave Kleikamp */ 20ac27a0ecSDave Kleikamp 21ac27a0ecSDave Kleikamp #include <linux/fs.h> 22ac27a0ecSDave Kleikamp #include <linux/namei.h> 233dcf5451SChristoph Hellwig #include "ext4.h" 24ac27a0ecSDave Kleikamp #include "xattr.h" 25ac27a0ecSDave Kleikamp 266b255391SAl Viro static const char *ext4_encrypted_get_link(struct dentry *dentry, 27fceef393SAl Viro struct inode *inode, 28fceef393SAl Viro struct delayed_call *done) 29ac27a0ecSDave Kleikamp { 30f348c252STheodore Ts'o struct page *cpage = NULL; 316a9269c8SEric Biggers const void *caddr; 326a9269c8SEric Biggers unsigned int max_size; 336a9269c8SEric Biggers const char *paddr; 34f348c252STheodore Ts'o 356b255391SAl Viro if (!dentry) 366b255391SAl Viro return ERR_PTR(-ECHILD); 376b255391SAl Viro 38f348c252STheodore Ts'o if (ext4_inode_is_fast_symlink(inode)) { 396a9269c8SEric Biggers caddr = EXT4_I(inode)->i_data; 409ec3a646SLinus Torvalds max_size = sizeof(EXT4_I(inode)->i_data); 41f348c252STheodore Ts'o } else { 42f348c252STheodore Ts'o cpage = read_mapping_page(inode->i_mapping, 0, NULL); 43b7236e21STheodore Ts'o if (IS_ERR(cpage)) 44680baacbSAl Viro return ERR_CAST(cpage); 4521fc61c7SAl Viro caddr = page_address(cpage); 466a9269c8SEric Biggers max_size = inode->i_sb->s_blocksize; 47f348c252STheodore Ts'o } 48f348c252STheodore Ts'o 496a9269c8SEric Biggers paddr = fscrypt_get_symlink(inode, caddr, max_size, done); 5021fc61c7SAl Viro if (cpage) 5109cbfeafSKirill A. Shutemov put_page(cpage); 52fceef393SAl Viro return paddr; 53f348c252STheodore Ts'o } 54f348c252STheodore Ts'o 55*8c4bca10SEric Biggers static int ext4_encrypted_symlink_getattr(struct user_namespace *mnt_userns, 56*8c4bca10SEric Biggers const struct path *path, 57*8c4bca10SEric Biggers struct kstat *stat, u32 request_mask, 58*8c4bca10SEric Biggers unsigned int query_flags) 59*8c4bca10SEric Biggers { 60*8c4bca10SEric Biggers ext4_getattr(mnt_userns, path, stat, request_mask, query_flags); 61*8c4bca10SEric Biggers 62*8c4bca10SEric Biggers return fscrypt_symlink_getattr(path, stat); 63*8c4bca10SEric Biggers } 64*8c4bca10SEric Biggers 65a7a67e8aSAl Viro const struct inode_operations ext4_encrypted_symlink_inode_operations = { 666b255391SAl Viro .get_link = ext4_encrypted_get_link, 67a7a67e8aSAl Viro .setattr = ext4_setattr, 68*8c4bca10SEric Biggers .getattr = ext4_encrypted_symlink_getattr, 69a7a67e8aSAl Viro .listxattr = ext4_listxattr, 70a7a67e8aSAl Viro }; 71f348c252STheodore Ts'o 72754661f1SArjan van de Ven const struct inode_operations ext4_symlink_inode_operations = { 736b255391SAl Viro .get_link = page_get_link, 74256a4535SDmitry Monakhov .setattr = ext4_setattr, 7599652ea5SDavid Howells .getattr = ext4_getattr, 76617ba13bSMingming Cao .listxattr = ext4_listxattr, 77ac27a0ecSDave Kleikamp }; 78ac27a0ecSDave Kleikamp 79754661f1SArjan van de Ven const struct inode_operations ext4_fast_symlink_inode_operations = { 806b255391SAl Viro .get_link = simple_get_link, 81256a4535SDmitry Monakhov .setattr = ext4_setattr, 8299652ea5SDavid Howells .getattr = ext4_getattr, 83617ba13bSMingming Cao .listxattr = ext4_listxattr, 84ac27a0ecSDave Kleikamp }; 85