summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert Lee <trisk@nexenta.com>2014-02-13 04:06:16 -0500
committerDan McDonald <danmcd@omniti.com>2014-02-13 11:30:05 -0500
commit5bc1e22263da29a716575a856dd867c1f58f4a8b (patch)
tree7c5e04c6d29977a8a84da21fd46bde721a6650b7
parent3ed73a35f260311604b6a106c2de1e8488499ff8 (diff)
downloadillumos-gate-5bc1e22263da29a716575a856dd867c1f58f4a8b.tar.gz
4553 ndmp_config_get_ext_list failed
Reviewed by: Jan Kryl <jan.kryl@nexenta.com> Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com> Reviewed by: Dan McDonald <danmcd@omniti.com> Approved by: Garrett D'Amore <garrett@damore.org>
-rw-r--r--usr/src/cmd/ndmpd/ndmp/ndmpd.h1
-rw-r--r--usr/src/cmd/ndmpd/ndmp/ndmpd_config.c46
2 files changed, 36 insertions, 11 deletions
diff --git a/usr/src/cmd/ndmpd/ndmp/ndmpd.h b/usr/src/cmd/ndmpd/ndmp/ndmpd.h
index 529ffa92d7..c2538f28c3 100644
--- a/usr/src/cmd/ndmpd/ndmp/ndmpd.h
+++ b/usr/src/cmd/ndmpd/ndmp/ndmpd.h
@@ -512,6 +512,7 @@ typedef struct ndmpd_session {
/*
* NDMP V4 related data
*/
+ boolean_t ns_get_ext_list;
boolean_t ns_set_ext_list;
/* handling of hardlink, hardlink queue head */
diff --git a/usr/src/cmd/ndmpd/ndmp/ndmpd_config.c b/usr/src/cmd/ndmpd/ndmp/ndmpd_config.c
index a411a5d7c5..d110dc0bce 100644
--- a/usr/src/cmd/ndmpd/ndmp/ndmpd_config.c
+++ b/usr/src/cmd/ndmpd/ndmp/ndmpd_config.c
@@ -1051,15 +1051,23 @@ ndmpd_config_get_ext_list_v4(ndmp_connection_t *connection, void *body)
(void) memset((void*)&reply, 0, sizeof (reply));
- if (session->ns_set_ext_list == FALSE)
+ if (session->ns_set_ext_list) {
+ /*
+ * Illegal request if extensions have already been selected.
+ */
+ NDMP_LOG(LOG_ERR, "Extensions have already been selected.");
reply.error = NDMP_EXT_DANDN_ILLEGAL_ERR;
- else
+ } else {
+ /*
+ * Reply with an empty set of extensions.
+ */
+ session->ns_get_ext_list = B_TRUE;
reply.error = NDMP_NO_ERR;
+ }
reply.class_list.class_list_val = NULL;
reply.class_list.class_list_len = 0;
-
ndmp_send_reply(connection, (void *)&reply,
"error sending ndmp_config_get_ext_list reply");
}
@@ -1076,25 +1084,41 @@ ndmpd_config_get_ext_list_v4(ndmp_connection_t *connection, void *body)
* Returns:
* void
*/
-/*ARGSUSED*/
void
ndmpd_config_set_ext_list_v4(ndmp_connection_t *connection, void *body)
{
ndmp_config_set_ext_list_reply_v4 reply;
+ ndmp_config_set_ext_list_request_v4 *request;
ndmpd_session_t *session = ndmp_get_client_data(connection);
+ request = (ndmp_config_set_ext_list_request_v4 *)body;
+
(void) memset((void*)&reply, 0, sizeof (reply));
- if (session->ns_set_ext_list == TRUE) {
+
+ if (!session->ns_get_ext_list) {
+ /*
+ * The DMA is required to issue a NDMP_GET_EXT_LIST request
+ * prior sending a NDMP_SET_EXT_LIST request.
+ */
+ NDMP_LOG(LOG_ERR, "No prior ndmp_config_get_ext_list issued.");
+ reply.error = NDMP_PRECONDITION_ERR;
+ } else if (session->ns_set_ext_list) {
+ /*
+ * Illegal request if extensions have already been selected.
+ */
+ NDMP_LOG(LOG_ERR, "Extensions have already been selected.");
reply.error = NDMP_EXT_DANDN_ILLEGAL_ERR;
} else {
- session->ns_set_ext_list = TRUE;
/*
- * NOTE: for now we are not supporting any extension list,
- * hence this error, when we start to support extensions,
- * this should be validated
+ * We currently do not support any extensions, but the DMA
+ * may test NDMP_CONFIG_SET_EXT_LIST with an empty list.
*/
-
- reply.error = NDMP_VERSION_NOT_SUPPORTED_ERR;
+ if (request->ndmp_selected_ext.ndmp_selected_ext_len != 0) {
+ reply.error = NDMP_CLASS_NOT_SUPPORTED_ERR;
+ } else {
+ session->ns_set_ext_list = B_TRUE;
+ reply.error = NDMP_NO_ERR;
+ }
}
ndmp_send_reply(connection, (void *)&reply,