Move the checks for null timestamps down below the VFS_NTIMES
authorJeremy Allison <jra@samba.org>
Fri, 7 Aug 2009 19:38:31 +0000 (12:38 -0700)
committerJeremy Allison <jra@samba.org>
Fri, 7 Aug 2009 19:38:31 +0000 (12:38 -0700)
layer (as it's done in onefs). This simplifies greatly the
code in smb_set_file_time() w.r.t. changenotify messages.
Jeremy.

source3/modules/vfs_default.c
source3/smbd/trans2.c

index a4922e7e05301fb862411475e74fa52387d369fe..2ee2fd124997f41199c1b277697dbe28a120a50d 100644 (file)
@@ -780,6 +780,21 @@ static int vfswrap_ntimes(vfs_handle_struct *handle,
                goto out;
        }
 
+       if (null_timespec(ft->atime)) {
+               ft->atime= smb_fname->st.st_ex_atime;
+       }
+
+       if (null_timespec(ft->mtime)) {
+               ft->mtime = smb_fname->st.st_ex_mtime;
+       }
+
+       if ((timespec_compare(&ft->atime,
+                               &smb_fname->st.st_ex_atime) == 0) &&
+                       (timespec_compare(&ft->mtime,
+                               &smb_fname->st.st_ex_mtime) == 0)) {
+               return 0;
+       }
+
 #if defined(HAVE_UTIMES)
        if (ft != NULL) {
                struct timeval tv[2];
index a8b721120d82529248d6f98db5333b7be85c9664..2e47eab4f072656ed6fe8454ae8822b213b3a35c 100644 (file)
@@ -5222,8 +5222,8 @@ NTSTATUS smb_set_file_time(connection_struct *conn,
        struct smb_filename *smb_fname_base = NULL;
        uint32 action =
                FILE_NOTIFY_CHANGE_LAST_ACCESS
-               |FILE_NOTIFY_CHANGE_LAST_WRITE;
-       bool set_createtime = false;
+               |FILE_NOTIFY_CHANGE_LAST_WRITE
+               |FILE_NOTIFY_CHANGE_CREATION;
        NTSTATUS status;
 
        if (!VALID_STAT(smb_fname->st)) {
@@ -5232,22 +5232,14 @@ NTSTATUS smb_set_file_time(connection_struct *conn,
 
        /* get some defaults (no modifications) if any info is zero or -1. */
        if (null_timespec(ft->create_time)) {
-               ft->create_time = smb_fname->st.st_ex_btime;
-       } else {
-               set_createtime = true;
-       }
-
-       if (null_timespec(ft->ctime)) {
-               ft->ctime = smb_fname->st.st_ex_ctime;
+               action &= ~FILE_NOTIFY_CHANGE_CREATION;
        }
 
        if (null_timespec(ft->atime)) {
-               ft->atime= smb_fname->st.st_ex_atime;
                action &= ~FILE_NOTIFY_CHANGE_LAST_ACCESS;
        }
 
        if (null_timespec(ft->mtime)) {
-               ft->mtime = smb_fname->st.st_ex_mtime;
                action &= ~FILE_NOTIFY_CHANGE_LAST_WRITE;
        }
 
@@ -5265,25 +5257,6 @@ NTSTATUS smb_set_file_time(connection_struct *conn,
        DEBUG(5,("smb_set_file_time: createtime: %s\n ",
                time_to_asc(convert_timespec_to_time_t(ft->create_time))));
 
-       /*
-        * Try and set the times of this file if
-        * they are different from the current values.
-        */
-
-       {
-               struct timespec mts = smb_fname->st.st_ex_mtime;
-               struct timespec ats = smb_fname->st.st_ex_atime;
-               if ((timespec_compare(&ft->atime, &ats) == 0) &&
-                   (timespec_compare(&ft->mtime, &mts) == 0)) {
-                       if (set_createtime) {
-                               notify_fname(conn, NOTIFY_ACTION_MODIFIED,
-                                               FILE_NOTIFY_CHANGE_CREATION,
-                                               smb_fname->base_name);
-                       }
-                       return NT_STATUS_OK;
-               }
-       }
-
        if (setting_write_time) {
                /*
                 * This was a Windows setfileinfo on an open file.