[PATCH] release backing store when offline

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

We have the need to be able to release the backing
store device when a target or LUN is marked as offline.
I have included my simplistic patch to accomplish this.
If I am overlooking something, please let me know and
I will do my best to incorporate it into the patch.

Thank you
-- 
James R. Leu
Software Architect
INOC
608.204.0203
608.663.4555 fax
jleu@xxxxxxxx
www.inoc.com

*** DELIVERING UPTIME ***
diff -uNr tgt-1.0.18/usr/spc.c tgt-1.0.18-inoc/usr/spc.c
--- tgt-1.0.18/usr/spc.c	2011-06-29 17:54:02.000000000 -0500
+++ tgt-1.0.18-inoc/usr/spc.c	2011-07-13 10:09:23.341135538 -0500
@@ -1687,10 +1687,20 @@
 			break;
 		case Opt_online:
 			match_strncpy(buf, &args[0], sizeof(buf));
-			if (atoi(buf))
-				lu->dev_type_template.lu_online(lu);
-			else
+			switch (atoi(buf)) {
+			    case 1:
+				err = lu->bst->bs_open(lu, lu->path, &lu->fd, &lu->size);
+				if (!err) {
+				    lu->dev_type_template.lu_online(lu);
+				}
+				break;
+			    case 0:
+				lu->bst->bs_close(lu);
 				lu->dev_type_template.lu_offline(lu);
+				break;
+			    default:
+				break;
+			}
 			break;
 		case Opt_mode_page:
 			match_strncpy(buf, &args[0], sizeof(buf));
diff -uNr tgt-1.0.18/usr/target.c tgt-1.0.18-inoc/usr/target.c
--- tgt-1.0.18/usr/target.c	2011-06-29 17:54:02.000000000 -0500
+++ tgt-1.0.18-inoc/usr/target.c	2011-07-13 09:39:50.955594499 -0500
@@ -1740,12 +1740,15 @@
 int tgt_set_target_state(int tid, char *str)
 {
 	int i, err = TGTADM_INVALID_REQUEST;
+	struct scsi_lu *lu;
 	struct target *target;
+	int prev = 0;
 
 	target = target_lookup(tid);
 	if (!target)
 		return TGTADM_NO_TARGET;
 
+	prev = target->target_state;
 	for (i = 0; i < ARRAY_SIZE(target_state); i++) {
 		if (!strcmp(target_state[i].name, str)) {
 			target->target_state = target_state[i].value;
@@ -1754,6 +1757,22 @@
 		}
 	}
 
+	if (err == 0 && prev != target->target_state) {
+	    list_for_each_entry(lu, &target->device_list, device_siblings) {
+		if (target->target_state == SCSI_TARGET_OFFLINE) {
+		    lu->bst->bs_close(lu);
+		    lu->dev_type_template.lu_offline(lu);
+		} else {
+		    err = lu->bst->bs_open(lu, lu->path, &lu->fd, &lu->size);
+		    if (err) {
+			target->target_state = prev;
+		    } else {
+			lu->dev_type_template.lu_online(lu);
+		    }
+		}
+	    }
+	}
+
 	return err;
 }
 

Attachment: pgpAqGUKZpJRc.pgp
Description: PGP signature


[Index of Archives]     [Linux SCSI]     [Linux RAID]     [Linux Clusters]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]

  Powered by Linux