aboutsummaryrefslogtreecommitdiff
path: root/src/os_unix.c
diff options
context:
space:
mode:
authordan <Dan Kennedy>2024-06-11 20:03:32 +0000
committerdan <Dan Kennedy>2024-06-11 20:03:32 +0000
commitf6ec2b5946cc5dd80d56e162360d54baa35812c5 (patch)
treed363b04a4768344c23506e2a60175cc782b0fb40 /src/os_unix.c
parente15d5de0a6e288dd2292b6ff3958cb4390bfe5a4 (diff)
downloadsqlite-f6ec2b5946cc5dd80d56e162360d54baa35812c5.tar.gz
sqlite-f6ec2b5946cc5dd80d56e162360d54baa35812c5.zip
Fix a problem with rolling back hot journals using the unix-dotfile VFS.
FossilOrigin-Name: 4ae3300b79e03381fd7f1033bb7978bb6367369790f17c3bdacac51e205edaf9
Diffstat (limited to 'src/os_unix.c')
-rw-r--r--src/os_unix.c25
1 files changed, 8 insertions, 17 deletions
diff --git a/src/os_unix.c b/src/os_unix.c
index c61b19060..45ba0c001 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -2279,26 +2279,17 @@ static int nolockClose(sqlite3_file *id) {
/*
** This routine checks if there is a RESERVED lock held on the specified
-** file by this or any other process. If such a lock is held, set *pResOut
-** to a non-zero value otherwise *pResOut is set to zero. The return value
-** is set to SQLITE_OK unless an I/O error occurs during lock checking.
-**
-** In dotfile locking, either a lock exists or it does not. So in this
-** variation of CheckReservedLock(), *pResOut is set to true if any lock
-** is held on the file and false if the file is unlocked.
+** file by this or any other process. The caller always holds a SHARED
+** lock when it is called. This means that no other connection could
+** hold a RESERVED lock, as unix-dotfile uses just a single exclusive lock -
+** the presence of the dotfile - for all 4 VFS locks. So this function sets
+** (*pResOut) to 0 (no other connection holds RESERVED) and returns SQLITE_OK.
*/
static int dotlockCheckReservedLock(sqlite3_file *id, int *pResOut) {
- int rc = SQLITE_OK;
- int reserved = 0;
- unixFile *pFile = (unixFile*)id;
-
SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
-
- assert( pFile );
- reserved = osAccess((const char*)pFile->lockingContext, 0)==0;
- OSTRACE(("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, rc, reserved));
- *pResOut = reserved;
- return rc;
+ assert( ((unixFile*)id)->eFileLock>=SHARED_LOCK );
+ *pResOut = 0;
+ return SQLITE_OK;
}
/*