diff options
| author | Tyler Hicks <tyhicks@linux.vnet.ibm.com> | 2011-05-23 21:18:20 -0500 | 
|---|---|---|
| committer | Tyler Hicks <tyhicks@linux.vnet.ibm.com> | 2011-05-29 12:49:53 -0500 | 
| commit | c4f790736ca8d7d86883c5aee2ba1caa15cd8da3 (patch) | |
| tree | 827e371fb2aff1e9290fbd90ca436d069aaa356d | |
| parent | 139f37f5e14cd883eee2a8a36289f544b5390a44 (diff) | |
eCryptfs: Consolidate inode functions into inode.c
These functions should live in inode.c since their focus is on inodes
and they're primarily used by functions in inode.c.
Also does a simple cleanup of ecryptfs_inode_test() and rolls
ecryptfs_init_inode() into ecryptfs_inode_set().
Signed-off-by: Tyler Hicks <tyhicks@linux.vnet.ibm.com>
Tested-by: David <david@unsolicited.net>
| -rw-r--r-- | fs/ecryptfs/ecryptfs_kernel.h | 9 | ||||
| -rw-r--r-- | fs/ecryptfs/inode.c | 104 | ||||
| -rw-r--r-- | fs/ecryptfs/main.c | 69 | ||||
| -rw-r--r-- | fs/ecryptfs/super.c | 16 | 
4 files changed, 91 insertions, 107 deletions
| diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h index e70282775e2c..37224b5fb12a 100644 --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h @@ -625,10 +625,8 @@ struct ecryptfs_open_req {  	struct list_head kthread_ctl_list;  }; -#define ECRYPTFS_INTERPOSE_FLAG_D_ADD                 0x00000001 -int ecryptfs_interpose(struct dentry *hidden_dentry, -		       struct dentry *this_dentry, struct super_block *sb, -		       u32 flags); +struct inode *ecryptfs_get_inode(struct inode *lower_inode, +				 struct super_block *sb);  void ecryptfs_i_size_init(const char *page_virt, struct inode *inode);  int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,  					struct dentry *lower_dentry, @@ -679,9 +677,6 @@ int  ecryptfs_parse_packet_set(struct ecryptfs_crypt_stat *crypt_stat,  			  unsigned char *src, struct dentry *ecryptfs_dentry);  int ecryptfs_truncate(struct dentry *dentry, loff_t new_length); -int ecryptfs_inode_test(struct inode *inode, void *candidate_lower_inode); -int ecryptfs_inode_set(struct inode *inode, void *lower_inode); -void ecryptfs_init_inode(struct inode *inode, struct inode *lower_inode);  ssize_t  ecryptfs_getxattr_lower(struct dentry *lower_dentry, const char *name,  			void *value, size_t size); diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 94ab3c06317a..704a8c8fe19a 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -51,6 +51,95 @@ static void unlock_dir(struct dentry *dir)  	dput(dir);  } +static int ecryptfs_inode_test(struct inode *inode, void *lower_inode) +{ +	if (ecryptfs_inode_to_lower(inode) == (struct inode *)lower_inode) +		return 1; +	return 0; +} + +static int ecryptfs_inode_set(struct inode *inode, void *lower_inode) +{ +	ecryptfs_set_inode_lower(inode, (struct inode *)lower_inode); +	inode->i_ino = ((struct inode *)lower_inode)->i_ino; +	inode->i_version++; +	inode->i_op = &ecryptfs_main_iops; +	inode->i_fop = &ecryptfs_main_fops; +	inode->i_mapping->a_ops = &ecryptfs_aops; +	return 0; +} + +struct inode *ecryptfs_get_inode(struct inode *lower_inode, +				 struct super_block *sb) +{ +	struct inode *inode; +	int rc = 0; + +	if (lower_inode->i_sb != ecryptfs_superblock_to_lower(sb)) { +		rc = -EXDEV; +		goto out; +	} +	if (!igrab(lower_inode)) { +		rc = -ESTALE; +		goto out; +	} +	inode = iget5_locked(sb, (unsigned long)lower_inode, +			     ecryptfs_inode_test, ecryptfs_inode_set, +			     lower_inode); +	if (!inode) { +		rc = -EACCES; +		iput(lower_inode); +		goto out; +	} +	if (inode->i_state & I_NEW) +		unlock_new_inode(inode); +	else +		iput(lower_inode); +	if (S_ISLNK(lower_inode->i_mode)) +		inode->i_op = &ecryptfs_symlink_iops; +	else if (S_ISDIR(lower_inode->i_mode)) +		inode->i_op = &ecryptfs_dir_iops; +	if (S_ISDIR(lower_inode->i_mode)) +		inode->i_fop = &ecryptfs_dir_fops; +	if (special_file(lower_inode->i_mode)) +		init_special_inode(inode, lower_inode->i_mode, +				   lower_inode->i_rdev); +	fsstack_copy_attr_all(inode, lower_inode); +	/* This size will be overwritten for real files w/ headers and +	 * other metadata */ +	fsstack_copy_inode_size(inode, lower_inode); +	return inode; +out: +	return ERR_PTR(rc); +} + +#define ECRYPTFS_INTERPOSE_FLAG_D_ADD                 0x00000001 +/** + * ecryptfs_interpose + * @lower_dentry: Existing dentry in the lower filesystem + * @dentry: ecryptfs' dentry + * @sb: ecryptfs's super_block + * @flags: flags to govern behavior of interpose procedure + * + * Interposes upper and lower dentries. + * + * Returns zero on success; non-zero otherwise + */ +static int ecryptfs_interpose(struct dentry *lower_dentry, +			      struct dentry *dentry, struct super_block *sb, +			      u32 flags) +{ +	struct inode *lower_inode = lower_dentry->d_inode; +	struct inode *inode = ecryptfs_get_inode(lower_inode, sb); +	if (IS_ERR(inode)) +		return PTR_ERR(inode); +	if (flags & ECRYPTFS_INTERPOSE_FLAG_D_ADD) +		d_add(dentry, inode); +	else +		d_instantiate(dentry, inode); +	return 0; +} +  /**   * ecryptfs_create_underlying_file   * @lower_dir_inode: inode of the parent in the lower fs of the new file @@ -1079,21 +1168,6 @@ out:  	return rc;  } -int ecryptfs_inode_test(struct inode *inode, void *candidate_lower_inode) -{ -	if ((ecryptfs_inode_to_lower(inode) -	     == (struct inode *)candidate_lower_inode)) -		return 1; -	else -		return 0; -} - -int ecryptfs_inode_set(struct inode *inode, void *lower_inode) -{ -	ecryptfs_init_inode(inode, (struct inode *)lower_inode); -	return 0; -} -  const struct inode_operations ecryptfs_symlink_iops = {  	.readlink = ecryptfs_readlink,  	.follow_link = ecryptfs_follow_link, diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 89b93389af8e..7c697abab396 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c @@ -168,75 +168,6 @@ void ecryptfs_put_lower_file(struct inode *inode)  	}  } -static struct inode *ecryptfs_get_inode(struct inode *lower_inode, -		       struct super_block *sb) -{ -	struct inode *inode; -	int rc = 0; - -	if (lower_inode->i_sb != ecryptfs_superblock_to_lower(sb)) { -		rc = -EXDEV; -		goto out; -	} -	if (!igrab(lower_inode)) { -		rc = -ESTALE; -		goto out; -	} -	inode = iget5_locked(sb, (unsigned long)lower_inode, -			     ecryptfs_inode_test, ecryptfs_inode_set, -			     lower_inode); -	if (!inode) { -		rc = -EACCES; -		iput(lower_inode); -		goto out; -	} -	if (inode->i_state & I_NEW) -		unlock_new_inode(inode); -	else -		iput(lower_inode); -	if (S_ISLNK(lower_inode->i_mode)) -		inode->i_op = &ecryptfs_symlink_iops; -	else if (S_ISDIR(lower_inode->i_mode)) -		inode->i_op = &ecryptfs_dir_iops; -	if (S_ISDIR(lower_inode->i_mode)) -		inode->i_fop = &ecryptfs_dir_fops; -	if (special_file(lower_inode->i_mode)) -		init_special_inode(inode, lower_inode->i_mode, -				   lower_inode->i_rdev); -	fsstack_copy_attr_all(inode, lower_inode); -	/* This size will be overwritten for real files w/ headers and -	 * other metadata */ -	fsstack_copy_inode_size(inode, lower_inode); -	return inode; -out: -	return ERR_PTR(rc); -} - -/** - * ecryptfs_interpose - * @lower_dentry: Existing dentry in the lower filesystem - * @dentry: ecryptfs' dentry - * @sb: ecryptfs's super_block - * @flags: flags to govern behavior of interpose procedure - * - * Interposes upper and lower dentries. - * - * Returns zero on success; non-zero otherwise - */ -int ecryptfs_interpose(struct dentry *lower_dentry, struct dentry *dentry, -		       struct super_block *sb, u32 flags) -{ -	struct inode *lower_inode = lower_dentry->d_inode; -	struct inode *inode = ecryptfs_get_inode(lower_inode, sb); -	if (IS_ERR(inode)) -		return PTR_ERR(inode); -	if (flags & ECRYPTFS_INTERPOSE_FLAG_D_ADD) -		d_add(dentry, inode); -	else -		d_instantiate(dentry, inode); -	return 0; -} -  enum { ecryptfs_opt_sig, ecryptfs_opt_ecryptfs_sig,         ecryptfs_opt_cipher, ecryptfs_opt_ecryptfs_cipher,         ecryptfs_opt_ecryptfs_key_bytes, diff --git a/fs/ecryptfs/super.c b/fs/ecryptfs/super.c index 245b517bf1b6..dbd52d40df4c 100644 --- a/fs/ecryptfs/super.c +++ b/fs/ecryptfs/super.c @@ -93,22 +93,6 @@ static void ecryptfs_destroy_inode(struct inode *inode)  }  /** - * ecryptfs_init_inode - * @inode: The ecryptfs inode - * - * Set up the ecryptfs inode. - */ -void ecryptfs_init_inode(struct inode *inode, struct inode *lower_inode) -{ -	ecryptfs_set_inode_lower(inode, lower_inode); -	inode->i_ino = lower_inode->i_ino; -	inode->i_version++; -	inode->i_op = &ecryptfs_main_iops; -	inode->i_fop = &ecryptfs_main_fops; -	inode->i_mapping->a_ops = &ecryptfs_aops; -} - -/**   * ecryptfs_statfs   * @sb: The ecryptfs super block   * @buf: The struct kstatfs to fill in with stats | 
