diff options
author | Niels de Vos <ndevos@redhat.com> | 2014-01-10 16:26:18 +0100 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2014-01-17 09:16:09 +0100 |
commit | f4c8846b3ef82b286e3e71d77228b07caf3f8216 (patch) | |
tree | 3d759ddf2470bb2422655a32bc641c674a7e11dc /source3/modules | |
parent | d49d8b6dfc899c740930396ddd1964f0d9a8051c (diff) | |
download | samba-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.c | 26 |
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(×[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); } |