linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V2 2/2] fat: change timestamp updates to use fat_update_time
@ 2018-04-04  2:37 Frank Sorenson
  2018-04-08  0:17 ` OGAWA Hirofumi
  0 siblings, 1 reply; 2+ messages in thread
From: Frank Sorenson @ 2018-04-04  2:37 UTC (permalink / raw)
  To: OGAWA Hirofumi, linux-fsdevel

Author: Frank Sorenson <sorenson@redhat.com>
Date:   2018-04-03 20:21:58 -0500

    fat: change timestamp updates to use fat_update_time
    
    Make the inode timestamp updates use fat_update_time.
    
    Signed-off-by: Frank Sorenson <sorenson@redhat.com>

diff --git a/fs/fat/dir.c b/fs/fat/dir.c
index 8e100c3bf72c..d33eb82044c8 100644
--- a/fs/fat/dir.c
+++ b/fs/fat/dir.c
@@ -1071,7 +1071,7 @@ int fat_remove_entries(struct inode *dir, struct fat_slot_info *sinfo)
 		}
 	}
 
-	dir->i_mtime = dir->i_atime = current_time(dir);
+	fat_update_time(dir, NULL, S_ATIME|S_MTIME);
 	if (IS_DIRSYNC(dir))
 		(void)fat_sync_inode(dir);
 	else
diff --git a/fs/fat/file.c b/fs/fat/file.c
index 63ec4a5bde77..b5495df1879b 100644
--- a/fs/fat/file.c
+++ b/fs/fat/file.c
@@ -63,7 +63,8 @@ static int fat_ioctl_set_attributes(struct file *file, u32 __user *user_attr)
 
 	/* Equivalent to a chmod() */
 	ia.ia_valid = ATTR_MODE | ATTR_CTIME;
-	ia.ia_ctime = current_time(inode);
+	fat_update_time(inode, NULL, S_CTIME);
+	ia.ia_ctime = inode->i_ctime;
 	if (is_dir)
 		ia.ia_mode = fat_make_mode(sbi, attr, S_IRWXUGO);
 	else {
@@ -194,7 +195,7 @@ static int fat_cont_expand(struct inode *inode, loff_t size)
 	if (err)
 		goto out;
 
-	inode->i_ctime = inode->i_mtime = current_time(inode);
+	fat_update_time(inode, NULL, S_MTIME|S_CTIME);
 	mark_inode_dirty(inode);
 	if (IS_SYNC(inode)) {
 		int err2;
@@ -297,7 +298,7 @@ static int fat_free(struct inode *inode, int skip)
 		MSDOS_I(inode)->i_logstart = 0;
 	}
 	MSDOS_I(inode)->i_attrs |= ATTR_ARCH;
-	inode->i_ctime = inode->i_mtime = current_time(inode);
+	fat_update_time(inode, NULL, S_MTIME|S_CTIME);
 	if (wait) {
 		err = fat_sync_inode(inode);
 		if (err) {
@@ -510,6 +511,10 @@ int fat_setattr(struct dentry *dentry, struct iattr *attr)
 	}
 
 	setattr_copy(inode, attr);
+	fat_update_time(inode, &inode->i_mtime, S_MTIME);
+	fat_update_time(inode, &inode->i_ctime, S_CTIME);
+	fat_update_time(inode, &inode->i_atime, S_ATIME);
+
 	mark_inode_dirty(inode);
 out:
 	return error;
diff --git a/fs/fat/inode.c b/fs/fat/inode.c
index ffbbf0520d9e..d79d197e5cda 100644
--- a/fs/fat/inode.c
+++ b/fs/fat/inode.c
@@ -238,7 +238,7 @@ static int fat_write_end(struct file *file, struct address_space *mapping,
 	if (err < len)
 		fat_write_failed(mapping, pos + len);
 	if (!(err < 0) && !(MSDOS_I(inode)->i_attrs & ATTR_ARCH)) {
-		inode->i_mtime = inode->i_ctime = current_time(inode);
+		fat_update_time(inode, NULL, S_MTIME|S_CTIME);
 		MSDOS_I(inode)->i_attrs |= ATTR_ARCH;
 		mark_inode_dirty(inode);
 	}
@@ -558,7 +558,7 @@ int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de)
 				  de->cdate, de->ctime_cs);
 		fat_time_fat2unix(sbi, &inode->i_atime, 0, de->adate, 0);
 	} else
-		inode->i_ctime = inode->i_atime = inode->i_mtime;
+		fat_update_time(inode, &inode->i_mtime, S_CTIME|S_ATIME);
 
 	return 0;
 }
diff --git a/fs/fat/namei_msdos.c b/fs/fat/namei_msdos.c
index f157df4c1e51..3985c74fe7b2 100644
--- a/fs/fat/namei_msdos.c
+++ b/fs/fat/namei_msdos.c
@@ -250,7 +250,7 @@ static int msdos_add_entry(struct inode *dir, const unsigned char *name,
 	if (err)
 		return err;
 
-	dir->i_ctime = dir->i_mtime = *ts;
+	fat_update_time(dir, ts, S_MTIME|S_CTIME);
 	if (IS_DIRSYNC(dir))
 		(void)fat_sync_inode(dir);
 	else
@@ -294,7 +294,7 @@ static int msdos_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 		err = PTR_ERR(inode);
 		goto out;
 	}
-	inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
+	fat_update_time(inode, &ts, S_MTIME|S_CTIME|S_ATIME);
 	/* timestamp is already written, so mark_inode_dirty() is unneeded. */
 
 	d_instantiate(dentry, inode);
@@ -331,7 +331,7 @@ static int msdos_rmdir(struct inode *dir, struct dentry *dentry)
 	drop_nlink(dir);
 
 	clear_nlink(inode);
-	inode->i_ctime = current_time(inode);
+	fat_update_time(inode, NULL, S_CTIME);
 	fat_detach(inode);
 out:
 	mutex_unlock(&MSDOS_SB(sb)->s_lock);
@@ -384,7 +384,7 @@ static int msdos_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
 		goto out;
 	}
 	set_nlink(inode, 2);
-	inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
+	fat_update_time(inode, &ts, S_MTIME|S_CTIME|S_ATIME);
 	/* timestamp is already written, so mark_inode_dirty() is unneeded. */
 
 	d_instantiate(dentry, inode);
@@ -417,7 +417,7 @@ static int msdos_unlink(struct inode *dir, struct dentry *dentry)
 	if (err)
 		goto out;
 	clear_nlink(inode);
-	inode->i_ctime = current_time(inode);
+	fat_update_time(inode, NULL, S_CTIME);
 	fat_detach(inode);
 out:
 	mutex_unlock(&MSDOS_SB(sb)->s_lock);
@@ -482,7 +482,7 @@ static int do_msdos_rename(struct inode *old_dir, unsigned char *old_name,
 				mark_inode_dirty(old_inode);
 
 			inode_inc_iversion(old_dir);
-			old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
+			fat_update_time(old_dir, NULL, S_MTIME|S_CTIME);
 			if (IS_DIRSYNC(old_dir))
 				(void)fat_sync_inode(old_dir);
 			else
@@ -542,7 +542,7 @@ static int do_msdos_rename(struct inode *old_dir, unsigned char *old_name,
 	if (err)
 		goto error_dotdot;
 	inode_inc_iversion(old_dir);
-	old_dir->i_ctime = old_dir->i_mtime = ts;
+	fat_update_time(old_dir, &ts, S_MTIME|S_CTIME);
 	if (IS_DIRSYNC(old_dir))
 		(void)fat_sync_inode(old_dir);
 	else
@@ -552,7 +552,7 @@ static int do_msdos_rename(struct inode *old_dir, unsigned char *old_name,
 		drop_nlink(new_inode);
 		if (is_dir)
 			drop_nlink(new_inode);
-		new_inode->i_ctime = ts;
+		fat_update_time(new_inode, &ts, S_CTIME);
 	}
 out:
 	brelse(sinfo.bh);
diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c
index 3d24b44cb93d..c59593263232 100644
--- a/fs/fat/namei_vfat.c
+++ b/fs/fat/namei_vfat.c
@@ -678,7 +678,7 @@ static int vfat_add_entry(struct inode *dir, const struct qstr *qname,
 		goto cleanup;
 
 	/* update timestamp */
-	dir->i_ctime = dir->i_mtime = dir->i_atime = *ts;
+	fat_update_time(dir, ts, S_ATIME|S_MTIME|S_CTIME);
 	if (IS_DIRSYNC(dir))
 		(void)fat_sync_inode(dir);
 	else
@@ -790,7 +790,7 @@ static int vfat_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 		goto out;
 	}
 	inode_inc_iversion(inode);
-	inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
+	fat_update_time(inode, &ts, S_ATIME|S_MTIME|S_CTIME);
 	/* timestamp is already written, so mark_inode_dirty() is unneeded. */
 
 	d_instantiate(dentry, inode);
@@ -821,7 +821,7 @@ static int vfat_rmdir(struct inode *dir, struct dentry *dentry)
 	drop_nlink(dir);
 
 	clear_nlink(inode);
-	inode->i_mtime = inode->i_atime = current_time(inode);
+	fat_update_time(inode, NULL, S_ATIME|S_MTIME);
 	fat_detach(inode);
 	vfat_d_version_set(dentry, inode_query_iversion(dir));
 out:
@@ -847,7 +847,7 @@ static int vfat_unlink(struct inode *dir, struct dentry *dentry)
 	if (err)
 		goto out;
 	clear_nlink(inode);
-	inode->i_mtime = inode->i_atime = current_time(inode);
+	fat_update_time(inode, NULL, S_ATIME|S_MTIME);
 	fat_detach(inode);
 	vfat_d_version_set(dentry, inode_query_iversion(dir));
 out:
@@ -887,7 +887,7 @@ static int vfat_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
 	}
 	inode_inc_iversion(inode);
 	set_nlink(inode, 2);
-	inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
+	fat_update_time(inode, &ts, S_ATIME|S_MTIME);
 	/* timestamp is already written, so mark_inode_dirty() is unneeded. */
 
 	d_instantiate(dentry, inode);
@@ -980,7 +980,7 @@ static int vfat_rename(struct inode *old_dir, struct dentry *old_dentry,
 	if (err)
 		goto error_dotdot;
 	inode_inc_iversion(old_dir);
-	old_dir->i_ctime = old_dir->i_mtime = ts;
+	fat_update_time(old_dir, &ts, S_MTIME|S_CTIME);
 	if (IS_DIRSYNC(old_dir))
 		(void)fat_sync_inode(old_dir);
 	else
@@ -990,7 +990,7 @@ static int vfat_rename(struct inode *old_dir, struct dentry *old_dentry,
 		drop_nlink(new_inode);
 		if (is_dir)
 			drop_nlink(new_inode);
-		new_inode->i_ctime = ts;
+		fat_update_time(new_inode, &ts, S_CTIME);
 	}
 out:
 	brelse(sinfo.bh);

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH V2 2/2] fat: change timestamp updates to use fat_update_time
  2018-04-04  2:37 [PATCH V2 2/2] fat: change timestamp updates to use fat_update_time Frank Sorenson
@ 2018-04-08  0:17 ` OGAWA Hirofumi
  0 siblings, 0 replies; 2+ messages in thread
