return ctx;
}
-static NTSTATUS g_lock_cleanup_dead(
- struct db_record *rec,
+static void g_lock_cleanup_dead(
struct g_lock *lck,
struct server_id *dead_blocker)
{
- bool modified = false;
bool exclusive_died;
- NTSTATUS status = NT_STATUS_OK;
struct server_id_buf tmp;
if (dead_blocker == NULL) {
- return NT_STATUS_OK;
+ return;
}
exclusive_died = server_id_equal(dead_blocker, &lck->exclusive);
DBG_DEBUG("Exclusive holder %s died\n",
server_id_str_buf(lck->exclusive, &tmp));
lck->exclusive.pid = 0;
- modified = true;
}
if (lck->num_shared != 0) {
DBG_DEBUG("Shared holder %s died\n",
server_id_str_buf(shared, &tmp));
g_lock_del_shared(lck, 0);
- modified = true;
- }
- }
-
- if (modified) {
- status = g_lock_store(rec, lck, NULL, NULL, 0);
- if (!NT_STATUS_IS_OK(status)) {
- DBG_DEBUG("g_lock_store() failed: %s\n",
- nt_errstr(status));
}
}
-
- return status;
}
static ssize_t g_lock_find_shared(
enum g_lock_type type = req_state->type;
bool retry = req_state->retry;
struct g_lock lck = { .exclusive.pid = 0 };
+ size_t orig_num_shared;
struct server_id_buf tmp;
NTSTATUS status;
bool ok;
DBG_DEBUG("g_lock_parse failed\n");
return NT_STATUS_INTERNAL_DB_CORRUPTION;
}
+ orig_num_shared = lck.num_shared;
- status = g_lock_cleanup_dead(rec, &lck, state->dead_blocker);
- if (!NT_STATUS_IS_OK(status)) {
- DBG_DEBUG("g_lock_cleanup_dead() failed: %s\n",
- nt_errstr(status));
- return status;
- }
+ g_lock_cleanup_dead(&lck, state->dead_blocker);
if (lck.exclusive.pid != 0) {
bool self_exclusive = server_id_equal(&self, &lck.exclusive);
return NT_STATUS_LOCK_NOT_GRANTED;
}
+ if (orig_num_shared != lck.num_shared) {
+ status = g_lock_store(rec, &lck, NULL, NULL, 0);
+ if (!NT_STATUS_IS_OK(status)) {
+ DBG_DEBUG("g_lock_store() failed: %s\n",
+ nt_errstr(status));
+ return status;
+ }
+ }
+
talloc_set_destructor(req_state, NULL);
/*