diff options
author | Niels de Vos <ndevos@redhat.com> | 2014-01-10 16:26:18 +0100 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2014-01-15 21:31:30 +0100 |
commit | 276c1616cf06741b69e06519ea61c874a686c716 (patch) | |
tree | c11867a873a0244d6ec22069932a6646b1e85416 /source3/modules | |
parent | 0f9a189e36d8e30dfd40e42130329a0984938ddd (diff) | |
download | samba-276c1616cf06741b69e06519ea61c874a686c716.tar.gz |
vfs/glusterfs: in case atime is not passed, set it to the current atime
The Linux CIFS client does not pass an updated atime when a write() is
done. This causes the vfs/glusterfs module to set the atime to -1 on the
Gluster backend, resulting in an atime far in the future (year 2106).
Signed-off-by: Niels de Vos <ndevos@redhat.com>
Reviewed-by: Ira Cooper <ira@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Wed Jan 15 21:31:30 CET 2014 on sn-devel-104
Diffstat (limited to 'source3/modules')
-rw-r--r-- | source3/modules/vfs_glusterfs.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c index 3262f119921..9bcd0cb67b8 100644 --- a/source3/modules/vfs_glusterfs.c +++ b/source3/modules/vfs_glusterfs.c @@ -734,10 +734,28 @@ static int vfs_gluster_ntimes(struct vfs_handle_struct *handle, { struct timespec times[2]; - times[0].tv_sec = ft->atime.tv_sec; - times[0].tv_nsec = ft->atime.tv_nsec; - times[1].tv_sec = ft->mtime.tv_sec; - times[1].tv_nsec = ft->mtime.tv_nsec; + if (null_timespec(ft->atime)) { + times[0].tv_sec = smb_fname->st.st_ex_atime.tv_sec; + times[0].tv_nsec = smb_fname->st.st_ex_atime.tv_nsec; + } else { + times[0].tv_sec = ft->atime.tv_sec; + times[0].tv_nsec = ft->atime.tv_nsec; + } + + if (null_timespec(ft->mtime)) { + times[1].tv_sec = smb_fname->st.st_ex_mtime.tv_sec; + times[1].tv_nsec = smb_fname->st.st_ex_mtime.tv_nsec; + } else { + times[1].tv_sec = ft->mtime.tv_sec; + times[1].tv_nsec = ft->mtime.tv_nsec; + } + + if ((timespec_compare(×[0], + &smb_fname->st.st_ex_atime) == 0) && + (timespec_compare(×[1], + &smb_fname->st.st_ex_mtime) == 0)) { + return 0; + } return glfs_utimens(handle->data, smb_fname->base_name, times); } |