From c1c696460b74fa3dd381f3903ec0281f6f1865a9 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 25 Oct 2004 01:29:31 +0000 Subject: r3174: added pvfs_is_open() to allow us to check for open files on unlink. We now pass BASE-UNLINK. (This used to be commit f23a2f8538bda8f6790e86c93ee22436388b2975) --- source4/ntvfs/common/opendb.c | 20 ++++++++++++++++++++ source4/ntvfs/posix/pvfs_open.c | 17 +++++++++++++++++ source4/ntvfs/posix/pvfs_unlink.c | 4 ++++ 3 files changed, 41 insertions(+) diff --git a/source4/ntvfs/common/opendb.c b/source4/ntvfs/common/opendb.c index 3def23f190..5c962fbad0 100644 --- a/source4/ntvfs/common/opendb.c +++ b/source4/ntvfs/common/opendb.c @@ -335,3 +335,23 @@ NTSTATUS odb_set_create_options(struct odb_lock *lck, return status; } + + +/* + determine if a file is open +*/ +BOOL odb_is_open(struct odb_context *odb, DATA_BLOB *key) +{ + TDB_DATA dbuf; + TDB_DATA kbuf; + + kbuf.dptr = key->data; + kbuf.dsize = key->length; + + dbuf = tdb_fetch(odb->w->tdb, kbuf); + if (dbuf.dptr == NULL) { + return False; + } + free(dbuf.dptr); + return True; +} diff --git a/source4/ntvfs/posix/pvfs_open.c b/source4/ntvfs/posix/pvfs_open.c index e587ebbf95..7f06626706 100644 --- a/source4/ntvfs/posix/pvfs_open.c +++ b/source4/ntvfs/posix/pvfs_open.c @@ -703,3 +703,20 @@ NTSTATUS pvfs_change_create_options(struct pvfs_state *pvfs, return status; } + + +/* + determine if a file is open - used to prevent some operations on open files +*/ +BOOL pvfs_is_open(struct pvfs_state *pvfs, struct pvfs_filename *name) +{ + NTSTATUS status; + DATA_BLOB key; + + status = pvfs_locking_key(name, name, &key); + if (!NT_STATUS_IS_OK(status)) { + return False; + } + + return odb_is_open(pvfs->odb_context, &key); +} diff --git a/source4/ntvfs/posix/pvfs_unlink.c b/source4/ntvfs/posix/pvfs_unlink.c index 0f4ff8b148..d5e25b5622 100644 --- a/source4/ntvfs/posix/pvfs_unlink.c +++ b/source4/ntvfs/posix/pvfs_unlink.c @@ -80,6 +80,10 @@ NTSTATUS pvfs_unlink(struct ntvfs_module_context *ntvfs, return NT_STATUS_OBJECT_NAME_NOT_FOUND; } + if (pvfs_is_open(pvfs, name)) { + return NT_STATUS_SHARING_VIOLATION; + } + dir = talloc_p(req, struct pvfs_dir); if (dir == NULL) { return NT_STATUS_NO_MEMORY; -- cgit