]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
Move the set_write_time() call to after get_existing_share_mode_lock() returns with...
authorJeremy Allison <jra@samba.org>
Sat, 19 May 2012 02:29:36 +0000 (19:29 -0700)
committerJeremy Allison <jra@samba.org>
Sat, 19 May 2012 04:26:33 +0000 (06:26 +0200)
get_existing_share_mode_lock() isn't really the right
call here, as we're being called after
close_remove_share_mode() inside close_normal_file()
so it's quite normal to not have an existing share
mode here. However, get_share_mode_lock() doesn't
work because that will create a new share mode if
one doesn't exist - so stick with this call (just
ignore any error we get if the share mode doesn't
exist.

The previous commit raised the error message debug
level inside get_share_mode_lock_internal() so
we don't always get a level 1 error message if
get_existing_share_mode_lock() fails.

Autobuild-User: Jeremy Allison <jra@samba.org>
Autobuild-Date: Sat May 19 06:26:33 CEST 2012 on sn-devel-104

source3/smbd/close.c

index c87b1a000be41b4d022d6732390147e46e2182b6..ede7925fc030f7f7589437dee6f85da9204703b8 100644 (file)
@@ -616,12 +616,24 @@ 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);
+       /*
+        * get_existing_share_mode_lock() isn't really the right
+        * call here, as we're being called after
+        * close_remove_share_mode() inside close_normal_file()
+        * so it's quite normal to not have an existing share
+        * mode here. However, get_share_mode_lock() doesn't
+        * work because that will create a new share mode if
+        * one doesn't exist - so stick with this call (just
+        * ignore any error we get if the share mode doesn't
+        * exist.
+        */
 
        lck = get_existing_share_mode_lock(talloc_tos(), fsp->file_id);
        if (lck) {
+               /* 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);
+
                /* Close write times overwrite sticky write times
                   so we must replace any sticky write time here. */
                if (!null_timespec(lck->data->changed_write_time)) {