From a440b44f1f06b9a1cf6ca38170ff2057e9ef4911 Mon Sep 17 00:00:00 2001 From: Steven Murray <Steven.Murray@cern.ch> Date: Wed, 25 Mar 2015 11:58:44 +0100 Subject: [PATCH] CASTOR-4973 smc core dumps when ran against version 1.5.2-1 of mhvtl Fixed. --- mediachanger/castorrmc/h/rmc_smcsubr.h | 2 +- mediachanger/castorrmc/rmc/rmc_procreq.c | 2 +- mediachanger/castorrmc/rmc/rmc_smcsubr.c | 141 ++++++++++++----------- 3 files changed, 78 insertions(+), 67 deletions(-) diff --git a/mediachanger/castorrmc/h/rmc_smcsubr.h b/mediachanger/castorrmc/h/rmc_smcsubr.h index 817664bbb3..bed55dcdad 100644 --- a/mediachanger/castorrmc/h/rmc_smcsubr.h +++ b/mediachanger/castorrmc/h/rmc_smcsubr.h @@ -39,7 +39,7 @@ EXTERN_C int smc_read_elem_status( const int nbelem, struct smc_element_info element_info[]); -EXTERN_C int smc_find_cartridge2 ( +EXTERN_C int smc_find_cartridgeWithoutSendVolumeTag ( const int fd, const char *const rbtdev, const char *const find_template, diff --git a/mediachanger/castorrmc/rmc/rmc_procreq.c b/mediachanger/castorrmc/rmc/rmc_procreq.c index b179913415..5002d2cf11 100644 --- a/mediachanger/castorrmc/rmc/rmc_procreq.c +++ b/mediachanger/castorrmc/rmc/rmc_procreq.c @@ -136,7 +136,7 @@ int rmc_srv_findcart(const struct rmc_srv_rqst_context *const rqst_context) { extended_robot_info.smc_ldr, template, type, startaddr, nbelem, element_info); else - c = smc_find_cartridge2 (extended_robot_info.smc_fd, + c = smc_find_cartridgeWithoutSendVolumeTag (extended_robot_info.smc_fd, extended_robot_info.smc_ldr, template, type, startaddr, nbelem, element_info); if (c < 0) { diff --git a/mediachanger/castorrmc/rmc/rmc_smcsubr.c b/mediachanger/castorrmc/rmc/rmc_smcsubr.c index 533b863dc5..18d98ceba4 100644 --- a/mediachanger/castorrmc/rmc/rmc_smcsubr.c +++ b/mediachanger/castorrmc/rmc/rmc_smcsubr.c @@ -342,16 +342,14 @@ int smc_read_elem_status( struct smc_element_info element_info[]) { char func[16]; - int rc; strncpy(func, "read_elem_statu", sizeof(func)); func[sizeof(func) - 1] = '\0'; - rc = get_element_info (0xB8, fd, rbtdev, type, start, nbelem, element_info); - return (rc); + return get_element_info (0xB8, fd, rbtdev, type, start, nbelem, element_info); } -int smc_find_cartridge2 ( +int smc_find_cartridgeWithoutSendVolumeTag ( const int fd, const char *const rbtdev, const char *const find_template, @@ -360,23 +358,26 @@ int smc_find_cartridge2 ( const int nbelem, struct smc_element_info element_info[]) { - int c; static char err_msgbuf[132]; - int found; + int nbFound = 0; char func[16]; int i; struct smc_element_info *inventory_info; char *msgaddr; - int pm = 0; + const int patternMatching = strchr (find_template, '*') || strchr (find_template, '?'); struct robot_info robot_info; - int tot_nbelem; + int tot_nbelem = 0; + int nbElementsInReport = 0; - (void)nbelem; - strncpy(func, "find_cartridge2", sizeof(func)); + strncpy(func, "findWithoutVT", sizeof(func)); func[sizeof(func) - 1] = '\0'; - if ((c = smc_get_geometry (fd, rbtdev, &robot_info))) - return (c); + { + const int smc_get_geometry_rc = smc_get_geometry (fd, rbtdev, &robot_info); + if(smc_get_geometry_rc) { + return smc_get_geometry_rc; + } + } tot_nbelem = robot_info.transport_count + robot_info.slot_count + robot_info.port_count + robot_info.device_count; @@ -389,32 +390,31 @@ int smc_find_cartridge2 ( return (-1); } - if ((c = smc_read_elem_status (fd, rbtdev, type, start, tot_nbelem, inventory_info)) < 0) { + nbElementsInReport = smc_read_elem_status (fd, rbtdev, type, start, tot_nbelem, inventory_info); + if(0 > nbElementsInReport) { free (inventory_info); - return (c); + return (nbElementsInReport); } - found = 0; - if (strchr (find_template, '*') || strchr (find_template, '?')) /* pattern matching */ - pm++; - for (i = 0 ; i < tot_nbelem ; i++) + for (i = 0 ; i < nbElementsInReport && nbFound < nbelem; i++) { if (inventory_info[i].state & 0x1) { - if (! pm) { - if (strcmp (find_template, inventory_info[i].name) == 0) { - memcpy (element_info, &inventory_info[i], + if (patternMatching) { + if (vmatch (find_template, inventory_info[i].name) == 0) { + memcpy (&element_info[nbFound], &inventory_info[i], sizeof(struct smc_element_info)); - found++; - break; + nbFound++; } } else { - if (vmatch (find_template, inventory_info[i].name) == 0) { - memcpy (&element_info[found], &inventory_info[i], + if (strcmp (find_template, inventory_info[i].name) == 0) { + memcpy (element_info, &inventory_info[i], sizeof(struct smc_element_info)); - found++; + nbFound = 1; + break; } } } + } free (inventory_info); - return (found); + return (nbFound); } @@ -438,7 +438,7 @@ int smc_find_cartridge( int nretries = 0; char *smcLibraryType; - strncpy(func, "find_cartridge", sizeof(func)); + strncpy(func, "findWithVT", sizeof(func)); func[sizeof(func) - 1] = '\0'; /* for Spectra like library we will skip 0xB6 cdb command as soon as @@ -446,7 +446,7 @@ int smc_find_cartridge( smcLibraryType = getconfent("SMC","LIBRARY_TYPE",0); if (NULL != smcLibraryType && 0 == strcasecmp(smcLibraryType,"SPECTRA")) { - rc = smc_find_cartridge2 (fd, rbtdev, find_template, type, start, nbelem, + rc = smc_find_cartridgeWithoutSendVolumeTag (fd, rbtdev, find_template, type, start, nbelem, element_info); if (rc >= 0) return (rc); @@ -483,15 +483,14 @@ int smc_find_cartridge( if (rc < 0) { save_error (rc, nb_sense_ret, sense, msgaddr); if (rc == -4 && nb_sense_ret >= 14 && (sense[2] & 0xF) == 5) { - rc = smc_find_cartridge2 (fd, rbtdev, find_template, type, + rc = smc_find_cartridgeWithoutSendVolumeTag (fd, rbtdev, find_template, type, start, nbelem, element_info); if (rc >= 0) return (rc); } return (-1); } - rc = get_element_info (0xB5, fd, rbtdev, type, start, nbelem, element_info); - return (rc); + return get_element_info (0xB5, fd, rbtdev, type, start, nbelem, element_info); } @@ -769,26 +768,28 @@ int smc_export ( struct robot_info *const robot_info, const char *const vid) { - int c; struct smc_element_info element_info; char func[16]; - int i; + int i = 0; struct smc_element_info *impexp_info; - const char *msgaddr; - int nbelem; + const char *msgaddr = NULL; + int nbelem = 0; struct smc_status smc_status; strncpy (func, "smc_export", sizeof(func)); func[sizeof(func) - 1] = '\0'; - if ((c = smc_find_cartridge (fd, loader, vid, 0, 0, 1, &element_info)) < 0) { - c = smc_lasterror (&smc_status, &msgaddr); - rmc_usrmsg ( rpfd, func, SR017, "find_cartridge", vid, msgaddr); - return (c); - } - if (c == 0) { - rmc_usrmsg ( rpfd, func, SR017, "export", vid, "volume not in library"); - return (RBT_NORETRY); + { + const int smc_find_cartridge_rc = smc_find_cartridge (fd, loader, vid, 0, 0, 1, &element_info); + if (0 > smc_find_cartridge_rc) { + const int smc_lasterror_rc = smc_lasterror (&smc_status, &msgaddr); + rmc_usrmsg ( rpfd, func, SR017, "find_cartridge", vid, msgaddr); + return (smc_lasterror_rc); + } + if (0 == smc_find_cartridge_rc) { + rmc_usrmsg ( rpfd, func, SR017, "export", vid, "volume not in library"); + return (RBT_NORETRY); + } } if (element_info.element_type != 2) { rmc_usrmsg ( rpfd, func, SR017, "export", vid, "volume in use"); @@ -802,30 +803,40 @@ int smc_export ( return (RBT_NORETRY); } - if ((c = smc_read_elem_status (fd, loader, 3, robot_info->port_start, - nbelem, impexp_info)) < 0) { - c = smc_lasterror (&smc_status, &msgaddr); - rmc_usrmsg ( rpfd, func, SR020, "read_elem_status", msgaddr); - free (impexp_info); - return (c); - } - for (i = 0; i < nbelem; i++) { - if (((impexp_info+i)->state & 0x1) == 0) /* element free */ - break; - } - if (i >= nbelem) { /* export slots are full */ - rmc_usrmsg ( rpfd, func, SR013); - free (impexp_info); - return (RBT_NORETRY); + { + int foundAFreeExportSlot = 0; + const int nbElementsInReport = smc_read_elem_status (fd, loader, 3, robot_info->port_start, + nbelem, impexp_info); + if (0 > nbElementsInReport) { + const int smc_lasterror_rc = smc_lasterror (&smc_status, &msgaddr); + rmc_usrmsg ( rpfd, func, SR020, "read_elem_status", msgaddr); + free (impexp_info); + return (smc_lasterror_rc); + } + for (i = 0; i < nbElementsInReport; i++) { + if (((impexp_info+i)->state & 0x1) == 0) { + foundAFreeExportSlot = 1; + break; + } + } + if (!foundAFreeExportSlot) { + rmc_usrmsg ( rpfd, func, SR013); + free (impexp_info); + return (RBT_NORETRY); + } } - if ((c = smc_move_medium (fd, loader, element_info.element_address, - (impexp_info+i)->element_address, 0)) < 0) { - c = smc_lasterror (&smc_status, &msgaddr); - rmc_usrmsg ( rpfd, func, SR017, "export", vid, msgaddr); - free (impexp_info); - return (c); + { + const int smc_move_medium_rc = smc_move_medium (fd, loader, element_info.element_address, + (impexp_info+i)->element_address, 0); + if (0 > smc_move_medium_rc) { + const int smc_lasterror_rc = smc_lasterror (&smc_status, &msgaddr); + rmc_usrmsg ( rpfd, func, SR017, "export", vid, msgaddr); + free (impexp_info); + return (smc_lasterror_rc); + } } + free (impexp_info); return (0); } -- GitLab