1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

pvfs_open: always call odb_can_open() before odb_open_file()

odb_open_file() will later change to not redo the logic of
odb_can_open().

metze
(This used to be commit b09a1461ac)
This commit is contained in:
Stefan Metzmacher 2008-03-07 17:50:17 +01:00
parent 6c27daeeca
commit 75a412a469

View File

@ -290,6 +290,15 @@ static NTSTATUS pvfs_open_directory(struct pvfs_state *pvfs,
}
/* see if we are allowed to open at the same time as existing opens */
status = odb_can_open(lck, name->stream_id,
share_access, access_mask, del_on_close,
io->generic.in.open_disposition, false);
if (!NT_STATUS_IS_OK(status)) {
talloc_free(lck);
return status;
}
/* now really mark the file as open */
status = odb_open_file(lck, f->handle, name->full_name, name->stream_id,
share_access, access_mask, del_on_close,
io->generic.in.open_disposition,
@ -344,6 +353,14 @@ static NTSTATUS pvfs_open_directory(struct pvfs_state *pvfs,
return NT_STATUS_INTERNAL_DB_CORRUPTION;
}
status = odb_can_open(lck, name->stream_id,
share_access, access_mask, del_on_close,
io->generic.in.open_disposition, false);
if (!NT_STATUS_IS_OK(status)) {
goto cleanup_delete;
}
status = odb_open_file(lck, f->handle, name->full_name, name->stream_id,
share_access, access_mask, del_on_close,
io->generic.in.open_disposition,
@ -663,6 +680,18 @@ static NTSTATUS pvfs_create_file(struct pvfs_state *pvfs,
allow_level_II_oplock = true;
}
status = odb_can_open(lck, name->stream_id,
share_access, access_mask, del_on_close,
io->generic.in.open_disposition, false);
if (!NT_STATUS_IS_OK(status)) {
talloc_free(lck);
/* bad news, we must have hit a race - we don't delete the file
here as the most likely scenario is that someone else created
the file at the same time */
close(fd);
return status;
}
status = odb_open_file(lck, f->handle, name->full_name, name->stream_id,
share_access, access_mask, del_on_close,
io->generic.in.open_disposition,
@ -801,7 +830,7 @@ static void pvfs_odb_retry_callback(void *_r, enum pvfs_wait_notice reason)
/*
setup for a retry of a request that was rejected
by odb_open_file() or odb_can_open()
by odb_can_open()
*/
NTSTATUS pvfs_odb_retry_setup(struct ntvfs_module_context *ntvfs,
struct ntvfs_request *req,
@ -1253,11 +1282,9 @@ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs,
}
/* see if we are allowed to open at the same time as existing opens */
status = odb_open_file(lck, f->handle, name->full_name, name->stream_id,
share_access, access_mask, del_on_close,
io->generic.in.open_disposition,
false, allow_level_II_oplock,
oplock_level, &oplock_granted);
status = odb_can_open(lck, name->stream_id,
share_access, access_mask, del_on_close,
io->generic.in.open_disposition, false);
/*
* on a sharing violation we need to retry when the file is closed by
@ -1276,6 +1303,18 @@ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs,
return status;
}
/* now really mark the file as open */
status = odb_open_file(lck, f->handle, name->full_name, name->stream_id,
share_access, access_mask, del_on_close,
io->generic.in.open_disposition,
false, allow_level_II_oplock,
oplock_level, &oplock_granted);
if (!NT_STATUS_IS_OK(status)) {
talloc_free(lck);
return status;
}
if (pvfs->flags & PVFS_FLAG_FAKE_OPLOCKS) {
oplock_granted = OPLOCK_BATCH;
} else if (oplock_granted != OPLOCK_NONE) {