Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

cifs: use 64-bit timestamps for fscache

In the fscache, we just need the timestamps as cookies to check for
changes, so we don't really care about the overflow, but it's better
to stop using the deprecated timespec so we don't have to go through
explicit conversion functions.

To avoid comparing uninitialized padding values that are copied
while assigning the timespec values, this rearranges the members of
cifs_fscache_inode_auxdata to avoid padding, and assigns them
individually.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Paulo Alcantara <palcantara@suse.de>
Signed-off-by: Steve French <stfrench@microsoft.com>

authored by

Arnd Bergmann and committed by
Steve French
cbedeadf 95390201

+17 -9
+4 -2
fs/cifs/cache.c
··· 128 128 129 129 memset(&auxdata, 0, sizeof(auxdata)); 130 130 auxdata.eof = cifsi->server_eof; 131 - auxdata.last_write_time = timespec64_to_timespec(cifsi->vfs_inode.i_mtime); 132 - auxdata.last_change_time = timespec64_to_timespec(cifsi->vfs_inode.i_ctime); 131 + auxdata.last_write_time_sec = cifsi->vfs_inode.i_mtime.tv_sec; 132 + auxdata.last_change_time_sec = cifsi->vfs_inode.i_ctime.tv_sec; 133 + auxdata.last_write_time_nsec = cifsi->vfs_inode.i_mtime.tv_nsec; 134 + auxdata.last_change_time_nsec = cifsi->vfs_inode.i_ctime.tv_nsec; 133 135 134 136 if (memcmp(data, &auxdata, datalen) != 0) 135 137 return FSCACHE_CHECKAUX_OBSOLETE;
+8 -4
fs/cifs/fscache.c
··· 129 129 130 130 memset(&auxdata, 0, sizeof(auxdata)); 131 131 auxdata.eof = cifsi->server_eof; 132 - auxdata.last_write_time = timespec64_to_timespec(cifsi->vfs_inode.i_mtime); 133 - auxdata.last_change_time = timespec64_to_timespec(cifsi->vfs_inode.i_ctime); 132 + auxdata.last_write_time_sec = cifsi->vfs_inode.i_mtime.tv_sec; 133 + auxdata.last_change_time_sec = cifsi->vfs_inode.i_ctime.tv_sec; 134 + auxdata.last_write_time_nsec = cifsi->vfs_inode.i_mtime.tv_nsec; 135 + auxdata.last_change_time_nsec = cifsi->vfs_inode.i_ctime.tv_nsec; 134 136 135 137 cifsi->fscache = 136 138 fscache_acquire_cookie(tcon->fscache, ··· 168 166 if (cifsi->fscache) { 169 167 memset(&auxdata, 0, sizeof(auxdata)); 170 168 auxdata.eof = cifsi->server_eof; 171 - auxdata.last_write_time = timespec64_to_timespec(cifsi->vfs_inode.i_mtime); 172 - auxdata.last_change_time = timespec64_to_timespec(cifsi->vfs_inode.i_ctime); 169 + auxdata.last_write_time_sec = cifsi->vfs_inode.i_mtime.tv_sec; 170 + auxdata.last_change_time_sec = cifsi->vfs_inode.i_ctime.tv_sec; 171 + auxdata.last_write_time_nsec = cifsi->vfs_inode.i_mtime.tv_nsec; 172 + auxdata.last_change_time_nsec = cifsi->vfs_inode.i_ctime.tv_nsec; 173 173 174 174 cifs_dbg(FYI, "%s: (0x%p)\n", __func__, cifsi->fscache); 175 175 fscache_relinquish_cookie(cifsi->fscache, &auxdata, false);
+5 -3
fs/cifs/fscache.h
··· 31 31 * Auxiliary data attached to CIFS inode within the cache 32 32 */ 33 33 struct cifs_fscache_inode_auxdata { 34 - struct timespec last_write_time; 35 - struct timespec last_change_time; 36 - u64 eof; 34 + u64 last_write_time_sec; 35 + u64 last_change_time_sec; 36 + u32 last_write_time_nsec; 37 + u32 last_change_time_nsec; 38 + u64 eof; 37 39 }; 38 40 39 41 /*