diff options
author | Volker Lendecke <vl@samba.org> | 2012-05-07 12:57:07 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2012-05-17 13:17:21 -0700 |
commit | f45966d16919481e3caa1f723c244269da21a28f (patch) | |
tree | 4a08b65331a94d061b447fdbf58eee39258805bf | |
parent | 918eb3ecc53e0033f119640959803155b0a6af02 (diff) | |
download | samba-f45966d16919481e3caa1f723c244269da21a28f.tar.gz samba-f45966d16919481e3caa1f723c244269da21a28f.tar.bz2 samba-f45966d16919481e3caa1f723c244269da21a28f.zip |
s3: Add "share_mode_stale_server"
This is a helper routine that prunes a dead share mode entry on demand. This
prepares for removing the serverids_exist call in parse_share_modes.
Signed-off-by: Jeremy Allison <jra@samba.org>
-rw-r--r-- | source3/locking/locking.c | 32 | ||||
-rw-r--r-- | source3/locking/proto.h | 1 |
2 files changed, 33 insertions, 0 deletions
diff --git a/source3/locking/locking.c b/source3/locking/locking.c index b9afd2392c..df21104028 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -625,6 +625,38 @@ bool is_deferred_open_entry(const struct share_mode_entry *e) return (e->op_type == DEFERRED_OPEN_ENTRY); } +/* + * In case d->share_modes[i] conflicts with something or otherwise is + * being used, we need to make sure the corresponding process still + * exists. This routine checks it and potentially removes the entry + * from d->share_modes. Modifies d->num_share_modes, watch out in + * routines iterating over that array. + */ +bool share_mode_stale_pid(struct share_mode_data *d, unsigned i) +{ + struct share_mode_entry *e; + + if (i > d->num_share_modes) { + DEBUG(1, ("Asking for index %u, only %u around\n", + i, (unsigned)d->num_share_modes)); + return false; + } + e = &d->share_modes[i]; + if (serverid_exists(&e->pid)) { + DEBUG(10, ("PID %s (index %u out of %u) still exists\n", + procid_str_static(&e->pid), i, + (unsigned)d->num_share_modes)); + return false; + } + DEBUG(10, ("PID %s (index %u out of %u) does not exist anymore\n", + procid_str_static(&e->pid), i, + (unsigned)d->num_share_modes)); + *e = d->share_modes[d->num_share_modes-1]; + d->num_share_modes -= 1; + d->modified = true; + return true; +} + /******************************************************************* Fill a share mode entry. ********************************************************************/ diff --git a/source3/locking/proto.h b/source3/locking/proto.h index 54badd9149..f6a6f2ee12 100644 --- a/source3/locking/proto.h +++ b/source3/locking/proto.h @@ -168,6 +168,7 @@ void get_file_infos(struct file_id id, struct timespec *write_time); bool is_valid_share_mode_entry(const struct share_mode_entry *e); bool is_deferred_open_entry(const struct share_mode_entry *e); +bool share_mode_stale_pid(struct share_mode_data *d, unsigned i); void set_share_mode(struct share_mode_lock *lck, files_struct *fsp, uid_t uid, uint64_t mid, uint16 op_type); void add_deferred_open(struct share_mode_lock *lck, uint64_t mid, |