VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
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) };