[stgt] [PATCH 1/3] add state to tgt_driver, set it by lld init result

Alexander Nezhinsky alexandern at mellanox.com
Wed Oct 26 19:58:49 CEST 2011


Added "state" field to "struct tgt_driver".
When a LLD goes through its init function, the state chages to INIT state
if all is ok, or to ERR if init fails.
This state is displayed using "-m system -o show" for every registered LLD.
Management operations are allowed only for LLDs that have passed
initialization successfully.

Signed-off-by: Alexander Nezhinsky <alexandern at mellanox.com>
---
  usr/driver.c |   17 +++++++++++++++++
  usr/driver.h |    9 +++++++++
  usr/tgtd.c   |    6 +++++-
  3 files changed, 31 insertions(+), 1 deletions(-)

diff --git a/usr/driver.c b/usr/driver.c
index f9e0d57..bf612b9 100644
--- a/usr/driver.c
+++ b/usr/driver.c
@@ -51,9 +51,26 @@ int register_driver(struct tgt_driver *drv)
  
  	for (i = 0; i < ARRAY_SIZE(tgt_drivers); i++)
  		if (!tgt_drivers[i]) {
+			drv->drv_state = DRIVER_REGD;
  			tgt_drivers[i] = drv;
  			return 0;
  		}
  
  	return -1;
  }
+
+const char *driver_state_name(struct tgt_driver *drv)
+{
+	switch (drv->drv_state) {
+	case DRIVER_REGD:
+		return "uninitialized";
+	case DRIVER_INIT:
+		return "ready";
+	case DRIVER_ERR:
+		return "error";
+	case DRIVER_EXIT:
+		return "stopped";
+	default:
+		return "unsupported";
+	}
+}
diff --git a/usr/driver.h b/usr/driver.h
index 798dcd3..091c3b0 100644
--- a/usr/driver.h
+++ b/usr/driver.h
@@ -1,8 +1,16 @@
  #ifndef __DRIVER_H__
  #define __DRIVER_H__
  
+enum tgt_driver_state {
+	DRIVER_REGD = 0, /* just registered */
+	DRIVER_INIT, /* initialized ok */
+	DRIVER_ERR,  /* failed to initialize */
+	DRIVER_EXIT  /* exited */
+};
+
  struct tgt_driver {
  	const char *name;
+	enum tgt_driver_state drv_state;
  
  	int (*init)(int, char *);
  	void (*exit)(void);
@@ -31,5 +39,6 @@ struct tgt_driver {
  extern struct tgt_driver *tgt_drivers[];
  extern int get_driver_index(char *name);
  extern int register_driver(struct tgt_driver *drv);
+extern const char *driver_state_name(struct tgt_driver *drv);
  
  #endif /* __DRIVER_H__ */
diff --git a/usr/tgtd.c b/usr/tgtd.c
index 30d5e9d..0d6f11f 100644
--- a/usr/tgtd.c
+++ b/usr/tgtd.c
@@ -414,8 +414,11 @@ static int lld_init(char *args)
  	for (i = nr = 0; tgt_drivers[i]; i++) {
  		if (tgt_drivers[i]->init) {
  			err = tgt_drivers[i]->init(i, args);
-			if (err)
+			if (err) {
+				tgt_drivers[i]->drv_state = DRIVER_ERR;
  				continue;
+			}
+			tgt_drivers[i]->drv_state = DRIVER_INIT;
  		}
  		nr++;
  	}
@@ -429,6 +432,7 @@ static void lld_exit(void)
  	for (i = 0; tgt_drivers[i]; i++) {
  		if (tgt_drivers[i]->exit)
  			tgt_drivers[i]->exit();
+		tgt_drivers[i]->drv_state = DRIVER_EXIT;
  	}
  }
  
--
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list