diff options
Diffstat (limited to 'fs/ubifs/file.c')
| -rw-r--r-- | fs/ubifs/file.c | 31 | 
1 files changed, 14 insertions, 17 deletions
diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c index 6738fe43040b..e5382f0b2587 100644 --- a/fs/ubifs/file.c +++ b/fs/ubifs/file.c @@ -1092,7 +1092,7 @@ static void do_attr_changes(struct inode *inode, const struct iattr *attr)  	if (attr->ia_valid & ATTR_MTIME)  		inode->i_mtime = attr->ia_mtime;  	if (attr->ia_valid & ATTR_CTIME) -		inode->i_ctime = attr->ia_ctime; +		inode_set_ctime_to_ts(inode, attr->ia_ctime);  	if (attr->ia_valid & ATTR_MODE) {  		umode_t mode = attr->ia_mode; @@ -1192,7 +1192,7 @@ static int do_truncation(struct ubifs_info *c, struct inode *inode,  	mutex_lock(&ui->ui_mutex);  	ui->ui_size = inode->i_size;  	/* Truncation changes inode [mc]time */ -	inode->i_mtime = inode->i_ctime = current_time(inode); +	inode->i_mtime = inode_set_ctime_current(inode);  	/* Other attributes may be changed at the same time as well */  	do_attr_changes(inode, attr);  	err = ubifs_jnl_truncate(c, inode, old_size, new_size); @@ -1239,7 +1239,7 @@ static int do_setattr(struct ubifs_info *c, struct inode *inode,  	mutex_lock(&ui->ui_mutex);  	if (attr->ia_valid & ATTR_SIZE) {  		/* Truncation changes inode [mc]time */ -		inode->i_mtime = inode->i_ctime = current_time(inode); +		inode->i_mtime = inode_set_ctime_current(inode);  		/* 'truncate_setsize()' changed @i_size, update @ui_size */  		ui->ui_size = inode->i_size;  	} @@ -1364,8 +1364,10 @@ out:  static inline int mctime_update_needed(const struct inode *inode,  				       const struct timespec64 *now)  { +	struct timespec64 ctime = inode_get_ctime(inode); +  	if (!timespec64_equal(&inode->i_mtime, now) || -	    !timespec64_equal(&inode->i_ctime, now)) +	    !timespec64_equal(&ctime, now))  		return 1;  	return 0;  } @@ -1376,8 +1378,7 @@ static inline int mctime_update_needed(const struct inode *inode,   *   * This function updates time of the inode.   */ -int ubifs_update_time(struct inode *inode, struct timespec64 *time, -			     int flags) +int ubifs_update_time(struct inode *inode, int flags)  {  	struct ubifs_inode *ui = ubifs_inode(inode);  	struct ubifs_info *c = inode->i_sb->s_fs_info; @@ -1385,21 +1386,17 @@ int ubifs_update_time(struct inode *inode, struct timespec64 *time,  			.dirtied_ino_d = ALIGN(ui->data_len, 8) };  	int err, release; -	if (!IS_ENABLED(CONFIG_UBIFS_ATIME_SUPPORT)) -		return generic_update_time(inode, time, flags); +	if (!IS_ENABLED(CONFIG_UBIFS_ATIME_SUPPORT)) { +		generic_update_time(inode, flags); +		return 0; +	}  	err = ubifs_budget_space(c, &req);  	if (err)  		return err;  	mutex_lock(&ui->ui_mutex); -	if (flags & S_ATIME) -		inode->i_atime = *time; -	if (flags & S_CTIME) -		inode->i_ctime = *time; -	if (flags & S_MTIME) -		inode->i_mtime = *time; - +	inode_update_timestamps(inode, flags);  	release = ui->dirty;  	__mark_inode_dirty(inode, I_DIRTY_SYNC);  	mutex_unlock(&ui->ui_mutex); @@ -1432,7 +1429,7 @@ static int update_mctime(struct inode *inode)  			return err;  		mutex_lock(&ui->ui_mutex); -		inode->i_mtime = inode->i_ctime = current_time(inode); +		inode->i_mtime = inode_set_ctime_current(inode);  		release = ui->dirty;  		mark_inode_dirty_sync(inode);  		mutex_unlock(&ui->ui_mutex); @@ -1570,7 +1567,7 @@ static vm_fault_t ubifs_vm_page_mkwrite(struct vm_fault *vmf)  		struct ubifs_inode *ui = ubifs_inode(inode);  		mutex_lock(&ui->ui_mutex); -		inode->i_mtime = inode->i_ctime = current_time(inode); +		inode->i_mtime = inode_set_ctime_current(inode);  		release = ui->dirty;  		mark_inode_dirty_sync(inode);  		mutex_unlock(&ui->ui_mutex);  | 
