From 9a81f8ee1713317262f3fc773dae38cb51816149 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 3 Aug 2012 16:31:32 +0200 Subject: [PATCH] s3:locking: add mark_share_mode_disconnected() Pair-Programmed-With: Michael Adam --- source3/locking/locking.c | 38 ++++++++++++++++++++++++++++++++++++++ source3/locking/proto.h | 2 ++ 2 files changed, 40 insertions(+) diff --git a/source3/locking/locking.c b/source3/locking/locking.c index d3ab7f31408..a7fc50c5a98 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -811,6 +811,44 @@ bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp) return True; } +bool mark_share_mode_disconnected(struct share_mode_lock *lck, + struct files_struct *fsp) +{ + struct share_mode_entry entry, *e; + + if (lck->data->num_share_modes != 1) { + return false; + } + + if (fsp->op == NULL) { + return false; + } + if (!fsp->op->global->durable) { + return false; + } + + /* Don't care about the pid owner being correct here - just a search. */ + fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK); + + e = find_share_mode_entry(lck->data, &entry); + if (e == NULL) { + return false; + } + + DEBUG(10, ("Marking share mode entry disconnected for durable handle\n")); + + server_id_set_disconnected(&e->pid); + + /* + * On reopen the caller needs to check that + * the client comes with the correct handle. + */ + e->share_file_id = fsp->op->global->open_persistent_id; + + lck->data->modified = true; + return true; +} + void del_deferred_open_entry(struct share_mode_lock *lck, uint64_t mid, struct server_id pid) { diff --git a/source3/locking/proto.h b/source3/locking/proto.h index 74cf32379f4..41c5a856967 100644 --- a/source3/locking/proto.h +++ b/source3/locking/proto.h @@ -175,6 +175,8 @@ void add_deferred_open(struct share_mode_lock *lck, uint64_t mid, struct timeval request_time, struct server_id pid, struct file_id id); bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp); +bool mark_share_mode_disconnected(struct share_mode_lock *lck, + struct files_struct *fsp); void del_deferred_open_entry(struct share_mode_lock *lck, uint64_t mid, struct server_id pid); bool remove_share_oplock(struct share_mode_lock *lck, files_struct *fsp); -- 2.11.4.GIT