X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fautochanger.c;h=b63a585b18df2dcea3d5559584a97ed5042eb5b0;hb=c79c1f5ae10408debf2f3f26361df38100bc025e;hp=b01f4cfd529f244acd035241261e9b740ce0d373;hpb=4c20736485ff269f0cfd6976570787dcf2c9f733;p=bacula%2Fbacula diff --git a/bacula/src/stored/autochanger.c b/bacula/src/stored/autochanger.c index b01f4cfd52..b63a585b18 100644 --- a/bacula/src/stored/autochanger.c +++ b/bacula/src/stored/autochanger.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2002-2010 Free Software Foundation Europe e.V. + Copyright (C) 2002-2011 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -321,8 +321,13 @@ static void lock_changer(DCR *dcr) { AUTOCHANGER *changer_res = dcr->device->changer_res; if (changer_res) { + int errstat; Dmsg1(200, "Locking changer %s\n", changer_res->hdr.name); - P(changer_res->changer_mutex); /* Lock changer script */ + if ((errstat=rwl_writelock(&changer_res->changer_lock)) != 0) { + berrno be; + Jmsg(dcr->jcr, M_ERROR_TERM, 0, _("Lock failure on autochanger. ERR=%s\n"), + be.bstrerror(errstat)); + } } } @@ -330,8 +335,13 @@ static void unlock_changer(DCR *dcr) { AUTOCHANGER *changer_res = dcr->device->changer_res; if (changer_res) { + int errstat; Dmsg1(200, "Unlocking changer %s\n", changer_res->hdr.name); - V(changer_res->changer_mutex); /* Unlock changer script */ + if ((errstat=rwl_writeunlock(&changer_res->changer_lock)) != 0) { + berrno be; + Jmsg(dcr->jcr, M_ERROR_TERM, 0, _("Unlock failure on autochanger. ERR=%s\n"), + be.bstrerror(errstat)); + } } } @@ -364,6 +374,7 @@ bool unload_autochanger(DCR *dcr, int loaded) return true; } + lock_changer(dcr); if (loaded < 0) { loaded = get_autochanger_loaded_slot(dcr); } @@ -371,7 +382,6 @@ bool unload_autochanger(DCR *dcr, int loaded) if (loaded > 0) { POOL_MEM results(PM_MESSAGE); POOLMEM *changer = get_pool_memory(PM_FNAME); - lock_changer(dcr); Jmsg(jcr, M_INFO, 0, _("3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n"), loaded, dev->drive_index); @@ -394,11 +404,11 @@ bool unload_autochanger(DCR *dcr, int loaded) } else { dev->set_slot(0); /* nothing loaded */ } - unlock_changer(dcr); free_volume(dev); /* Free any volume associated with this drive */ free_pool_memory(changer); } + unlock_changer(dcr); if (ok) { dev->clear_unload(); } @@ -546,7 +556,6 @@ bool autochanger_cmd(DCR *dcr, BSOCK *dir, const char *cmd) POOLMEM *changer; BPIPE *bpipe; int len = sizeof_pool_memory(dir->msg) - 1; - bool ok = false; int stat; if (!dev->is_autochanger() || !dcr->device->changer_name || @@ -579,7 +588,7 @@ bool autochanger_cmd(DCR *dcr, BSOCK *dir, const char *cmd) bpipe = open_bpipe(changer, timeout, "r"); if (!bpipe) { dir->fsend(_("3996 Open bpipe failed.\n")); - goto bail_out; + goto bail_out; /* TODO: check if we need to return false */ } if (bstrcmp(cmd, "list") || bstrcmp(cmd, "listall")) { /* Get output from changer */ @@ -608,7 +617,6 @@ bool autochanger_cmd(DCR *dcr, BSOCK *dir, const char *cmd) dir->fsend(_("Autochanger error: ERR=%s\n"), be.bstrerror()); } bnet_sig(dir, BNET_EOD); - ok = true; bail_out: unlock_changer(dcr);