r23017: fixed the warning we have been getting for a long time:
authorAndrew Tridgell <tridge@samba.org>
Sun, 20 May 2007 08:01:02 +0000 (08:01 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:52:39 +0000 (14:52 -0500)
   pvfs_close: failed to delete XXX
during the BASE-DELETE test. It was a real bug, and could result in a
delete on close triggering for a handle that had never fully opened.
(This used to be commit 398c3724b4cd8c8073c8a77f8b0568d6b3ce1e7d)

source4/ntvfs/posix/pvfs_open.c
source4/ntvfs/posix/vfs_posix.h

index a0ef77b0ffd9fddbf81483237af338c0547aacca..b737fa328a37798c15fa747713b1d2f18dce3619 100644 (file)
@@ -270,6 +270,7 @@ static NTSTATUS pvfs_open_directory(struct pvfs_state *pvfs,
        f->handle->position          = 0;
        f->handle->mode              = 0;
        f->handle->sticky_write_time = False;
+       f->handle->open_completed    = False;
 
        if ((create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE) &&
            pvfs_directory_empty(pvfs, f->handle->name)) {
@@ -379,6 +380,8 @@ static NTSTATUS pvfs_open_directory(struct pvfs_state *pvfs,
                goto cleanup_delete;
        }
 
+       f->handle->open_completed = True;
+
        io->generic.out.oplock_level  = OPLOCK_NONE;
        io->generic.out.file.ntvfs    = h;
        io->generic.out.create_action = create_action;
@@ -437,6 +440,7 @@ static int pvfs_handle_destructor(struct pvfs_file_handle *h)
        }
 
        if (h->name->stream_name == NULL && 
+           h->open_completed &&
            pvfs_delete_on_close_set(h->pvfs, h, &open_count, &path) &&
            open_count == 1) {
                NTSTATUS status;
@@ -701,6 +705,7 @@ static NTSTATUS pvfs_create_file(struct pvfs_state *pvfs,
        f->handle->mode              = 0;
        f->handle->have_opendb_entry = True;
        f->handle->sticky_write_time = False;
+       f->handle->open_completed    = False;
 
        DLIST_ADD(pvfs->files.list, f);
 
@@ -729,6 +734,8 @@ static NTSTATUS pvfs_create_file(struct pvfs_state *pvfs,
                goto cleanup_delete;
        }
 
+       f->handle->open_completed = True;
+
        notify_trigger(pvfs->notify_context, 
                       NOTIFY_ACTION_ADDED, 
                       FILE_NOTIFY_CHANGE_FILE_NAME,
@@ -1129,6 +1136,7 @@ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs,
        f->handle->mode              = 0;
        f->handle->have_opendb_entry = False;
        f->handle->sticky_write_time = False;
+       f->handle->open_completed    = False;
 
        /* form the lock context used for byte range locking and
           opendb locking */
@@ -1264,6 +1272,10 @@ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs,
        status = ntvfs_handle_set_backend_data(h, ntvfs, f);
        NT_STATUS_NOT_OK_RETURN(status);
 
+       /* mark the open as having completed fully, so delete on close
+          can now be used */
+       f->handle->open_completed     = True;
+
        io->generic.out.oplock_level  = oplock_granted;
        io->generic.out.file.ntvfs    = h;
        io->generic.out.create_action = stream_existed?
index e79eadd03a0db96bbee8bb433f669197506fe843..cff0206f61e6cd765f2b31c3ddefee7946347228 100644 (file)
@@ -150,6 +150,9 @@ struct pvfs_file_handle {
 
        /* have we set a sticky write time that we should remove on close */
        BOOL sticky_write_time;
+
+       /* the open went through to completion */
+       BOOL open_completed;
 };
 
 /* open file state */