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
  55static int ext4_encrypted_symlink_getattr(struct user_namespace *mnt_userns,
  56                                          const struct path *path,
  57                                          struct kstat *stat, u32 request_mask,
  58                                          unsigned int query_flags)
  59{
  60        ext4_getattr(mnt_userns, path, stat, request_mask, query_flags);
  61
  62        return fscrypt_symlink_getattr(path, stat);
  63}
  64
  65const struct inode_operations ext4_encrypted_symlink_inode_operations = {
  66        .get_link       = ext4_encrypted_get_link,
  67        .setattr        = ext4_setattr,
  68        .getattr        = ext4_encrypted_symlink_getattr,
  69        .listxattr      = ext4_listxattr,
  70};
  71
  72const struct inode_operations ext4_symlink_inode_operations = {
  73        .get_link       = page_get_link,
  74        .setattr        = ext4_setattr,
  75        .getattr        = ext4_getattr,
  76        .listxattr      = ext4_listxattr,
  77};
  78
  79const struct inode_operations ext4_fast_symlink_inode_operations = {
  80        .get_link       = simple_get_link,
  81        .setattr        = ext4_setattr,
  82        .getattr        = ext4_getattr,
  83        .listxattr      = ext4_listxattr,
  84};
  85