summaryrefslogtreecommitdiff
path: root/source3/modules
diff options
context:
space:
mode:
authorNiels de Vos <ndevos@redhat.com>2014-01-10 16:26:18 +0100
committerKarolin Seeger <kseeger@samba.org>2014-01-17 09:16:09 +0100
commitf4c8846b3ef82b286e3e71d77228b07caf3f8216 (patch)
tree3d759ddf2470bb2422655a32bc641c674a7e11dc /source3/modules
parentd49d8b6dfc899c740930396ddd1964f0d9a8051c (diff)
downloadsamba-f4c8846b3ef82b286e3e71d77228b07caf3f8216.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 Fix bug #10384 - [BACKPORT REQUEST] vfs/glusterfs: in case atime is not passed, set it to the current atime.
Diffstat (limited to 'source3/modules')
-rw-r--r--source3/modules/vfs_glusterfs.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c
index 3262f11992..9bcd0cb67b 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(&times[0],
+ &smb_fname->st.st_ex_atime) == 0) &&
+ (timespec_compare(&times[1],
+ &smb_fname->st.st_ex_mtime) == 0)) {
+ return 0;
+ }
return glfs_utimens(handle->data, smb_fname->base_name, times);
}