1a59d1b8e05ea (Thomas Gleixner 2019-05-27 08:55:05 +0200 1) // SPDX-License-Identifier: GPL-2.0-or-later
d17074ac9ec8d (Lee Jones 2021-03-30 17:44:57 +0100 2) /*
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 3) * eCryptfs: Linux filesystem encryption layer
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 4) *
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 5) * Copyright (C) 1997-2004 Erez Zadok
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 6) * Copyright (C) 2001-2004 Stony Brook University
dd2a3b7ad98f8 (Michael Halcrow 2007-02-12 00:53:46 -0800 7) * Copyright (C) 2004-2007 International Business Machines Corp.
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 8) * Author(s): Michael A. Halcrow <mahalcro@us.ibm.com>
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 9) * Michael C. Thompsion <mcthomps@us.ibm.com>
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 10) */
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 11)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 12) #include <linux/file.h>
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 13) #include <linux/vmalloc.h>
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 14) #include <linux/pagemap.h>
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 15) #include <linux/dcache.h>
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 16) #include <linux/namei.h>
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 17) #include <linux/mount.h>
0cc72dc7f0501 (Josef "Jeff" Sipek 2006-12-08 02:36:31 -0800 18) #include <linux/fs_stack.h>
5a0e3ad6af866 (Tejun Heo 2010-03-24 17:04:11 +0900 19) #include <linux/slab.h>
48b512e685713 (Roberto Sassu 2010-10-05 18:53:45 +0200 20) #include <linux/xattr.h>
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 21) #include <linux/fileattr.h>
0a688ad713949 (Harvey Harrison 2008-07-23 21:30:07 -0700 22) #include <asm/unaligned.h>
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 23) #include "ecryptfs_kernel.h"
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 24)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 25) static int lock_parent(struct dentry *dentry,
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 26) struct dentry **lower_dentry,
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 27) struct inode **lower_dir)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 28) {
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 29) struct dentry *lower_dir_dentry;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 30)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 31) lower_dir_dentry = ecryptfs_dentry_to_lower(dentry->d_parent);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 32) *lower_dir = d_inode(lower_dir_dentry);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 33) *lower_dentry = ecryptfs_dentry_to_lower(dentry);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 34)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 35) inode_lock_nested(*lower_dir, I_MUTEX_PARENT);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 36) return (*lower_dentry)->d_parent == lower_dir_dentry ? 0 : -EINVAL;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 37) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 38)
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 39) static int ecryptfs_inode_test(struct inode *inode, void *lower_inode)
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 40) {
c4cf3ba4f3481 (Himangi Saraogi 2014-06-27 01:11:59 +0530 41) return ecryptfs_inode_to_lower(inode) == lower_inode;
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 42) }
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 43)
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 44) static int ecryptfs_inode_set(struct inode *inode, void *opaque)
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 45) {
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 46) struct inode *lower_inode = opaque;
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 47)
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 48) ecryptfs_set_inode_lower(inode, lower_inode);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 49) fsstack_copy_attr_all(inode, lower_inode);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 50) /* i_size will be overwritten for encrypted regular files */
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 51) fsstack_copy_inode_size(inode, lower_inode);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 52) inode->i_ino = lower_inode->i_ino;
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 53) inode->i_mapping->a_ops = &ecryptfs_aops;
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 54)
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 55) if (S_ISLNK(inode->i_mode))
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 56) inode->i_op = &ecryptfs_symlink_iops;
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 57) else if (S_ISDIR(inode->i_mode))
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 58) inode->i_op = &ecryptfs_dir_iops;
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 59) else
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 60) inode->i_op = &ecryptfs_main_iops;
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 61)
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 62) if (S_ISDIR(inode->i_mode))
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 63) inode->i_fop = &ecryptfs_dir_fops;
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 64) else if (special_file(inode->i_mode))
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 65) init_special_inode(inode, inode->i_mode, inode->i_rdev);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 66) else
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 67) inode->i_fop = &ecryptfs_main_fops;
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 68)
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 69) return 0;
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 70) }
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 71)
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 72) static struct inode *__ecryptfs_get_inode(struct inode *lower_inode,
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 73) struct super_block *sb)
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 74) {
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 75) struct inode *inode;
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 76)
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 77) if (lower_inode->i_sb != ecryptfs_superblock_to_lower(sb))
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 78) return ERR_PTR(-EXDEV);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 79) if (!igrab(lower_inode))
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 80) return ERR_PTR(-ESTALE);
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 81) inode = iget5_locked(sb, (unsigned long)lower_inode,
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 82) ecryptfs_inode_test, ecryptfs_inode_set,
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 83) lower_inode);
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 84) if (!inode) {
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 85) iput(lower_inode);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 86) return ERR_PTR(-EACCES);
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 87) }
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 88) if (!(inode->i_state & I_NEW))
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 89) iput(lower_inode);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 90)
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 91) return inode;
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 92) }
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 93)
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 94) struct inode *ecryptfs_get_inode(struct inode *lower_inode,
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 95) struct super_block *sb)
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 96) {
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 97) struct inode *inode = __ecryptfs_get_inode(lower_inode, sb);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 98)
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 99) if (!IS_ERR(inode) && (inode->i_state & I_NEW))
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 100) unlock_new_inode(inode);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 101)
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 102) return inode;
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 103) }
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 104)
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 105) /**
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 106) * ecryptfs_interpose
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 107) * @lower_dentry: Existing dentry in the lower filesystem
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 108) * @dentry: ecryptfs' dentry
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 109) * @sb: ecryptfs's super_block
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 110) *
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 111) * Interposes upper and lower dentries.
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 112) *
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 113) * Returns zero on success; non-zero otherwise
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 114) */
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 115) static int ecryptfs_interpose(struct dentry *lower_dentry,
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 116) struct dentry *dentry, struct super_block *sb)
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 117) {
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 118) struct inode *inode = ecryptfs_get_inode(d_inode(lower_dentry), sb);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 119)
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 120) if (IS_ERR(inode))
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 121) return PTR_ERR(inode);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 122) d_instantiate(dentry, inode);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 123)
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 124) return 0;
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 125) }
c4f790736ca8d (Tyler Hicks 2011-05-23 21:18:20 -0500 126)
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 127) static int ecryptfs_do_unlink(struct inode *dir, struct dentry *dentry,
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 128) struct inode *inode)
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 129) {
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 130) struct dentry *lower_dentry;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 131) struct inode *lower_dir;
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 132) int rc;
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 133)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 134) rc = lock_parent(dentry, &lower_dentry, &lower_dir);
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 135) dget(lower_dentry); // don't even try to make the lower negative
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 136) if (!rc) {
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 137) if (d_unhashed(lower_dentry))
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 138) rc = -EINVAL;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 139) else
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 140) rc = vfs_unlink(&init_user_ns, lower_dir, lower_dentry,
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 141) NULL);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 142) }
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 143) if (rc) {
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 144) printk(KERN_ERR "Error in vfs_unlink; rc = [%d]\n", rc);
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 145) goto out_unlock;
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 146) }
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 147) fsstack_copy_attr_times(dir, lower_dir);
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 148) set_nlink(inode, ecryptfs_inode_to_lower(inode)->i_nlink);
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 149) inode->i_ctime = dir->i_ctime;
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 150) out_unlock:
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 151) dput(lower_dentry);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 152) inode_unlock(lower_dir);
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 153) if (!rc)
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 154) d_drop(dentry);
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 155) return rc;
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 156) }
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 157)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 158) /**
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 159) * ecryptfs_do_create
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 160) * @directory_inode: inode of the new file's dentry's parent in ecryptfs
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 161) * @ecryptfs_dentry: New file's dentry in ecryptfs
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 162) * @mode: The mode of the new file
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 163) *
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 164) * Creates the underlying file and the eCryptfs inode which will link to
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 165) * it. It will also update the eCryptfs directory inode to mimic the
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 166) * stat of the lower directory inode.
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 167) *
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 168) * Returns the new eCryptfs inode on success; an ERR_PTR on error condition
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 169) */
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 170) static struct inode *
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 171) ecryptfs_do_create(struct inode *directory_inode,
175a4eb7ea531 (Al Viro 2011-07-26 03:30:54 -0400 172) struct dentry *ecryptfs_dentry, umode_t mode)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 173) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 174) int rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 175) struct dentry *lower_dentry;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 176) struct inode *lower_dir;
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 177) struct inode *inode;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 178)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 179) rc = lock_parent(ecryptfs_dentry, &lower_dentry, &lower_dir);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 180) if (!rc)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 181) rc = vfs_create(&init_user_ns, lower_dir,
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 182) lower_dentry, mode, true);
4981e081cfe2c (Michael Halcrow 2007-10-16 01:28:09 -0700 183) if (rc) {
caeeeecfdaead (Michael Halcrow 2008-01-08 15:33:02 -0800 184) printk(KERN_ERR "%s: Failure to create dentry in lower fs; "
18d1dbf1d401e (Harvey Harrison 2008-04-29 00:59:48 -0700 185) "rc = [%d]\n", __func__, rc);
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 186) inode = ERR_PTR(rc);
caeeeecfdaead (Michael Halcrow 2008-01-08 15:33:02 -0800 187) goto out_lock;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 188) }
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 189) inode = __ecryptfs_get_inode(d_inode(lower_dentry),
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 190) directory_inode->i_sb);
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 191) if (IS_ERR(inode)) {
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 192) vfs_unlink(&init_user_ns, lower_dir, lower_dentry, NULL);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 193) goto out_lock;
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 194) }
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 195) fsstack_copy_attr_times(directory_inode, lower_dir);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 196) fsstack_copy_inode_size(directory_inode, lower_dir);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 197) out_lock:
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 198) inode_unlock(lower_dir);
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 199) return inode;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 200) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 201)
d17074ac9ec8d (Lee Jones 2021-03-30 17:44:57 +0100 202) /*
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 203) * ecryptfs_initialize_file
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 204) *
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 205) * Cause the file to be changed from a basic empty file to an ecryptfs
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 206) * file with a header and first data page.
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 207) *
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 208) * Returns zero on success
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 209) */
e3ccaa9761200 (Tyler Hicks 2012-06-20 23:50:59 -0700 210) int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry,
e3ccaa9761200 (Tyler Hicks 2012-06-20 23:50:59 -0700 211) struct inode *ecryptfs_inode)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 212) {
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 213) struct ecryptfs_crypt_stat *crypt_stat =
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 214) &ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 215) int rc = 0;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 216)
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 217) if (S_ISDIR(ecryptfs_inode->i_mode)) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 218) ecryptfs_printk(KERN_DEBUG, "This is a directory\n");
e2bd99ec5c0e2 (Michael Halcrow 2007-02-12 00:53:49 -0800 219) crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 220) goto out;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 221) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 222) ecryptfs_printk(KERN_DEBUG, "Initializing crypto context\n");
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 223) rc = ecryptfs_new_file_context(ecryptfs_inode);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 224) if (rc) {
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 225) ecryptfs_printk(KERN_ERR, "Error creating new file "
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 226) "context; rc = [%d]\n", rc);
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 227) goto out;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 228) }
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 229) rc = ecryptfs_get_lower_file(ecryptfs_dentry, ecryptfs_inode);
27992890b02d3 (Roberto Sassu 2010-11-03 11:11:28 +0100 230) if (rc) {
27992890b02d3 (Roberto Sassu 2010-11-03 11:11:28 +0100 231) printk(KERN_ERR "%s: Error attempting to initialize "
332ab16f830f5 (Tyler Hicks 2011-04-14 15:35:11 -0500 232) "the lower file for the dentry with name "
9e78d14a9f641 (David Howells 2013-12-10 15:26:48 +0000 233) "[%pd]; rc = [%d]\n", __func__,
9e78d14a9f641 (David Howells 2013-12-10 15:26:48 +0000 234) ecryptfs_dentry, rc);
27992890b02d3 (Roberto Sassu 2010-11-03 11:11:28 +0100 235) goto out;
391b52f98cf2e (Michael Halcrow 2008-07-23 21:30:08 -0700 236) }
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 237) rc = ecryptfs_write_metadata(ecryptfs_dentry, ecryptfs_inode);
332ab16f830f5 (Tyler Hicks 2011-04-14 15:35:11 -0500 238) if (rc)
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 239) printk(KERN_ERR "Error writing headers; rc = [%d]\n", rc);
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 240) ecryptfs_put_lower_file(ecryptfs_inode);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 241) out:
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 242) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 243) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 244)
d17074ac9ec8d (Lee Jones 2021-03-30 17:44:57 +0100 245) /*
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 246) * ecryptfs_create
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 247) * @mode: The mode of the new file.
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 248) *
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 249) * Creates a new file.
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 250) *
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 251) * Returns zero on success; non-zero on error condition
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 252) */
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 253) static int
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 254) ecryptfs_create(struct user_namespace *mnt_userns,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 255) struct inode *directory_inode, struct dentry *ecryptfs_dentry,
ebfc3b49a7ac2 (Al Viro 2012-06-10 18:05:36 -0400 256) umode_t mode, bool excl)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 257) {
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 258) struct inode *ecryptfs_inode;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 259) int rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 260)
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 261) ecryptfs_inode = ecryptfs_do_create(directory_inode, ecryptfs_dentry,
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 262) mode);
a1c83681d5270 (Viresh Kumar 2015-08-12 15:59:44 +0530 263) if (IS_ERR(ecryptfs_inode)) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 264) ecryptfs_printk(KERN_WARNING, "Failed to create file in"
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 265) "lower filesystem\n");
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 266) rc = PTR_ERR(ecryptfs_inode);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 267) goto out;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 268) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 269) /* At this point, a file exists on "disk"; we need to make sure
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 270) * that this on disk file is prepared to be an ecryptfs file */
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 271) rc = ecryptfs_initialize_file(ecryptfs_dentry, ecryptfs_inode);
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 272) if (rc) {
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 273) ecryptfs_do_unlink(directory_inode, ecryptfs_dentry,
8bc2d3cf61299 (Tyler Hicks 2012-05-22 15:09:50 -0500 274) ecryptfs_inode);
0e81ba231239b (Al Viro 2015-12-05 18:23:48 -0500 275) iget_failed(ecryptfs_inode);
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 276) goto out;
b59db43ad4434 (Tyler Hicks 2011-11-21 17:31:02 -0600 277) }
1e2e547a93a00 (Al Viro 2018-05-04 08:23:01 -0400 278) d_instantiate_new(ecryptfs_dentry, ecryptfs_inode);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 279) out:
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 280) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 281) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 282)
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 283) static int ecryptfs_i_size_read(struct dentry *dentry, struct inode *inode)
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 284) {
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 285) struct ecryptfs_crypt_stat *crypt_stat;
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 286) int rc;
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 287)
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 288) rc = ecryptfs_get_lower_file(dentry, inode);
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 289) if (rc) {
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 290) printk(KERN_ERR "%s: Error attempting to initialize "
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 291) "the lower file for the dentry with name "
9e78d14a9f641 (David Howells 2013-12-10 15:26:48 +0000 292) "[%pd]; rc = [%d]\n", __func__,
9e78d14a9f641 (David Howells 2013-12-10 15:26:48 +0000 293) dentry, rc);
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 294) return rc;
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 295) }
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 296)
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 297) crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 298) /* TODO: lock for crypt_stat comparison */
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 299) if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED))
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 300) ecryptfs_set_default_sizes(crypt_stat);
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 301)
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 302) rc = ecryptfs_read_and_validate_header_region(inode);
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 303) ecryptfs_put_lower_file(inode);
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 304) if (rc) {
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 305) rc = ecryptfs_read_and_validate_xattr_region(dentry, inode);
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 306) if (!rc)
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 307) crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR;
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 308) }
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 309)
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 310) /* Must return 0 to allow non-eCryptfs files to be looked up, too */
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 311) return 0;
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 312) }
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 313)
d17074ac9ec8d (Lee Jones 2021-03-30 17:44:57 +0100 314) /*
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 315) * ecryptfs_lookup_interpose - Dentry interposition for a lookup
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 316) */
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 317) static struct dentry *ecryptfs_lookup_interpose(struct dentry *dentry,
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 318) struct dentry *lower_dentry)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 319) {
762c69685ff7a (Al Viro 2019-11-03 13:55:43 -0500 320) struct path *path = ecryptfs_dentry_to_lower_path(dentry->d_parent);
e72b9dd6a5f17 (Al Viro 2019-11-03 13:45:04 -0500 321) struct inode *inode, *lower_inode;
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 322) struct ecryptfs_dentry_info *dentry_info;
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 323) int rc = 0;
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 324)
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 325) dentry_info = kmem_cache_alloc(ecryptfs_dentry_info_cache, GFP_KERNEL);
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 326) if (!dentry_info) {
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 327) dput(lower_dentry);
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 328) return ERR_PTR(-ENOMEM);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 329) }
0b1d90119a479 (Al Viro 2012-07-20 12:09:19 +0400 330)
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 331) fsstack_copy_attr_atime(d_inode(dentry->d_parent),
762c69685ff7a (Al Viro 2019-11-03 13:55:43 -0500 332) d_inode(path->dentry));
84d08fa888e7c (Al Viro 2013-07-05 18:59:33 +0400 333) BUG_ON(!d_count(lower_dentry));
0b1d90119a479 (Al Viro 2012-07-20 12:09:19 +0400 334)
0b1d90119a479 (Al Viro 2012-07-20 12:09:19 +0400 335) ecryptfs_set_dentry_private(dentry, dentry_info);
762c69685ff7a (Al Viro 2019-11-03 13:55:43 -0500 336) dentry_info->lower_path.mnt = mntget(path->mnt);
92dd123033d50 (Al Viro 2013-09-15 20:50:13 -0400 337) dentry_info->lower_path.dentry = lower_dentry;
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 338)
e72b9dd6a5f17 (Al Viro 2019-11-03 13:45:04 -0500 339) /*
e72b9dd6a5f17 (Al Viro 2019-11-03 13:45:04 -0500 340) * negative dentry can go positive under us here - its parent is not
e72b9dd6a5f17 (Al Viro 2019-11-03 13:45:04 -0500 341) * locked. That's OK and that could happen just as we return from
e72b9dd6a5f17 (Al Viro 2019-11-03 13:45:04 -0500 342) * ecryptfs_lookup() anyway. Just need to be careful and fetch
e72b9dd6a5f17 (Al Viro 2019-11-03 13:45:04 -0500 343) * ->d_inode only once - it's not stable here.
e72b9dd6a5f17 (Al Viro 2019-11-03 13:45:04 -0500 344) */
e72b9dd6a5f17 (Al Viro 2019-11-03 13:45:04 -0500 345) lower_inode = READ_ONCE(lower_dentry->d_inode);
e72b9dd6a5f17 (Al Viro 2019-11-03 13:45:04 -0500 346)
e72b9dd6a5f17 (Al Viro 2019-11-03 13:45:04 -0500 347) if (!lower_inode) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 348) /* We want to add because we couldn't find in lower */
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 349) d_add(dentry, NULL);
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 350) return NULL;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 351) }
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 352) inode = __ecryptfs_get_inode(lower_inode, dentry->d_sb);
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 353) if (IS_ERR(inode)) {
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 354) printk(KERN_ERR "%s: Error interposing; rc = [%ld]\n",
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 355) __func__, PTR_ERR(inode));
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 356) return ERR_CAST(inode);
391b52f98cf2e (Michael Halcrow 2008-07-23 21:30:08 -0700 357) }
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 358) if (S_ISREG(inode->i_mode)) {
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 359) rc = ecryptfs_i_size_read(dentry, inode);
dd2a3b7ad98f8 (Michael Halcrow 2007-02-12 00:53:46 -0800 360) if (rc) {
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 361) make_bad_inode(inode);
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 362) return ERR_PTR(rc);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 363) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 364) }
778aeb42a708d (Tyler Hicks 2011-05-24 04:56:23 -0500 365)
3b06b3ebf4417 (Tyler Hicks 2011-05-24 03:49:02 -0500 366) if (inode->i_state & I_NEW)
3b06b3ebf4417 (Tyler Hicks 2011-05-24 03:49:02 -0500 367) unlock_new_inode(inode);
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 368) return d_splice_alias(inode, dentry);
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 369) }
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 370)
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 371) /**
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 372) * ecryptfs_lookup
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 373) * @ecryptfs_dir_inode: The eCryptfs directory inode
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 374) * @ecryptfs_dentry: The eCryptfs dentry that we are looking up
89076bc31950e (Al Viro 2015-05-12 08:29:38 -0400 375) * @flags: lookup flags
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 376) *
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 377) * Find a file on disk. If the file does not exist, then we'll add it to the
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 378) * dentry cache and continue on to read it from the disk.
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 379) */
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 380) static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode,
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 381) struct dentry *ecryptfs_dentry,
00cd8dd3bf95f (Al Viro 2012-06-10 17:13:09 -0400 382) unsigned int flags)
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 383) {
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 384) char *encrypted_and_encoded_name = NULL;
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 385) struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 386) struct dentry *lower_dir_dentry, *lower_dentry;
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 387) const char *name = ecryptfs_dentry->d_name.name;
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 388) size_t len = ecryptfs_dentry->d_name.len;
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 389) struct dentry *res;
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 390) int rc = 0;
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 391)
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 392) lower_dir_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry->d_parent);
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 393)
2aac0cf88681b (Tyler Hicks 2009-03-20 02:23:57 -0500 394) mount_crypt_stat = &ecryptfs_superblock_to_private(
2aac0cf88681b (Tyler Hicks 2009-03-20 02:23:57 -0500 395) ecryptfs_dentry->d_sb)->mount_crypt_stat;
ab13a9218c988 (Guenter Roeck 2018-01-18 18:40:25 -0800 396) if (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) {
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 397) rc = ecryptfs_encrypt_and_encode_filename(
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 398) &encrypted_and_encoded_name, &len,
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 399) mount_crypt_stat, name, len);
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 400) if (rc) {
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 401) printk(KERN_ERR "%s: Error attempting to encrypt and encode "
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 402) "filename; rc = [%d]\n", __func__, rc);
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 403) return ERR_PTR(rc);
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 404) }
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 405) name = encrypted_and_encoded_name;
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 406) }
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 407)
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 408) lower_dentry = lookup_one_len_unlocked(name, lower_dir_dentry, len);
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 409) if (IS_ERR(lower_dentry)) {
8787c7a3e0e3f (Tyler Hicks 2011-02-17 18:51:24 -0600 410) ecryptfs_printk(KERN_DEBUG, "%s: lookup_one_len() returned "
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 411) "[%ld] on lower_dentry = [%s]\n", __func__,
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 412) PTR_ERR(lower_dentry),
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 413) name);
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 414) res = ERR_CAST(lower_dentry);
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 415) } else {
88ae4ab9802ea (Al Viro 2016-03-28 00:43:29 -0400 416) res = ecryptfs_lookup_interpose(ecryptfs_dentry, lower_dentry);
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 417) }
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 418) kfree(encrypted_and_encoded_name);
b1168a9282771 (Al Viro 2016-03-28 00:30:35 -0400 419) return res;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 420) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 421)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 422) static int ecryptfs_link(struct dentry *old_dentry, struct inode *dir,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 423) struct dentry *new_dentry)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 424) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 425) struct dentry *lower_old_dentry;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 426) struct dentry *lower_new_dentry;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 427) struct inode *lower_dir;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 428) u64 file_size_save;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 429) int rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 430)
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 431) file_size_save = i_size_read(d_inode(old_dentry));
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 432) lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 433) rc = lock_parent(new_dentry, &lower_new_dentry, &lower_dir);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 434) if (!rc)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 435) rc = vfs_link(lower_old_dentry, &init_user_ns, lower_dir,
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 436) lower_new_dentry, NULL);
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 437) if (rc || d_really_is_negative(lower_new_dentry))
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 438) goto out_lock;
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 439) rc = ecryptfs_interpose(lower_new_dentry, new_dentry, dir->i_sb);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 440) if (rc)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 441) goto out_lock;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 442) fsstack_copy_attr_times(dir, lower_dir);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 443) fsstack_copy_inode_size(dir, lower_dir);
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 444) set_nlink(d_inode(old_dentry),
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 445) ecryptfs_inode_to_lower(d_inode(old_dentry))->i_nlink);
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 446) i_size_write(d_inode(new_dentry), file_size_save);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 447) out_lock:
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 448) inode_unlock(lower_dir);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 449) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 450) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 451)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 452) static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 453) {
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 454) return ecryptfs_do_unlink(dir, dentry, d_inode(dentry));
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 455) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 456)
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 457) static int ecryptfs_symlink(struct user_namespace *mnt_userns,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 458) struct inode *dir, struct dentry *dentry,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 459) const char *symname)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 460) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 461) int rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 462) struct dentry *lower_dentry;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 463) struct inode *lower_dir;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 464) char *encoded_symname;
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 465) size_t encoded_symlen;
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 466) struct ecryptfs_mount_crypt_stat *mount_crypt_stat = NULL;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 467)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 468) rc = lock_parent(dentry, &lower_dentry, &lower_dir);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 469) if (rc)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 470) goto out_lock;
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 471) mount_crypt_stat = &ecryptfs_superblock_to_private(
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 472) dir->i_sb)->mount_crypt_stat;
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 473) rc = ecryptfs_encrypt_and_encode_filename(&encoded_symname,
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 474) &encoded_symlen,
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 475) mount_crypt_stat, symname,
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 476) strlen(symname));
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 477) if (rc)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 478) goto out_lock;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 479) rc = vfs_symlink(&init_user_ns, lower_dir, lower_dentry,
db2e747b14991 (Miklos Szeredi 2008-06-24 16:50:16 +0200 480) encoded_symname);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 481) kfree(encoded_symname);
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 482) if (rc || d_really_is_negative(lower_dentry))
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 483) goto out_lock;
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 484) rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 485) if (rc)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 486) goto out_lock;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 487) fsstack_copy_attr_times(dir, lower_dir);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 488) fsstack_copy_inode_size(dir, lower_dir);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 489) out_lock:
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 490) inode_unlock(lower_dir);
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 491) if (d_really_is_negative(dentry))
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 492) d_drop(dentry);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 493) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 494) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 495)
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 496) static int ecryptfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 497) struct dentry *dentry, umode_t mode)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 498) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 499) int rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 500) struct dentry *lower_dentry;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 501) struct inode *lower_dir;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 502)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 503) rc = lock_parent(dentry, &lower_dentry, &lower_dir);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 504) if (!rc)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 505) rc = vfs_mkdir(&init_user_ns, lower_dir,
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 506) lower_dentry, mode);
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 507) if (rc || d_really_is_negative(lower_dentry))
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 508) goto out;
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 509) rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 510) if (rc)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 511) goto out;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 512) fsstack_copy_attr_times(dir, lower_dir);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 513) fsstack_copy_inode_size(dir, lower_dir);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 514) set_nlink(dir, lower_dir->i_nlink);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 515) out:
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 516) inode_unlock(lower_dir);
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 517) if (d_really_is_negative(dentry))
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 518) d_drop(dentry);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 519) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 520) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 521)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 522) static int ecryptfs_rmdir(struct inode *dir, struct dentry *dentry)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 523) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 524) struct dentry *lower_dentry;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 525) struct inode *lower_dir;
45ec4ababe999 (Michael Halcrow 2006-10-30 22:07:20 -0800 526) int rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 527)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 528) rc = lock_parent(dentry, &lower_dentry, &lower_dir);
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 529) dget(lower_dentry); // don't even try to make the lower negative
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 530) if (!rc) {
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 531) if (d_unhashed(lower_dentry))
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 532) rc = -EINVAL;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 533) else
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 534) rc = vfs_rmdir(&init_user_ns, lower_dir, lower_dentry);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 535) }
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 536) if (!rc) {
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 537) clear_nlink(d_inode(dentry));
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 538) fsstack_copy_attr_times(dir, lower_dir);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 539) set_nlink(dir, lower_dir->i_nlink);
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 540) }
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 541) dput(lower_dentry);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 542) inode_unlock(lower_dir);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 543) if (!rc)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 544) d_drop(dentry);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 545) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 546) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 547)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 548) static int
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 549) ecryptfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 550) struct dentry *dentry, umode_t mode, dev_t dev)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 551) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 552) int rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 553) struct dentry *lower_dentry;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 554) struct inode *lower_dir;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 555)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 556) rc = lock_parent(dentry, &lower_dentry, &lower_dir);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 557) if (!rc)
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 558) rc = vfs_mknod(&init_user_ns, lower_dir,
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 559) lower_dentry, mode, dev);
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 560) if (rc || d_really_is_negative(lower_dentry))
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 561) goto out;
5ccf92037c7c6 (Tyler Hicks 2011-05-24 02:16:51 -0500 562) rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 563) if (rc)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 564) goto out;
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 565) fsstack_copy_attr_times(dir, lower_dir);
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 566) fsstack_copy_inode_size(dir, lower_dir);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 567) out:
b2648d512eb2a (Al Viro 2021-01-29 17:35:43 -0500 568) inode_unlock(lower_dir);
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 569) if (d_really_is_negative(dentry))
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 570) d_drop(dentry);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 571) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 572) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 573)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 574) static int
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 575) ecryptfs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 576) struct dentry *old_dentry, struct inode *new_dir,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 577) struct dentry *new_dentry, unsigned int flags)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 578) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 579) int rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 580) struct dentry *lower_old_dentry;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 581) struct dentry *lower_new_dentry;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 582) struct dentry *lower_old_dir_dentry;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 583) struct dentry *lower_new_dir_dentry;
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 584) struct dentry *trap;
8335eafc2859e (Tyler Hicks 2012-09-13 12:00:56 -0700 585) struct inode *target_inode;
9fe61450972d3 (Christian Brauner 2021-01-21 14:19:32 +0100 586) struct renamedata rd = {};
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 587)
1cd66c93ba8cd (Miklos Szeredi 2016-09-27 11:03:58 +0200 588) if (flags)
1cd66c93ba8cd (Miklos Szeredi 2016-09-27 11:03:58 +0200 589) return -EINVAL;
1cd66c93ba8cd (Miklos Szeredi 2016-09-27 11:03:58 +0200 590)
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 591) lower_old_dir_dentry = ecryptfs_dentry_to_lower(old_dentry->d_parent);
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 592) lower_new_dir_dentry = ecryptfs_dentry_to_lower(new_dentry->d_parent);
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 593)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 594) lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 595) lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry);
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 596)
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 597) target_inode = d_inode(new_dentry);
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 598)
0d132f7364694 (Erez Zadok 2009-12-05 21:17:09 -0500 599) trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 600) dget(lower_new_dentry);
74dd7c97ea2ab (Al Viro 2018-10-09 23:32:41 -0400 601) rc = -EINVAL;
74dd7c97ea2ab (Al Viro 2018-10-09 23:32:41 -0400 602) if (lower_old_dentry->d_parent != lower_old_dir_dentry)
74dd7c97ea2ab (Al Viro 2018-10-09 23:32:41 -0400 603) goto out_lock;
74dd7c97ea2ab (Al Viro 2018-10-09 23:32:41 -0400 604) if (lower_new_dentry->d_parent != lower_new_dir_dentry)
74dd7c97ea2ab (Al Viro 2018-10-09 23:32:41 -0400 605) goto out_lock;
74dd7c97ea2ab (Al Viro 2018-10-09 23:32:41 -0400 606) if (d_unhashed(lower_old_dentry) || d_unhashed(lower_new_dentry))
74dd7c97ea2ab (Al Viro 2018-10-09 23:32:41 -0400 607) goto out_lock;
0d132f7364694 (Erez Zadok 2009-12-05 21:17:09 -0500 608) /* source should not be ancestor of target */
74dd7c97ea2ab (Al Viro 2018-10-09 23:32:41 -0400 609) if (trap == lower_old_dentry)
0d132f7364694 (Erez Zadok 2009-12-05 21:17:09 -0500 610) goto out_lock;
0d132f7364694 (Erez Zadok 2009-12-05 21:17:09 -0500 611) /* target should not be ancestor of source */
0d132f7364694 (Erez Zadok 2009-12-05 21:17:09 -0500 612) if (trap == lower_new_dentry) {
0d132f7364694 (Erez Zadok 2009-12-05 21:17:09 -0500 613) rc = -ENOTEMPTY;
0d132f7364694 (Erez Zadok 2009-12-05 21:17:09 -0500 614) goto out_lock;
0d132f7364694 (Erez Zadok 2009-12-05 21:17:09 -0500 615) }
9fe61450972d3 (Christian Brauner 2021-01-21 14:19:32 +0100 616)
6521f89170829 (Christian Brauner 2021-01-21 14:19:33 +0100 617) rd.old_mnt_userns = &init_user_ns;
6521f89170829 (Christian Brauner 2021-01-21 14:19:33 +0100 618) rd.old_dir = d_inode(lower_old_dir_dentry);
6521f89170829 (Christian Brauner 2021-01-21 14:19:33 +0100 619) rd.old_dentry = lower_old_dentry;
6521f89170829 (Christian Brauner 2021-01-21 14:19:33 +0100 620) rd.new_mnt_userns = &init_user_ns;
6521f89170829 (Christian Brauner 2021-01-21 14:19:33 +0100 621) rd.new_dir = d_inode(lower_new_dir_dentry);
6521f89170829 (Christian Brauner 2021-01-21 14:19:33 +0100 622) rd.new_dentry = lower_new_dentry;
9fe61450972d3 (Christian Brauner 2021-01-21 14:19:32 +0100 623) rc = vfs_rename(&rd);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 624) if (rc)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 625) goto out_lock;
8335eafc2859e (Tyler Hicks 2012-09-13 12:00:56 -0700 626) if (target_inode)
8335eafc2859e (Tyler Hicks 2012-09-13 12:00:56 -0700 627) fsstack_copy_attr_all(target_inode,
8335eafc2859e (Tyler Hicks 2012-09-13 12:00:56 -0700 628) ecryptfs_inode_to_lower(target_inode));
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 629) fsstack_copy_attr_all(new_dir, d_inode(lower_new_dir_dentry));
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 630) if (new_dir != old_dir)
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 631) fsstack_copy_attr_all(old_dir, d_inode(lower_old_dir_dentry));
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 632) out_lock:
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 633) dput(lower_new_dentry);
bcf0d9d4b7697 (Al Viro 2019-11-03 12:07:15 -0500 634) unlock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 635) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 636) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 637)
b22e8fedc1958 (Al Viro 2013-11-29 22:51:47 -0500 638) static char *ecryptfs_readlink_lower(struct dentry *dentry, size_t *bufsiz)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 639) {
6c988f575915a (Miklos Szeredi 2016-12-09 16:45:03 +0100 640) DEFINE_DELAYED_CALL(done);
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 641) struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
6c988f575915a (Miklos Szeredi 2016-12-09 16:45:03 +0100 642) const char *link;
b22e8fedc1958 (Al Viro 2013-11-29 22:51:47 -0500 643) char *buf;
addd65ad8d19a (Michael Halcrow 2009-01-06 14:42:00 -0800 644) int rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 645)
6c988f575915a (Miklos Szeredi 2016-12-09 16:45:03 +0100 646) link = vfs_get_link(lower_dentry, &done);
6c988f575915a (Miklos Szeredi 2016-12-09 16:45:03 +0100 647) if (IS_ERR(link))
6c988f575915a (Miklos Szeredi 2016-12-09 16:45:03 +0100 648) return ERR_CAST(link);
6c988f575915a (Miklos Szeredi 2016-12-09 16:45:03 +0100 649)
b22e8fedc1958 (Al Viro 2013-11-29 22:51:47 -0500 650) rc = ecryptfs_decode_and_decrypt_filename(&buf, bufsiz, dentry->d_sb,
6c988f575915a (Miklos Szeredi 2016-12-09 16:45:03 +0100 651) link, strlen(link));
6c988f575915a (Miklos Szeredi 2016-12-09 16:45:03 +0100 652) do_delayed_call(&done);
6c988f575915a (Miklos Szeredi 2016-12-09 16:45:03 +0100 653) if (rc)
6c988f575915a (Miklos Szeredi 2016-12-09 16:45:03 +0100 654) return ERR_PTR(rc);
6c988f575915a (Miklos Szeredi 2016-12-09 16:45:03 +0100 655)
6c988f575915a (Miklos Szeredi 2016-12-09 16:45:03 +0100 656) return buf;
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 657) }
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 658)
6b2553918d8b4 (Al Viro 2015-11-17 10:20:54 -0500 659) static const char *ecryptfs_get_link(struct dentry *dentry,
fceef393a5381 (Al Viro 2015-12-29 15:58:39 -0500 660) struct inode *inode,
fceef393a5381 (Al Viro 2015-12-29 15:58:39 -0500 661) struct delayed_call *done)
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 662) {
b22e8fedc1958 (Al Viro 2013-11-29 22:51:47 -0500 663) size_t len;
6b2553918d8b4 (Al Viro 2015-11-17 10:20:54 -0500 664) char *buf;
6b2553918d8b4 (Al Viro 2015-11-17 10:20:54 -0500 665)
6b2553918d8b4 (Al Viro 2015-11-17 10:20:54 -0500 666) if (!dentry)
6b2553918d8b4 (Al Viro 2015-11-17 10:20:54 -0500 667) return ERR_PTR(-ECHILD);
6b2553918d8b4 (Al Viro 2015-11-17 10:20:54 -0500 668)
6b2553918d8b4 (Al Viro 2015-11-17 10:20:54 -0500 669) buf = ecryptfs_readlink_lower(dentry, &len);
b22e8fedc1958 (Al Viro 2013-11-29 22:51:47 -0500 670) if (IS_ERR(buf))
680baacbca69d (Al Viro 2015-05-02 13:32:22 -0400 671) return buf;
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 672) fsstack_copy_attr_atime(d_inode(dentry),
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 673) d_inode(ecryptfs_dentry_to_lower(dentry)));
408bd629badbd (Al Viro 2012-05-03 09:34:20 -0400 674) buf[len] = '\0';
fceef393a5381 (Al Viro 2015-12-29 15:58:39 -0500 675) set_delayed_call(done, kfree_link, buf);
fceef393a5381 (Al Viro 2015-12-29 15:58:39 -0500 676) return buf;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 677) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 678)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 679) /**
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 680) * upper_size_to_lower_size
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 681) * @crypt_stat: Crypt_stat associated with file
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 682) * @upper_size: Size of the upper file
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 683) *
cc11beffdf80c (Michael Halcrow 2008-02-06 01:38:32 -0800 684) * Calculate the required size of the lower file based on the
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 685) * specified size of the upper file. This calculation is based on the
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 686) * number of headers in the underlying file and the extent size.
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 687) *
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 688) * Returns Calculated size of the lower file.
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 689) */
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 690) static loff_t
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 691) upper_size_to_lower_size(struct ecryptfs_crypt_stat *crypt_stat,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 692) loff_t upper_size)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 693) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 694) loff_t lower_size;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 695)
157f1071354db (Tyler Hicks 2010-02-11 07:10:38 -0600 696) lower_size = ecryptfs_lower_header_size(crypt_stat);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 697) if (upper_size != 0) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 698) loff_t num_extents;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 699)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 700) num_extents = upper_size >> crypt_stat->extent_shift;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 701) if (upper_size & ~crypt_stat->extent_mask)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 702) num_extents++;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 703) lower_size += (num_extents * crypt_stat->extent_size);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 704) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 705) return lower_size;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 706) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 707)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 708) /**
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 709) * truncate_upper
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 710) * @dentry: The ecryptfs layer dentry
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 711) * @ia: Address of the ecryptfs inode's attributes
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 712) * @lower_ia: Address of the lower inode's attributes
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 713) *
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 714) * Function to handle truncations modifying the size of the file. Note
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 715) * that the file sizes are interpolated. When expanding, we are simply
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 716) * writing strings of 0's out. When truncating, we truncate the upper
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 717) * inode and update the lower_ia according to the page index
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 718) * interpolations. If ATTR_SIZE is set in lower_ia->ia_valid upon return,
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 719) * the caller must use lower_ia in a call to notify_change() to perform
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 720) * the truncation of the lower inode.
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 721) *
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 722) * Returns zero on success; non-zero otherwise
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 723) */
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 724) static int truncate_upper(struct dentry *dentry, struct iattr *ia,
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 725) struct iattr *lower_ia)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 726) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 727) int rc = 0;
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 728) struct inode *inode = d_inode(dentry);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 729) struct ecryptfs_crypt_stat *crypt_stat;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 730) loff_t i_size = i_size_read(inode);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 731) loff_t lower_size_before_truncate;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 732) loff_t lower_size_after_truncate;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 733)
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 734) if (unlikely((ia->ia_size == i_size))) {
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 735) lower_ia->ia_valid &= ~ATTR_SIZE;
332ab16f830f5 (Tyler Hicks 2011-04-14 15:35:11 -0500 736) return 0;
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 737) }
3b06b3ebf4417 (Tyler Hicks 2011-05-24 03:49:02 -0500 738) rc = ecryptfs_get_lower_file(dentry, inode);
332ab16f830f5 (Tyler Hicks 2011-04-14 15:35:11 -0500 739) if (rc)
332ab16f830f5 (Tyler Hicks 2011-04-14 15:35:11 -0500 740) return rc;
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 741) crypt_stat = &ecryptfs_inode_to_private(d_inode(dentry))->crypt_stat;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 742) /* Switch on growing or shrinking file */
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 743) if (ia->ia_size > i_size) {
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 744) char zero[] = { 0x00 };
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 745)
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 746) lower_ia->ia_valid &= ~ATTR_SIZE;
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 747) /* Write a single 0 at the last position of the file;
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 748) * this triggers code that will fill in 0's throughout
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 749) * the intermediate portion of the previous end of the
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 750) * file and the new and of the file */
48c1e44aceca5 (Al Viro 2010-05-21 11:09:58 -0400 751) rc = ecryptfs_write(inode, zero,
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 752) (ia->ia_size - 1), 1);
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 753) } else { /* ia->ia_size < i_size_read(inode) */
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 754) /* We're chopping off all the pages down to the page
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 755) * in which ia->ia_size is located. Fill in the end of
ea1754a084760 (Kirill A. Shutemov 2016-04-01 15:29:48 +0300 756) * that page from (ia->ia_size & ~PAGE_MASK) to
ea1754a084760 (Kirill A. Shutemov 2016-04-01 15:29:48 +0300 757) * PAGE_SIZE with zeros. */
09cbfeaf1a5a6 (Kirill A. Shutemov 2016-04-01 15:29:47 +0300 758) size_t num_zeros = (PAGE_SIZE
09cbfeaf1a5a6 (Kirill A. Shutemov 2016-04-01 15:29:47 +0300 759) - (ia->ia_size & ~PAGE_MASK));
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 760)
13a791b4e63eb (Tyler Hicks 2009-04-13 15:29:27 -0500 761) if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
2c27c65ed0696 (Christoph Hellwig 2010-06-04 11:30:04 +0200 762) truncate_setsize(inode, ia->ia_size);
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 763) lower_ia->ia_size = ia->ia_size;
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 764) lower_ia->ia_valid |= ATTR_SIZE;
48c1e44aceca5 (Al Viro 2010-05-21 11:09:58 -0400 765) goto out;
13a791b4e63eb (Tyler Hicks 2009-04-13 15:29:27 -0500 766) }
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 767) if (num_zeros) {
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 768) char *zeros_virt;
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 769)
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 770) zeros_virt = kzalloc(num_zeros, GFP_KERNEL);
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 771) if (!zeros_virt) {
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 772) rc = -ENOMEM;
48c1e44aceca5 (Al Viro 2010-05-21 11:09:58 -0400 773) goto out;
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 774) }
48c1e44aceca5 (Al Viro 2010-05-21 11:09:58 -0400 775) rc = ecryptfs_write(inode, zeros_virt,
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 776) ia->ia_size, num_zeros);
2ed92554abc5c (Michael Halcrow 2007-10-16 01:28:10 -0700 777) kfree(zeros_virt);
5dda6992a3138 (Michael Halcrow 2007-10-16 01:28:06 -0700 778) if (rc) {
240e2df5c740d (Michael Halcrow 2007-06-27 14:09:44 -0700 779) printk(KERN_ERR "Error attempting to zero out "
240e2df5c740d (Michael Halcrow 2007-06-27 14:09:44 -0700 780) "the remainder of the end page on "
240e2df5c740d (Michael Halcrow 2007-06-27 14:09:44 -0700 781) "reducing truncate; rc = [%d]\n", rc);
48c1e44aceca5 (Al Viro 2010-05-21 11:09:58 -0400 782) goto out;
240e2df5c740d (Michael Halcrow 2007-06-27 14:09:44 -0700 783) }
240e2df5c740d (Michael Halcrow 2007-06-27 14:09:44 -0700 784) }
2c27c65ed0696 (Christoph Hellwig 2010-06-04 11:30:04 +0200 785) truncate_setsize(inode, ia->ia_size);
0216f7f792175 (Michael Halcrow 2007-10-16 01:28:08 -0700 786) rc = ecryptfs_write_inode_size_to_metadata(inode);
dd2a3b7ad98f8 (Michael Halcrow 2007-02-12 00:53:46 -0800 787) if (rc) {
dd2a3b7ad98f8 (Michael Halcrow 2007-02-12 00:53:46 -0800 788) printk(KERN_ERR "Problem with "
dd2a3b7ad98f8 (Michael Halcrow 2007-02-12 00:53:46 -0800 789) "ecryptfs_write_inode_size_to_metadata; "
dd2a3b7ad98f8 (Michael Halcrow 2007-02-12 00:53:46 -0800 790) "rc = [%d]\n", rc);
48c1e44aceca5 (Al Viro 2010-05-21 11:09:58 -0400 791) goto out;
dd2a3b7ad98f8 (Michael Halcrow 2007-02-12 00:53:46 -0800 792) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 793) /* We are reducing the size of the ecryptfs file, and need to
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 794) * know if we need to reduce the size of the lower file. */
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 795) lower_size_before_truncate =
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 796) upper_size_to_lower_size(crypt_stat, i_size);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 797) lower_size_after_truncate =
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 798) upper_size_to_lower_size(crypt_stat, ia->ia_size);
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 799) if (lower_size_after_truncate < lower_size_before_truncate) {
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 800) lower_ia->ia_size = lower_size_after_truncate;
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 801) lower_ia->ia_valid |= ATTR_SIZE;
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 802) } else
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 803) lower_ia->ia_valid &= ~ATTR_SIZE;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 804) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 805) out:
332ab16f830f5 (Tyler Hicks 2011-04-14 15:35:11 -0500 806) ecryptfs_put_lower_file(inode);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 807) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 808) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 809)
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 810) static int ecryptfs_inode_newsize_ok(struct inode *inode, loff_t offset)
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 811) {
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 812) struct ecryptfs_crypt_stat *crypt_stat;
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 813) loff_t lower_oldsize, lower_newsize;
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 814)
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 815) crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 816) lower_oldsize = upper_size_to_lower_size(crypt_stat,
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 817) i_size_read(inode));
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 818) lower_newsize = upper_size_to_lower_size(crypt_stat, offset);
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 819) if (lower_newsize > lower_oldsize) {
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 820) /*
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 821) * The eCryptfs inode and the new *lower* size are mixed here
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 822) * because we may not have the lower i_mutex held and/or it may
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 823) * not be appropriate to call inode_newsize_ok() with inodes
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 824) * from other filesystems.
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 825) */
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 826) return inode_newsize_ok(inode, lower_newsize);
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 827) }
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 828)
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 829) return 0;
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 830) }
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 831)
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 832) /**
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 833) * ecryptfs_truncate
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 834) * @dentry: The ecryptfs layer dentry
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 835) * @new_length: The length to expand the file to
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 836) *
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 837) * Simple function that handles the truncation of an eCryptfs inode and
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 838) * its corresponding lower inode.
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 839) *
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 840) * Returns zero on success; non-zero otherwise
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 841) */
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 842) int ecryptfs_truncate(struct dentry *dentry, loff_t new_length)
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 843) {
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 844) struct iattr ia = { .ia_valid = ATTR_SIZE, .ia_size = new_length };
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 845) struct iattr lower_ia = { .ia_valid = 0 };
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 846) int rc;
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 847)
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 848) rc = ecryptfs_inode_newsize_ok(d_inode(dentry), new_length);
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 849) if (rc)
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 850) return rc;
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 851)
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 852) rc = truncate_upper(dentry, &ia, &lower_ia);
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 853) if (!rc && lower_ia.ia_valid & ATTR_SIZE) {
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 854) struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 855)
5955102c9984f (Al Viro 2016-01-22 15:40:57 -0500 856) inode_lock(d_inode(lower_dentry));
2f221d6f7b881 (Christian Brauner 2021-01-21 14:19:26 +0100 857) rc = notify_change(&init_user_ns, lower_dentry,
2f221d6f7b881 (Christian Brauner 2021-01-21 14:19:26 +0100 858) &lower_ia, NULL);
5955102c9984f (Al Viro 2016-01-22 15:40:57 -0500 859) inode_unlock(d_inode(lower_dentry));
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 860) }
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 861) return rc;
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 862) }
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 863)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 864) static int
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 865) ecryptfs_permission(struct user_namespace *mnt_userns, struct inode *inode,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 866) int mask)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 867) {
47291baa8ddfd (Christian Brauner 2021-01-21 14:19:24 +0100 868) return inode_permission(&init_user_ns,
47291baa8ddfd (Christian Brauner 2021-01-21 14:19:24 +0100 869) ecryptfs_inode_to_lower(inode), mask);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 870) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 871)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 872) /**
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 873) * ecryptfs_setattr
d17074ac9ec8d (Lee Jones 2021-03-30 17:44:57 +0100 874) * @mnt_userns: user namespace of the target mount
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 875) * @dentry: dentry handle to the inode to modify
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 876) * @ia: Structure with flags of what to change and values
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 877) *
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 878) * Updates the metadata of an inode. If the update is to the size
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 879) * i.e. truncation, then ecryptfs_truncate will handle the size modification
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 880) * of both the ecryptfs inode and the lower inode.
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 881) *
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 882) * All other metadata changes will be passed right to the lower filesystem,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 883) * and we will just update our inode to look like the lower.
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 884) */
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 885) static int ecryptfs_setattr(struct user_namespace *mnt_userns,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 886) struct dentry *dentry, struct iattr *ia)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 887) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 888) int rc = 0;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 889) struct dentry *lower_dentry;
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 890) struct iattr lower_ia;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 891) struct inode *inode;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 892) struct inode *lower_inode;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 893) struct ecryptfs_crypt_stat *crypt_stat;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 894)
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 895) crypt_stat = &ecryptfs_inode_to_private(d_inode(dentry))->crypt_stat;
e81f3340bba2b (Herbert Xu 2016-04-16 15:01:09 +0800 896) if (!(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED)) {
e81f3340bba2b (Herbert Xu 2016-04-16 15:01:09 +0800 897) rc = ecryptfs_init_crypt_stat(crypt_stat);
e81f3340bba2b (Herbert Xu 2016-04-16 15:01:09 +0800 898) if (rc)
e81f3340bba2b (Herbert Xu 2016-04-16 15:01:09 +0800 899) return rc;
e81f3340bba2b (Herbert Xu 2016-04-16 15:01:09 +0800 900) }
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 901) inode = d_inode(dentry);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 902) lower_inode = ecryptfs_inode_to_lower(inode);
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 903) lower_dentry = ecryptfs_dentry_to_lower(dentry);
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 904) mutex_lock(&crypt_stat->cs_mutex);
e36cb0b89ce20 (David Howells 2015-01-29 12:02:35 +0000 905) if (d_is_dir(dentry))
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 906) crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
e36cb0b89ce20 (David Howells 2015-01-29 12:02:35 +0000 907) else if (d_is_reg(dentry)
64ee4808a786c (Michael Halcrow 2007-07-19 01:47:54 -0700 908) && (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)
64ee4808a786c (Michael Halcrow 2007-07-19 01:47:54 -0700 909) || !(crypt_stat->flags & ECRYPTFS_KEY_VALID))) {
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 910) struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 911)
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 912) mount_crypt_stat = &ecryptfs_superblock_to_private(
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 913) dentry->d_sb)->mount_crypt_stat;
3b06b3ebf4417 (Tyler Hicks 2011-05-24 03:49:02 -0500 914) rc = ecryptfs_get_lower_file(dentry, inode);
332ab16f830f5 (Tyler Hicks 2011-04-14 15:35:11 -0500 915) if (rc) {
332ab16f830f5 (Tyler Hicks 2011-04-14 15:35:11 -0500 916) mutex_unlock(&crypt_stat->cs_mutex);
332ab16f830f5 (Tyler Hicks 2011-04-14 15:35:11 -0500 917) goto out;
332ab16f830f5 (Tyler Hicks 2011-04-14 15:35:11 -0500 918) }
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 919) rc = ecryptfs_read_metadata(dentry);
332ab16f830f5 (Tyler Hicks 2011-04-14 15:35:11 -0500 920) ecryptfs_put_lower_file(inode);
5dda6992a3138 (Michael Halcrow 2007-10-16 01:28:06 -0700 921) if (rc) {
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 922) if (!(mount_crypt_stat->flags
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 923) & ECRYPTFS_PLAINTEXT_PASSTHROUGH_ENABLED)) {
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 924) rc = -EIO;
25bd817403603 (Michael Halcrow 2008-02-06 01:38:35 -0800 925) printk(KERN_WARNING "Either the lower file "
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 926) "is not in a valid eCryptfs format, "
25bd817403603 (Michael Halcrow 2008-02-06 01:38:35 -0800 927) "or the key could not be retrieved. "
25bd817403603 (Michael Halcrow 2008-02-06 01:38:35 -0800 928) "Plaintext passthrough mode is not "
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 929) "enabled; returning -EIO\n");
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 930) mutex_unlock(&crypt_stat->cs_mutex);
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 931) goto out;
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 932) }
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 933) rc = 0;
3aeb86ea4cd15 (Tyler Hicks 2011-03-15 14:54:00 -0500 934) crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED
3aeb86ea4cd15 (Tyler Hicks 2011-03-15 14:54:00 -0500 935) | ECRYPTFS_ENCRYPTED);
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 936) }
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 937) }
e10f281bca03f (Michael Halcrow 2007-06-27 14:09:44 -0700 938) mutex_unlock(&crypt_stat->cs_mutex);
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 939)
2f221d6f7b881 (Christian Brauner 2021-01-21 14:19:26 +0100 940) rc = setattr_prepare(&init_user_ns, dentry, ia);
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 941) if (rc)
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 942) goto out;
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 943) if (ia->ia_valid & ATTR_SIZE) {
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 944) rc = ecryptfs_inode_newsize_ok(inode, ia->ia_size);
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 945) if (rc)
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 946) goto out;
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 947) }
a261a03904849 (Tyler Hicks 2012-01-19 20:33:44 -0600 948)
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 949) memcpy(&lower_ia, ia, sizeof(lower_ia));
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 950) if (ia->ia_valid & ATTR_FILE)
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 951) lower_ia.ia_file = ecryptfs_file_to_lower(ia->ia_file);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 952) if (ia->ia_valid & ATTR_SIZE) {
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 953) rc = truncate_upper(dentry, ia, &lower_ia);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 954) if (rc < 0)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 955) goto out;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 956) }
1ac564ecabc77 (Jeff Layton 2007-10-18 03:05:17 -0700 957)
1ac564ecabc77 (Jeff Layton 2007-10-18 03:05:17 -0700 958) /*
1ac564ecabc77 (Jeff Layton 2007-10-18 03:05:17 -0700 959) * mode change is for clearing setuid/setgid bits. Allow lower fs
1ac564ecabc77 (Jeff Layton 2007-10-18 03:05:17 -0700 960) * to interpret this in its own way.
1ac564ecabc77 (Jeff Layton 2007-10-18 03:05:17 -0700 961) */
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 962) if (lower_ia.ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID))
5f3ef64f4da1c (Tyler Hicks 2009-10-14 16:18:27 -0500 963) lower_ia.ia_valid &= ~ATTR_MODE;
1ac564ecabc77 (Jeff Layton 2007-10-18 03:05:17 -0700 964)
5955102c9984f (Al Viro 2016-01-22 15:40:57 -0500 965) inode_lock(d_inode(lower_dentry));
2f221d6f7b881 (Christian Brauner 2021-01-21 14:19:26 +0100 966) rc = notify_change(&init_user_ns, lower_dentry, &lower_ia, NULL);
5955102c9984f (Al Viro 2016-01-22 15:40:57 -0500 967) inode_unlock(d_inode(lower_dentry));
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 968) out:
9afa2fb6c1350 (Erez Zadok 2009-12-02 19:51:54 -0500 969) fsstack_copy_attr_all(inode, lower_inode);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 970) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 971) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 972)
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 973) static int ecryptfs_getattr_link(struct user_namespace *mnt_userns,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 974) const struct path *path, struct kstat *stat,
a528d35e8bfcc (David Howells 2017-01-31 16:46:22 +0000 975) u32 request_mask, unsigned int flags)
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 976) {
a528d35e8bfcc (David Howells 2017-01-31 16:46:22 +0000 977) struct dentry *dentry = path->dentry;
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 978) struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 979) int rc = 0;
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 980)
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 981) mount_crypt_stat = &ecryptfs_superblock_to_private(
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 982) dentry->d_sb)->mount_crypt_stat;
0d56a4518d5ea (Christian Brauner 2021-01-21 14:19:30 +0100 983) generic_fillattr(&init_user_ns, d_inode(dentry), stat);
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 984) if (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) {
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 985) char *target;
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 986) size_t targetsiz;
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 987)
b22e8fedc1958 (Al Viro 2013-11-29 22:51:47 -0500 988) target = ecryptfs_readlink_lower(dentry, &targetsiz);
b22e8fedc1958 (Al Viro 2013-11-29 22:51:47 -0500 989) if (!IS_ERR(target)) {
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 990) kfree(target);
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 991) stat->size = targetsiz;
b22e8fedc1958 (Al Viro 2013-11-29 22:51:47 -0500 992) } else {
b22e8fedc1958 (Al Viro 2013-11-29 22:51:47 -0500 993) rc = PTR_ERR(target);
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 994) }
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 995) }
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 996) return rc;
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 997) }
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 998)
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 999) static int ecryptfs_getattr(struct user_namespace *mnt_userns,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 1000) const struct path *path, struct kstat *stat,
a528d35e8bfcc (David Howells 2017-01-31 16:46:22 +0000 1001) u32 request_mask, unsigned int flags)
f8f484d1b6677 (Tyler Hicks 2009-11-04 02:48:01 -0600 1002) {
a528d35e8bfcc (David Howells 2017-01-31 16:46:22 +0000 1003) struct dentry *dentry = path->dentry;
f8f484d1b6677 (Tyler Hicks 2009-11-04 02:48:01 -0600 1004) struct kstat lower_stat;
f8f484d1b6677 (Tyler Hicks 2009-11-04 02:48:01 -0600 1005) int rc;
f8f484d1b6677 (Tyler Hicks 2009-11-04 02:48:01 -0600 1006)
a528d35e8bfcc (David Howells 2017-01-31 16:46:22 +0000 1007) rc = vfs_getattr(ecryptfs_dentry_to_lower_path(dentry), &lower_stat,
a528d35e8bfcc (David Howells 2017-01-31 16:46:22 +0000 1008) request_mask, flags);
f8f484d1b6677 (Tyler Hicks 2009-11-04 02:48:01 -0600 1009) if (!rc) {
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 1010) fsstack_copy_attr_all(d_inode(dentry),
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 1011) ecryptfs_inode_to_lower(d_inode(dentry)));
0d56a4518d5ea (Christian Brauner 2021-01-21 14:19:30 +0100 1012) generic_fillattr(&init_user_ns, d_inode(dentry), stat);
f8f484d1b6677 (Tyler Hicks 2009-11-04 02:48:01 -0600 1013) stat->blocks = lower_stat.blocks;
f8f484d1b6677 (Tyler Hicks 2009-11-04 02:48:01 -0600 1014) }
f8f484d1b6677 (Tyler Hicks 2009-11-04 02:48:01 -0600 1015) return rc;
f8f484d1b6677 (Tyler Hicks 2009-11-04 02:48:01 -0600 1016) }
f8f484d1b6677 (Tyler Hicks 2009-11-04 02:48:01 -0600 1017)
dd2a3b7ad98f8 (Michael Halcrow 2007-02-12 00:53:46 -0800 1018) int
3767e255b390d (Al Viro 2016-05-27 11:06:05 -0400 1019) ecryptfs_setxattr(struct dentry *dentry, struct inode *inode,
3767e255b390d (Al Viro 2016-05-27 11:06:05 -0400 1020) const char *name, const void *value,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1021) size_t size, int flags)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1022) {
5d6c31910bc07 (Andreas Gruenbacher 2016-09-29 17:48:42 +0200 1023) int rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1024) struct dentry *lower_dentry;
0b964446c63f9 (Miklos Szeredi 2021-01-19 17:22:03 +0100 1025) struct inode *lower_inode;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1026)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1027) lower_dentry = ecryptfs_dentry_to_lower(dentry);
0b964446c63f9 (Miklos Szeredi 2021-01-19 17:22:03 +0100 1028) lower_inode = d_inode(lower_dentry);
0b964446c63f9 (Miklos Szeredi 2021-01-19 17:22:03 +0100 1029) if (!(lower_inode->i_opflags & IOP_XATTR)) {
cfce08c6bdfb2 (Christian Pulvermacher 2010-03-23 11:51:38 -0500 1030) rc = -EOPNOTSUPP;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1031) goto out;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1032) }
0b964446c63f9 (Miklos Szeredi 2021-01-19 17:22:03 +0100 1033) inode_lock(lower_inode);
7d6beb71da3cc (Linus Torvalds 2021-02-23 13:39:45 -0800 1034) rc = __vfs_setxattr_locked(&init_user_ns, lower_dentry, name, value, size, flags, NULL);
0b964446c63f9 (Miklos Szeredi 2021-01-19 17:22:03 +0100 1035) inode_unlock(lower_inode);
3767e255b390d (Al Viro 2016-05-27 11:06:05 -0400 1036) if (!rc && inode)
0b964446c63f9 (Miklos Szeredi 2021-01-19 17:22:03 +0100 1037) fsstack_copy_attr_all(inode, lower_inode);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1038) out:
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1039) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1040) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1041)
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 1042) ssize_t
ce23e64013348 (Al Viro 2016-04-11 00:48:00 -0400 1043) ecryptfs_getxattr_lower(struct dentry *lower_dentry, struct inode *lower_inode,
ce23e64013348 (Al Viro 2016-04-11 00:48:00 -0400 1044) const char *name, void *value, size_t size)
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 1045) {
5d6c31910bc07 (Andreas Gruenbacher 2016-09-29 17:48:42 +0200 1046) int rc;
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 1047)
5d6c31910bc07 (Andreas Gruenbacher 2016-09-29 17:48:42 +0200 1048) if (!(lower_inode->i_opflags & IOP_XATTR)) {
cfce08c6bdfb2 (Christian Pulvermacher 2010-03-23 11:51:38 -0500 1049) rc = -EOPNOTSUPP;
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 1050) goto out;
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 1051) }
ce23e64013348 (Al Viro 2016-04-11 00:48:00 -0400 1052) inode_lock(lower_inode);
5d6c31910bc07 (Andreas Gruenbacher 2016-09-29 17:48:42 +0200 1053) rc = __vfs_getxattr(lower_dentry, lower_inode, name, value, size);
ce23e64013348 (Al Viro 2016-04-11 00:48:00 -0400 1054) inode_unlock(lower_inode);
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 1055) out:
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 1056) return rc;
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 1057) }
d7cdc5febf9f2 (Michael Halcrow 2007-10-16 01:28:10 -0700 1058)
7896b631823c6 (Adrian Bunk 2008-02-06 01:38:32 -0800 1059) static ssize_t
ce23e64013348 (Al Viro 2016-04-11 00:48:00 -0400 1060) ecryptfs_getxattr(struct dentry *dentry, struct inode *inode,
ce23e64013348 (Al Viro 2016-04-11 00:48:00 -0400 1061) const char *name, void *value, size_t size)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1062) {
ce23e64013348 (Al Viro 2016-04-11 00:48:00 -0400 1063) return ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry),
ce23e64013348 (Al Viro 2016-04-11 00:48:00 -0400 1064) ecryptfs_inode_to_lower(inode),
ce23e64013348 (Al Viro 2016-04-11 00:48:00 -0400 1065) name, value, size);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1066) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1067)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1068) static ssize_t
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1069) ecryptfs_listxattr(struct dentry *dentry, char *list, size_t size)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1070) {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1071) int rc = 0;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1072) struct dentry *lower_dentry;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1073)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1074) lower_dentry = ecryptfs_dentry_to_lower(dentry);
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 1075) if (!d_inode(lower_dentry)->i_op->listxattr) {
cfce08c6bdfb2 (Christian Pulvermacher 2010-03-23 11:51:38 -0500 1076) rc = -EOPNOTSUPP;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1077) goto out;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1078) }
5955102c9984f (Al Viro 2016-01-22 15:40:57 -0500 1079) inode_lock(d_inode(lower_dentry));
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 1080) rc = d_inode(lower_dentry)->i_op->listxattr(lower_dentry, list, size);
5955102c9984f (Al Viro 2016-01-22 15:40:57 -0500 1081) inode_unlock(d_inode(lower_dentry));
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1082) out:
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1083) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1084) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1085)
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1086) static int ecryptfs_removexattr(struct dentry *dentry, struct inode *inode,
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1087) const char *name)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1088) {
5d6c31910bc07 (Andreas Gruenbacher 2016-09-29 17:48:42 +0200 1089) int rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1090) struct dentry *lower_dentry;
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1091) struct inode *lower_inode;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1092)
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1093) lower_dentry = ecryptfs_dentry_to_lower(dentry);
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1094) lower_inode = ecryptfs_inode_to_lower(inode);
5d6c31910bc07 (Andreas Gruenbacher 2016-09-29 17:48:42 +0200 1095) if (!(lower_inode->i_opflags & IOP_XATTR)) {
cfce08c6bdfb2 (Christian Pulvermacher 2010-03-23 11:51:38 -0500 1096) rc = -EOPNOTSUPP;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1097) goto out;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1098) }
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1099) inode_lock(lower_inode);
c7c7a1a18af4c (Tycho Andersen 2021-01-21 14:19:28 +0100 1100) rc = __vfs_removexattr(&init_user_ns, lower_dentry, name);
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1101) inode_unlock(lower_inode);
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1102) out:
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1103) return rc;
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1104) }
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1105)
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1106) static int ecryptfs_fileattr_get(struct dentry *dentry, struct fileattr *fa)
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1107) {
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1108) return vfs_fileattr_get(ecryptfs_dentry_to_lower(dentry), fa);
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1109) }
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1110)
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1111) static int ecryptfs_fileattr_set(struct user_namespace *mnt_userns,
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1112) struct dentry *dentry, struct fileattr *fa)
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1113) {
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1114) struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1115) int rc;
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1116)
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1117) rc = vfs_fileattr_set(&init_user_ns, lower_dentry, fa);
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1118) fsstack_copy_attr_all(d_inode(dentry), d_inode(lower_dentry));
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1119)
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1120) return rc;
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1121) }
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1122)
754661f143e70 (Arjan van de Ven 2007-02-12 00:55:38 -0800 1123) const struct inode_operations ecryptfs_symlink_iops = {
6b2553918d8b4 (Al Viro 2015-11-17 10:20:54 -0500 1124) .get_link = ecryptfs_get_link,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1125) .permission = ecryptfs_permission,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1126) .setattr = ecryptfs_setattr,
3a60a1686f0d5 (Tyler Hicks 2010-03-22 00:41:35 -0500 1127) .getattr = ecryptfs_getattr_link,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1128) .listxattr = ecryptfs_listxattr,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1129) };
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1130)
754661f143e70 (Arjan van de Ven 2007-02-12 00:55:38 -0800 1131) const struct inode_operations ecryptfs_dir_iops = {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1132) .create = ecryptfs_create,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1133) .lookup = ecryptfs_lookup,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1134) .link = ecryptfs_link,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1135) .unlink = ecryptfs_unlink,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1136) .symlink = ecryptfs_symlink,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1137) .mkdir = ecryptfs_mkdir,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1138) .rmdir = ecryptfs_rmdir,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1139) .mknod = ecryptfs_mknod,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1140) .rename = ecryptfs_rename,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1141) .permission = ecryptfs_permission,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1142) .setattr = ecryptfs_setattr,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1143) .listxattr = ecryptfs_listxattr,
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1144) .fileattr_get = ecryptfs_fileattr_get,
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1145) .fileattr_set = ecryptfs_fileattr_set,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1146) };
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1147)
754661f143e70 (Arjan van de Ven 2007-02-12 00:55:38 -0800 1148) const struct inode_operations ecryptfs_main_iops = {
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1149) .permission = ecryptfs_permission,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1150) .setattr = ecryptfs_setattr,
f8f484d1b6677 (Tyler Hicks 2009-11-04 02:48:01 -0600 1151) .getattr = ecryptfs_getattr,
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1152) .listxattr = ecryptfs_listxattr,
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1153) .fileattr_get = ecryptfs_fileattr_get,
97e2dee9752bb (Miklos Szeredi 2021-04-07 14:36:42 +0200 1154) .fileattr_set = ecryptfs_fileattr_set,
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1155) };
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1156)
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1157) static int ecryptfs_xattr_get(const struct xattr_handler *handler,
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1158) struct dentry *dentry, struct inode *inode,
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1159) const char *name, void *buffer, size_t size)
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1160) {
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1161) return ecryptfs_getxattr(dentry, inode, name, buffer, size);
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1162) }
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1163)
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1164) static int ecryptfs_xattr_set(const struct xattr_handler *handler,
e65ce2a50cf6a (Christian Brauner 2021-01-21 14:19:27 +0100 1165) struct user_namespace *mnt_userns,
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1166) struct dentry *dentry, struct inode *inode,
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1167) const char *name, const void *value, size_t size,
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1168) int flags)
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1169) {
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1170) if (value)
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1171) return ecryptfs_setxattr(dentry, inode, name, value, size, flags);
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1172) else {
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1173) BUG_ON(flags != XATTR_REPLACE);
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1174) return ecryptfs_removexattr(dentry, inode, name);
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1175) }
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1176) }
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1177)
c036061be907b (YueHaibing 2019-06-14 23:51:17 +0800 1178) static const struct xattr_handler ecryptfs_xattr_handler = {
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1179) .prefix = "", /* match anything */
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1180) .get = ecryptfs_xattr_get,
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1181) .set = ecryptfs_xattr_set,
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1182) };
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1183)
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1184) const struct xattr_handler *ecryptfs_xattr_handlers[] = {
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1185) &ecryptfs_xattr_handler,
4b899da50dcf1 (Andreas Gruenbacher 2016-09-29 17:48:36 +0200 1186) NULL
237fead619984 (Michael Halcrow 2006-10-04 02:16:22 -0700 1187) };