From mboxrd@z Thu Jan 1 00:00:00 1970 From: teigland@sourceware.org Date: 8 Aug 2006 19:37:33 -0000 Subject: [Cluster-devel] cluster/group/gfs_controld plock.c Message-ID: <20060808193733.21539.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Changes by: teigland at sourceware.org 2006-08-08 19:37:33 Modified files: group/gfs_controld: plock.c Log message: if a node has a saved ckpt when it unmounts, it needs to unlink it so another node can create a new ckpt for the next mounter Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/gfs_controld/plock.c.diff?cvsroot=cluster&r1=1.9&r2=1.10 --- cluster/group/gfs_controld/plock.c 2006/08/08 18:43:25 1.9 +++ cluster/group/gfs_controld/plock.c 2006/08/08 19:37:33 1.10 @@ -942,43 +942,6 @@ } } -void purge_plocks(struct mountgroup *mg, int nodeid, int unmount) -{ - struct posix_lock *po, *po2; - struct lock_waiter *w, *w2; - struct resource *r, *r2; - int purged = 0; - - list_for_each_entry_safe(r, r2, &mg->resources, list) { - list_for_each_entry_safe(po, po2, &r->locks, list) { - if (po->nodeid == nodeid || unmount) { - list_del(&po->list); - free(po); - purged++; - } - } - - list_for_each_entry_safe(w, w2, &r->waiters, list) { - if (w->info.nodeid == nodeid || unmount) { - list_del(&w->list); - free(w); - purged++; - } - } - - if (list_empty(&r->locks) && list_empty(&r->waiters)) { - list_del(&r->list); - free(r); - } else - do_waiters(mg, r); - } - - if (purged) - mg->last_plock_time = time(NULL); - - log_group(mg, "purged %d plocks for %d", purged, nodeid); -} - void plock_exit(void) { if (plocks_online) @@ -1260,6 +1223,13 @@ sleep(1); goto create_retry; } + if (rv == SA_AIS_ERR_EXIST) { + /* this shouldn't happen in general */ + log_group(mg, "store_plocks: clearing old ckpt"); + saCkptCheckpointClose(h); + unlink_checkpoint(mg, &name); + goto open_retry; + } if (rv != SA_AIS_OK) { log_error("store_plocks: ckpt section create err %d %s", rv, mg->name); @@ -1369,6 +1339,55 @@ saCkptCheckpointClose(h); } +void purge_plocks(struct mountgroup *mg, int nodeid, int unmount) +{ + struct posix_lock *po, *po2; + struct lock_waiter *w, *w2; + struct resource *r, *r2; + int len, purged = 0; + SaNameT name; + + list_for_each_entry_safe(r, r2, &mg->resources, list) { + list_for_each_entry_safe(po, po2, &r->locks, list) { + if (po->nodeid == nodeid || unmount) { + list_del(&po->list); + free(po); + purged++; + } + } + + list_for_each_entry_safe(w, w2, &r->waiters, list) { + if (w->info.nodeid == nodeid || unmount) { + list_del(&w->list); + free(w); + purged++; + } + } + + if (list_empty(&r->locks) && list_empty(&r->waiters)) { + list_del(&r->list); + free(r); + } else + do_waiters(mg, r); + } + + if (purged) + mg->last_plock_time = time(NULL); + + log_group(mg, "purged %d plocks for %d", purged, nodeid); + + /* we may have a saved ckpt that we created for the last mounter, + we need to unlink it so another node can create a new ckpt for + the next mounter after we leave */ + + if (unmount && mg->cp_handle) { + len = snprintf(name.value, SA_MAX_NAME_LENGTH, + "gfsplock.%s", mg->name); + name.length = len; + unlink_checkpoint(mg, &name); + } +} + int dump_plocks(char *name, int fd) { struct mountgroup *mg;