summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Major <David.Major@Sun.COM>2009-02-12 09:28:03 -0600
committerDavid Major <David.Major@Sun.COM>2009-02-12 09:28:03 -0600
commit0058e3a59b93851e9a8f2c2063f03c49d42a4ef2 (patch)
tree0360c91d51389b582a06040649d7d12cb9c2167c
parentd5da6539351bab864692146ea0d7c5044d1333c6 (diff)
downloadillumos-joyent-0058e3a59b93851e9a8f2c2063f03c49d42a4ef2.tar.gz
6802124 mm locked up during mount
-rw-r--r--usr/src/cmd/mms/mm/common/mm.c13
-rw-r--r--usr/src/cmd/mms/mm/common/mm.h4
-rw-r--r--usr/src/cmd/mms/mm/common/mm_db.c9
-rw-r--r--usr/src/cmd/mms/mm/common/mm_task.c12
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 "