Revert commit "0551284dc08eb93ef7b2b2227a45e5ec21d482fb" - simplify
authorJeremy Allison <jra@samba.org>
Fri, 6 Nov 2009 05:27:25 +0000 (21:27 -0800)
committerJeremy Allison <jra@samba.org>
Fri, 6 Nov 2009 05:27:25 +0000 (21:27 -0800)
the logic. This was incorrect (I'll revisit this tomorrow).
Jeremy.

source3/include/proto.h
source3/smbd/close.c
source3/smbd/nttrans.c
source3/smbd/reply.c

index 5f275037fc118b8999190efb79b9d1198f561790..ef811e5774b7f02158aa95baa774950946015e0e 100644 (file)
@@ -6108,7 +6108,9 @@ NTSTATUS change_oem_password(struct samu *hnd, char *old_passwd, char *new_passw
 
 /* The following definitions come from smbd/close.c  */
 
-void set_close_write_time(struct files_struct *fsp, struct timespec ts);
+void set_close_write_time(struct share_mode_lock *lck,
+                       struct files_struct *fsp,
+                       struct timespec ts);
 NTSTATUS close_file(struct smb_request *req, files_struct *fsp,
                    enum file_close_type close_type);
 void msg_close_file(struct messaging_context *msg_ctx,
index 3de93b15f2213ab1331961b358f11b9dca0369c3..0f1bd90ddef10d5bca2f245ef8fb9fb0ab6c91f4 100644 (file)
@@ -294,7 +294,16 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
                DEBUG(10,("close_remove_share_mode: write time forced "
                        "for file %s\n",
                        fsp_str_dbg(fsp)));
-               set_close_write_time(fsp, lck->changed_write_time);
+               set_close_write_time(lck, fsp, lck->changed_write_time);
+       } else if (fsp->update_write_time_on_close) {
+               DEBUG(10,("close_remove_share_mode: update_write_time_on_close "
+                       "set for file %s\n",
+                       fsp_str_dbg(fsp)));
+               if (null_timespec(fsp->close_write_time)) {
+                       set_close_write_time(lck, fsp, timespec_current());
+               } else {
+                       set_close_write_time(lck, fsp, fsp->close_write_time);
+               }
        }
 
        if (!del_share_mode(lck, fsp)) {
@@ -471,15 +480,30 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
        return status;
 }
 
-void set_close_write_time(struct files_struct *fsp, struct timespec ts)
+void set_close_write_time(struct share_mode_lock *lck,
+                       struct files_struct *fsp, struct timespec ts)
 {
        DEBUG(6,("close_write_time: %s" , time_to_asc(convert_timespec_to_time_t(ts))));
 
        if (null_timespec(ts)) {
                return;
        }
+       /*
+        * if the write time on close is explict set, then don't
+        * need to fix it up to the value in the locking db
+        */
+       fsp->write_time_forced = false;
+
        fsp->update_write_time_on_close = true;
        fsp->close_write_time = ts;
+
+       /* On close if we're changing the real file time we
+        * must update it in the open file db too. */
+       (void)set_write_time(fsp->file_id, ts);
+       /* If someone has a sticky write time then update it as well. */
+       if (lck && !null_timespec(lck->changed_write_time)) {
+               (void)set_sticky_write_time(fsp->file_id, ts);
+       }
 }
 
 static NTSTATUS update_write_time_on_close(struct files_struct *fsp)
@@ -508,12 +532,8 @@ static NTSTATUS update_write_time_on_close(struct files_struct *fsp)
                return NT_STATUS_OK;
        }
 
-       /* On close if we're changing the real file time we
-        * must update it in the open file db too. */
-       (void)set_write_time(fsp->file_id, fsp->close_write_time);
-
        ft.mtime = fsp->close_write_time;
-       status = smb_set_file_time(fsp->conn, fsp, fsp->fsp_name, &ft, false);
+       status = smb_set_file_time(fsp->conn, fsp, fsp->fsp_name, &ft, true);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
index 66102fa96ccdbf90393d260dc4d6de988d5a28a1..a1e7889119ed7a9d1fee26f2aaf6696f484b888d 100644 (file)
@@ -1296,7 +1296,7 @@ static NTSTATUS copy_internals(TALLOC_CTX *ctx,
        close_file(NULL, fsp1, NORMAL_CLOSE);
 
        /* Ensure the modtime is set correctly on the destination file. */
-       set_close_write_time(fsp2, smb_fname_src->st.st_ex_mtime);
+       set_close_write_time(NULL, fsp2, smb_fname_src->st.st_ex_mtime);
 
        status = close_file(NULL, fsp2, NORMAL_CLOSE);
 
index 984cf56c11181d4777efd37905c52e04f7e3625d..37634acc2ce4b5ac35169939b796b8124dc2e87d 100644 (file)
@@ -4646,7 +4646,7 @@ void reply_close(struct smb_request *req)
                 */
 
                t = srv_make_unix_date3(req->vwv+1);
-               set_close_write_time(fsp, convert_time_t_to_timespec(t));
+               set_close_write_time(NULL, fsp, convert_time_t_to_timespec(t));
 
                /*
                 * close_file() returns the unix errno if an error
@@ -4723,7 +4723,7 @@ void reply_writeclose(struct smb_request *req)
 
        nwritten = write_file(req,fsp,data,startpos,numtowrite);
 
-       set_close_write_time(fsp, mtime);
+       set_close_write_time(NULL, fsp, mtime);
 
        /*
         * More insanity. W2K only closes the file if writelen > 0.
@@ -6691,7 +6691,7 @@ NTSTATUS copy_file(TALLOC_CTX *ctx,
        close_file(NULL, fsp1, NORMAL_CLOSE);
 
        /* Ensure the modtime is set correctly on the destination file. */
-       set_close_write_time(fsp2, smb_fname_src->st.st_ex_mtime);
+       set_close_write_time(NULL, fsp2, smb_fname_src->st.st_ex_mtime);
 
        /*
         * As we are opening fsp1 read-only we only expect