From: OGAWA Hirofumi @ 2018-04-08  0:17 UTC (permalink / raw)
  To: Frank Sorenson; +Cc: linux-fsdevel

Frank Sorenson <sorenson@redhat.com> writes:

> diff --git a/fs/fat/file.c b/fs/fat/file.c
> index 63ec4a5bde77..b5495df1879b 100644
> --- a/fs/fat/file.c
> +++ b/fs/fat/file.c
> @@ -63,7 +63,8 @@ static int fat_ioctl_set_attributes(struct file *file, u32 __user *user_attr)
>  
>  	/* Equivalent to a chmod() */
>  	ia.ia_valid = ATTR_MODE | ATTR_CTIME;
> -	ia.ia_ctime = current_time(inode);
> +	fat_update_time(inode, NULL, S_CTIME);
> +	ia.ia_ctime = inode->i_ctime;

This should not change inode->i_ctime before finishing all input validation.

>  	setattr_copy(inode, attr);
> +	fat_update_time(inode, &inode->i_mtime, S_MTIME);
> +	fat_update_time(inode, &inode->i_ctime, S_CTIME);
> +	fat_update_time(inode, &inode->i_atime, S_ATIME);

We probably should use timespec_trunc() for attr.ia_[acm]time
instead. In theory, temporary change to inode->i_[acm]time is visible to
user space.

Thanks.
-- 
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-04-08  0:17 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-04  2:37 [PATCH V2 2/2] fat: change timestamp updates to use fat_update_time Frank Sorenson
2018-04-08  0:17 ` OGAWA Hirofumi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).