Commit 081447ec authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Tyler Hicks
Browse files

ecryptfs: merge ecryptfs_inode_newsize_ok into truncate_upper



Both callers of ecryptfs_inode_newsize_ok call truncate_upper right
after.  Merge ecryptfs_inode_newsize_ok into truncate_upper to simplify
the logic.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarTyler Hicks <code@tyhicks.com>
parent 472dea1d
Loading
Loading
Loading
Loading
+17 −35
Original line number Diff line number Diff line
@@ -738,6 +738,23 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia,
		return 0;
	}

	crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
	lower_size_before_truncate =
		upper_size_to_lower_size(crypt_stat, i_size);
	lower_size_after_truncate =
		upper_size_to_lower_size(crypt_stat, ia->ia_size);
	if (lower_size_after_truncate > lower_size_before_truncate) {
		/*
		 * The eCryptfs inode and the new *lower* size are mixed here
		 * because we may not have the lower i_mutex held and/or it may
		 * not be appropriate to call inode_newsize_ok() with inodes
		 * from other filesystems.
		 */
		rc = inode_newsize_ok(inode, lower_size_after_truncate);
		if (rc)
			return rc;
	}

	rc = ecryptfs_get_lower_file(dentry, inode);
	if (rc)
		return rc;
@@ -756,7 +773,6 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia,
		goto out;
	}

	crypt_stat = &ecryptfs_inode_to_private(d_inode(dentry))->crypt_stat;
	if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
		truncate_setsize(inode, ia->ia_size);
		lower_ia->ia_size = ia->ia_size;
@@ -791,10 +807,6 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia,
	 * We are reducing the size of the ecryptfs file, and need to know if we
	 * need to reduce the size of the lower file.
	 */
	lower_size_before_truncate =
		upper_size_to_lower_size(crypt_stat, i_size);
	lower_size_after_truncate =
		upper_size_to_lower_size(crypt_stat, ia->ia_size);
	if (lower_size_after_truncate < lower_size_before_truncate) {
		lower_ia->ia_size = lower_size_after_truncate;
		lower_ia->ia_valid |= ATTR_SIZE;
@@ -806,28 +818,6 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia,
	return rc;
}

static int ecryptfs_inode_newsize_ok(struct inode *inode, loff_t offset)
{
	struct ecryptfs_crypt_stat *crypt_stat;
	loff_t lower_oldsize, lower_newsize;

	crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
	lower_oldsize = upper_size_to_lower_size(crypt_stat,
						 i_size_read(inode));
	lower_newsize = upper_size_to_lower_size(crypt_stat, offset);
	if (lower_newsize > lower_oldsize) {
		/*
		 * The eCryptfs inode and the new *lower* size are mixed here
		 * because we may not have the lower i_mutex held and/or it may
		 * not be appropriate to call inode_newsize_ok() with inodes
		 * from other filesystems.
		 */
		return inode_newsize_ok(inode, lower_newsize);
	}

	return 0;
}

/**
 * ecryptfs_truncate
 * @dentry: The ecryptfs layer dentry
@@ -844,10 +834,6 @@ int ecryptfs_truncate(struct dentry *dentry, loff_t new_length)
	struct iattr lower_ia = { .ia_valid = 0 };
	int rc;

	rc = ecryptfs_inode_newsize_ok(d_inode(dentry), new_length);
	if (rc)
		return rc;

	rc = truncate_upper(dentry, &ia, &lower_ia);
	if (!rc && lower_ia.ia_valid & ATTR_SIZE) {
		struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
@@ -939,10 +925,6 @@ static int ecryptfs_setattr(struct mnt_idmap *idmap,
	if (ia->ia_valid & ATTR_FILE)
		lower_ia.ia_file = ecryptfs_file_to_lower(ia->ia_file);
	if (ia->ia_valid & ATTR_SIZE) {
		rc = ecryptfs_inode_newsize_ok(inode, ia->ia_size);
		if (rc)
			goto out;

		rc = truncate_upper(dentry, ia, &lower_ia);
		if (rc < 0)
			goto out;