diff options
author | David Major <David.Major@Sun.COM> | 2009-02-12 09:28:03 -0600 |
---|---|---|
committer | David Major <David.Major@Sun.COM> | 2009-02-12 09:28:03 -0600 |
commit | 0058e3a59b93851e9a8f2c2063f03c49d42a4ef2 (patch) | |
tree | 0360c91d51389b582a06040649d7d12cb9c2167c | |
parent | d5da6539351bab864692146ea0d7c5044d1333c6 (diff) | |
download | illumos-joyent-0058e3a59b93851e9a8f2c2063f03c49d42a4ef2.tar.gz |
6802124 mm locked up during mount
-rw-r--r-- | usr/src/cmd/mms/mm/common/mm.c | 13 | ||||
-rw-r--r-- | usr/src/cmd/mms/mm/common/mm.h | 4 | ||||
-rw-r--r-- | usr/src/cmd/mms/mm/common/mm_db.c | 9 | ||||
-rw-r--r-- | usr/src/cmd/mms/mm/common/mm_task.c | 12 |
4 files changed, 19 insertions, 19 deletions
diff --git a/usr/src/cmd/mms/mm/common/mm.c b/usr/src/cmd/mms/mm/common/mm.c index 724300741d..d268c7d9e9 100644 --- a/usr/src/cmd/mms/mm/common/mm.c +++ b/usr/src/cmd/mms/mm/common/mm.c @@ -1741,7 +1741,7 @@ mm_remove_commands(mm_data_t *mm_data, mm_db_t *db_main, mm_wka_t *mm_wka) { /* and reset manager states */ cur_cmd->cmd_mount_info. cmi_reset_states = 1; - (void) mm_rm_mount(cur_cmd); + (void) mm_rm_mount(cur_cmd, db_main); cur_cmd->cmd_mount_info. cmi_need_clear = 1; /* Could optimize this clear */ @@ -1760,7 +1760,7 @@ mm_remove_commands(mm_data_t *mm_data, mm_db_t *db_main, mm_wka_t *mm_wka) { mms_trace(MMS_DEVP, "client has an outstanding " "unmount command"); - (void) mm_rm_unmount(cur_cmd); + (void) mm_rm_unmount(cur_cmd, db_main); cur_cmd->cmd_mount_info. cmi_need_clear = 1; cur_cmd->cmd_mount_info. @@ -3414,6 +3414,8 @@ mm_cmd_dispatch(mm_command_t *cmd) * * Parameters: * - cmd : ptr to mm_command_t + * - db : ptr to valid db connection, mm_db_t + * * * Do additional steps to clean up when the command * being removed is an unmount command @@ -3427,8 +3429,7 @@ mm_cmd_dispatch(mm_command_t *cmd) * */ int -mm_rm_unmount(mm_command_t *cmd) { - mm_db_t *db = &cmd->cmd_mm_data->mm_db_main; +mm_rm_unmount(mm_command_t *cmd, mm_db_t *db) { PGresult *drive_results; mm_command_t *cur_cmd; @@ -3496,6 +3497,7 @@ mm_rm_unmount(mm_command_t *cmd) { * * Parameters: * - cmd : ptr to mm_command_t + * - db : ptr to valid db connection, mm_db_t * * Do additional steps to clean up when the command * being removed is a mount command @@ -3509,13 +3511,12 @@ mm_rm_unmount(mm_command_t *cmd) { * */ int -mm_rm_mount(mm_command_t *cmd) +mm_rm_mount(mm_command_t *cmd, mm_db_t *db) { /* This function is called when a client has disconnected */ /* with an outstanding mount command */ /* need to deallocate the resources and reset device manager states */ - mm_db_t *db = &cmd->cmd_mm_data->mm_db_main; PGresult *drive_results; if (cmd->cmd_root == NULL) { diff --git a/usr/src/cmd/mms/mm/common/mm.h b/usr/src/cmd/mms/mm/common/mm.h index 829fd44057..df023fc887 100644 --- a/usr/src/cmd/mms/mm/common/mm.h +++ b/usr/src/cmd/mms/mm/common/mm.h @@ -707,8 +707,8 @@ struct mm_range { /* MM routines */ int mm_is_exiting(void); -int mm_rm_mount(mm_command_t *cmd); -int mm_rm_unmount(mm_command_t *cmd); +int mm_rm_mount(mm_command_t *cmd, mm_db_t *db); +int mm_rm_unmount(mm_command_t *cmd, mm_db_t *db); extern int mm_candidate_cartridge_ok(mm_wka_t *mm_wka, mm_command_t *cmd, mm_db_t *db, cmi_cart_list_t *cart); extern int mm_candidate_drive_ok(mm_wka_t *mm_wka, diff --git a/usr/src/cmd/mms/mm/common/mm_db.c b/usr/src/cmd/mms/mm/common/mm_db.c index 40632b5b80..97157d3af7 100644 --- a/usr/src/cmd/mms/mm/common/mm_db.c +++ b/usr/src/cmd/mms/mm/common/mm_db.c @@ -562,10 +562,8 @@ mm_db_reconnect(mm_db_t *db) /* Re-read password for db */ db_cfg->mm_db_passwd = mms_net_cfg_read_pass_file(MMS_NET_CFG_DB_FILE); - if (db->mm_db_conn != NULL) { - PQreset(db->mm_db_conn); - db->mm_db_conn = NULL; - } else if (mm_db_connect(db) != MM_DB_OK) { + mm_db_disconnect(db); + if (mm_db_connect(db) != MM_DB_OK) { mms_trace(MMS_DEVP, "reconnect init failed"); return (MM_DB_ERROR); } @@ -580,7 +578,8 @@ mm_db_reconnect(mm_db_t *db) boolean_t mm_db_connected(mm_db_t *db) { - if (db->mm_db_conn != NULL && + if (db != NULL && + db->mm_db_conn != NULL && PQstatus(db->mm_db_conn) == CONNECTION_OK) { return (B_TRUE); } diff --git a/usr/src/cmd/mms/mm/common/mm_task.c b/usr/src/cmd/mms/mm/common/mm_task.c index 273e13487b..7e7dc8a449 100644 --- a/usr/src/cmd/mms/mm/common/mm_task.c +++ b/usr/src/cmd/mms/mm/common/mm_task.c @@ -18,7 +18,7 @@ * * CDDL HEADER END * - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -1051,7 +1051,6 @@ tm_be_match_mount(mm_command_t *mnt_cmd, mm_command_t *end_cmd, mm_db_t *db) { char *cur_library = NULL; char *cur_dm = NULL; char *cur_drive = NULL; - char *cur_pcl = NULL; mm_command_t *unmnt_cmd1 = NULL; mm_command_t *unmnt_cmd2 = NULL; @@ -1153,8 +1152,9 @@ tm_be_match_mount(mm_command_t *mnt_cmd, mm_command_t *end_cmd, mm_db_t *db) { if (mm_db_exec(HERE, db, "select \"LibraryName\",\"DriveName\" " "from \"DRIVE\" where \"DRIVE\"." - "\"CartridgePCL\" = '%s';", - cur_pcl) != MM_DB_DATA) { + "\"CartridgePCL\" = (select \"CartridgePCL\" " + "from \"CARTRIDGE\" where \"CartridgeID\" = '%s');", + mount_info->cmi_cartridge) != MM_DB_DATA) { mms_trace(MMS_ERR, "tm_be_match_mount: " "db error getting drive info"); @@ -1165,8 +1165,8 @@ tm_be_match_mount(mm_command_t *mnt_cmd, mm_command_t *end_cmd, mm_db_t *db) { if (PQntuples(db->mm_db_results) == 0) { /* Cur cart is not loaded */ mms_trace(MMS_DEVP, - "%s not found in a drive", - cur_pcl); + "cartid %s not found in a drive", + mount_info->cmi_cartridge); } else { mms_trace(MMS_DEVP, "need to unmount %s, %s " |