s3:locking: add mark_share_mode_disconnected()
authorStefan Metzmacher <metze@samba.org>
Fri, 3 Aug 2012 14:31:32 +0000 (16:31 +0200)
committerStefan Metzmacher <metze@samba.org>
Sat, 8 Sep 2012 01:39:06 +0000 (03:39 +0200)
Pair-Programmed-With: Michael Adam <obnox@samba.org>

source3/locking/locking.c
source3/locking/proto.h

index d3ab7f314087e28be381b92c3e7e5399df5e3171..a7fc50c5a985f89c45c49754ba71ef291a518990 100644 (file)
@@ -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)
 {
index 74cf32379f4bc717594015f491fa49d1970e749d..41c5a856967b187e33b88604bf17f4bcc7af0e92 100644 (file)
@@ -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);