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