diff options
Diffstat (limited to 'fs/fat/file.c')
| -rw-r--r-- | fs/fat/file.c | 49 | 
1 files changed, 18 insertions, 31 deletions
diff --git a/fs/fat/file.c b/fs/fat/file.c index 990dfae022e..7257752b6d5 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c @@ -364,18 +364,6 @@ static int fat_allow_set_time(struct msdos_sb_info *sbi, struct inode *inode)  	return 0;  } -int fat_setsize(struct inode *inode, loff_t offset) -{ -	int error; - -	error = simple_setsize(inode, offset); -	if (error) -		return error; -	fat_truncate_blocks(inode, offset); - -	return error; -} -  #define TIMES_SET_FLAGS	(ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)  /* valid file mode bits */  #define FAT_VALID_MODE	(S_IFREG | S_IFDIR | S_IRWXUGO) @@ -387,21 +375,6 @@ int fat_setattr(struct dentry *dentry, struct iattr *attr)  	unsigned int ia_valid;  	int error; -	/* -	 * Expand the file. Since inode_setattr() updates ->i_size -	 * before calling the ->truncate(), but FAT needs to fill the -	 * hole before it. XXX: this is no longer true with new truncate -	 * sequence. -	 */ -	if (attr->ia_valid & ATTR_SIZE) { -		if (attr->ia_size > inode->i_size) { -			error = fat_cont_expand(inode, attr->ia_size); -			if (error || attr->ia_valid == ATTR_SIZE) -				goto out; -			attr->ia_valid &= ~ATTR_SIZE; -		} -	} -  	/* Check for setting the inode time. */  	ia_valid = attr->ia_valid;  	if (ia_valid & TIMES_SET_FLAGS) { @@ -417,6 +390,21 @@ int fat_setattr(struct dentry *dentry, struct iattr *attr)  		goto out;  	} +	/* +	 * Expand the file. Since inode_setattr() updates ->i_size +	 * before calling the ->truncate(), but FAT needs to fill the +	 * hole before it. XXX: this is no longer true with new truncate +	 * sequence. +	 */ +	if (attr->ia_valid & ATTR_SIZE) { +		if (attr->ia_size > inode->i_size) { +			error = fat_cont_expand(inode, attr->ia_size); +			if (error || attr->ia_valid == ATTR_SIZE) +				goto out; +			attr->ia_valid &= ~ATTR_SIZE; +		} +	} +  	if (((attr->ia_valid & ATTR_UID) &&  	     (attr->ia_uid != sbi->options.fs_uid)) ||  	    ((attr->ia_valid & ATTR_GID) && @@ -441,12 +429,11 @@ int fat_setattr(struct dentry *dentry, struct iattr *attr)  	}  	if (attr->ia_valid & ATTR_SIZE) { -		error = fat_setsize(inode, attr->ia_size); -		if (error) -			goto out; +		truncate_setsize(inode, attr->ia_size); +		fat_truncate_blocks(inode, attr->ia_size);  	} -	generic_setattr(inode, attr); +	setattr_copy(inode, attr);  	mark_inode_dirty(inode);  out:  	return error;  |