linux/fs/ext4/symlink.c
<<
>>
Prefs
   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
  26static 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        if (!dentry)
  36                return ERR_PTR(-ECHILD);
  37
  38        if (ext4_inode_is_fast_symlink(inode)) {
  39                caddr = EXT4_I(inode)->i_data;
  40                max_size = sizeof(EXT4_I(inode)->i_data);
  41        } else {
  42                cpage = read_mapping_page(inode->i_mapping, 0, NULL);
  43                if (IS_ERR(cpage))
  44                        return ERR_CAST(cpage);
  45                caddr = page_address(cpage);
  46                max_size = inode->i_sb->s_blocksize;
  47        }
  48
  49        paddr = fscrypt_get_symlink(inode, caddr, max_size, done);
  50        if (cpage)
  51                put_page(cpage);
  52        return paddr;
  53}
  54
  55const 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
  62const 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
  69const 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};
  75