diff options
-rw-r--r-- | source3/locking/locking.c | 38 | ||||
-rw-r--r-- | source3/locking/proto.h | 2 |
2 files changed, 40 insertions, 0 deletions
diff --git a/source3/locking/locking.c b/source3/locking/locking.c index d3ab7f3140..a7fc50c5a9 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 74cf32379f..41c5a85696 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); |