diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /fs/ext4/inode.c | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'fs/ext4/inode.c')
| -rw-r--r-- | fs/ext4/inode.c | 27 | 
1 files changed, 25 insertions, 2 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index cecf9aa10811..612fbcf76b5c 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -22,6 +22,7 @@  #include <linux/time.h>  #include <linux/highuid.h>  #include <linux/pagemap.h> +#include <linux/dax.h>  #include <linux/quotaops.h>  #include <linux/string.h>  #include <linux/buffer_head.h> @@ -3020,6 +3021,17 @@ static int ext4_get_block_write_nolock(struct inode *inode, sector_t iblock,  			       EXT4_GET_BLOCKS_NO_LOCK);  } +int ext4_get_block_dax(struct inode *inode, sector_t iblock, +		   struct buffer_head *bh_result, int create) +{ +	int flags = EXT4_GET_BLOCKS_PRE_IO | EXT4_GET_BLOCKS_UNWRIT_EXT; +	if (create) +		flags |= EXT4_GET_BLOCKS_CREATE; +	ext4_debug("ext4_get_block_dax: inode %lu, create flag %d\n", +		   inode->i_ino, create); +	return _ext4_get_block(inode, iblock, bh_result, flags); +} +  static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,  			    ssize_t size, void *private)  { @@ -4661,8 +4673,11 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)  	if (error)  		return error; -	if (is_quota_modification(inode, attr)) -		dquot_initialize(inode); +	if (is_quota_modification(inode, attr)) { +		error = dquot_initialize(inode); +		if (error) +			return error; +	}  	if ((ia_valid & ATTR_UID && !uid_eq(attr->ia_uid, inode->i_uid)) ||  	    (ia_valid & ATTR_GID && !gid_eq(attr->ia_gid, inode->i_gid))) {  		handle_t *handle; @@ -4725,6 +4740,14 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)  				error = ext4_orphan_add(handle, inode);  				orphan = 1;  			} +			/* +			 * Update c/mtime on truncate up, ext4_truncate() will +			 * update c/mtime in shrink case below +			 */ +			if (!shrink) { +				inode->i_mtime = ext4_current_time(inode); +				inode->i_ctime = inode->i_mtime; +			}  			down_write(&EXT4_I(inode)->i_data_sem);  			EXT4_I(inode)->i_disksize = attr->ia_size;  			rc = ext4_mark_inode_dirty(handle, inode);  |