diff options
Diffstat (limited to 'fs/ecryptfs/inode.c')
| -rw-r--r-- | fs/ecryptfs/inode.c | 58 | 
1 files changed, 23 insertions, 35 deletions
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 67e9b633969..d4a9431ec73 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -153,7 +153,7 @@ static int ecryptfs_do_unlink(struct inode *dir, struct dentry *dentry,  	dget(lower_dentry);  	lower_dir_dentry = lock_parent(lower_dentry); -	rc = vfs_unlink(lower_dir_inode, lower_dentry); +	rc = vfs_unlink(lower_dir_inode, lower_dentry, NULL);  	if (rc) {  		printk(KERN_ERR "Error in vfs_unlink; rc = [%d]\n", rc);  		goto out_unlock; @@ -208,7 +208,7 @@ ecryptfs_do_create(struct inode *directory_inode,  	inode = __ecryptfs_get_inode(lower_dentry->d_inode,  				     directory_inode->i_sb);  	if (IS_ERR(inode)) { -		vfs_unlink(lower_dir_dentry->d_inode, lower_dentry); +		vfs_unlink(lower_dir_dentry->d_inode, lower_dentry, NULL);  		goto out_lock;  	}  	fsstack_copy_attr_times(directory_inode, lower_dir_dentry->d_inode); @@ -361,8 +361,8 @@ static int ecryptfs_lookup_interpose(struct dentry *dentry,  	BUG_ON(!d_count(lower_dentry));  	ecryptfs_set_dentry_private(dentry, dentry_info); -	ecryptfs_set_dentry_lower(dentry, lower_dentry); -	ecryptfs_set_dentry_lower_mnt(dentry, lower_mnt); +	dentry_info->lower_path.mnt = lower_mnt; +	dentry_info->lower_path.dentry = lower_dentry;  	if (!lower_dentry->d_inode) {  		/* We want to add because we couldn't find in lower */ @@ -475,7 +475,7 @@ static int ecryptfs_link(struct dentry *old_dentry, struct inode *dir,  	dget(lower_new_dentry);  	lower_dir_dentry = lock_parent(lower_new_dentry);  	rc = vfs_link(lower_old_dentry, lower_dir_dentry->d_inode, -		      lower_new_dentry); +		      lower_new_dentry, NULL);  	if (rc || !lower_new_dentry->d_inode)  		goto out_lock;  	rc = ecryptfs_interpose(lower_new_dentry, new_dentry, dir->i_sb); @@ -640,7 +640,8 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry,  		goto out_lock;  	}  	rc = vfs_rename(lower_old_dir_dentry->d_inode, lower_old_dentry, -			lower_new_dir_dentry->d_inode, lower_new_dentry); +			lower_new_dir_dentry->d_inode, lower_new_dentry, +			NULL, 0);  	if (rc)  		goto out_lock;  	if (target_inode) @@ -658,19 +659,17 @@ out_lock:  	return rc;  } -static int ecryptfs_readlink_lower(struct dentry *dentry, char **buf, -				   size_t *bufsiz) +static char *ecryptfs_readlink_lower(struct dentry *dentry, size_t *bufsiz)  {  	struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);  	char *lower_buf; +	char *buf;  	mm_segment_t old_fs;  	int rc;  	lower_buf = kmalloc(PATH_MAX, GFP_KERNEL); -	if (!lower_buf) { -		rc = -ENOMEM; -		goto out; -	} +	if (!lower_buf) +		return ERR_PTR(-ENOMEM);  	old_fs = get_fs();  	set_fs(get_ds());  	rc = lower_dentry->d_inode->i_op->readlink(lower_dentry, @@ -679,21 +678,18 @@ static int ecryptfs_readlink_lower(struct dentry *dentry, char **buf,  	set_fs(old_fs);  	if (rc < 0)  		goto out; -	rc = ecryptfs_decode_and_decrypt_filename(buf, bufsiz, dentry->d_sb, +	rc = ecryptfs_decode_and_decrypt_filename(&buf, bufsiz, dentry->d_sb,  						  lower_buf, rc);  out:  	kfree(lower_buf); -	return rc; +	return rc ? ERR_PTR(rc) : buf;  }  static void *ecryptfs_follow_link(struct dentry *dentry, struct nameidata *nd)  { -	char *buf; -	size_t len = PATH_MAX; -	int rc; - -	rc = ecryptfs_readlink_lower(dentry, &buf, &len); -	if (rc) +	size_t len; +	char *buf = ecryptfs_readlink_lower(dentry, &len); +	if (IS_ERR(buf))  		goto out;  	fsstack_copy_attr_atime(dentry->d_inode,  				ecryptfs_dentry_to_lower(dentry)->d_inode); @@ -703,16 +699,6 @@ out:  	return NULL;  } -static void -ecryptfs_put_link(struct dentry *dentry, struct nameidata *nd, void *ptr) -{ -	char *buf = nd_get_link(nd); -	if (!IS_ERR(buf)) { -		/* Free the char* */ -		kfree(buf); -	} -} -  /**   * upper_size_to_lower_size   * @crypt_stat: Crypt_stat associated with file @@ -891,7 +877,7 @@ int ecryptfs_truncate(struct dentry *dentry, loff_t new_length)  		struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);  		mutex_lock(&lower_dentry->d_inode->i_mutex); -		rc = notify_change(lower_dentry, &lower_ia); +		rc = notify_change(lower_dentry, &lower_ia, NULL);  		mutex_unlock(&lower_dentry->d_inode->i_mutex);  	}  	return rc; @@ -992,7 +978,7 @@ static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia)  		lower_ia.ia_valid &= ~ATTR_MODE;  	mutex_lock(&lower_dentry->d_inode->i_mutex); -	rc = notify_change(lower_dentry, &lower_ia); +	rc = notify_change(lower_dentry, &lower_ia, NULL);  	mutex_unlock(&lower_dentry->d_inode->i_mutex);  out:  	fsstack_copy_attr_all(inode, lower_inode); @@ -1012,10 +998,12 @@ static int ecryptfs_getattr_link(struct vfsmount *mnt, struct dentry *dentry,  		char *target;  		size_t targetsiz; -		rc = ecryptfs_readlink_lower(dentry, &target, &targetsiz); -		if (!rc) { +		target = ecryptfs_readlink_lower(dentry, &targetsiz); +		if (!IS_ERR(target)) {  			kfree(target);  			stat->size = targetsiz; +		} else { +			rc = PTR_ERR(target);  		}  	}  	return rc; @@ -1121,7 +1109,7 @@ out:  const struct inode_operations ecryptfs_symlink_iops = {  	.readlink = generic_readlink,  	.follow_link = ecryptfs_follow_link, -	.put_link = ecryptfs_put_link, +	.put_link = kfree_put_link,  	.permission = ecryptfs_permission,  	.setattr = ecryptfs_setattr,  	.getattr = ecryptfs_getattr_link,  | 
