From: James Smart <James.Smart@Emulex.Com>
To: linux-scsi@vger.kernel.org
Subject: [PATCH] fc transport: bug fix: correct references
Date: Thu, 15 Jun 2006 12:47:45 -0400 [thread overview]
Message-ID: <1150390065.29774.24.camel@localhost.localdomain> (raw)
Updating the FC transport for the following:
- Take a self-reference on the rport. Prior, when the starget was removed,
the ref count would hit zero and fc_rport_dev_release was called, which
would free the rport. This left corrupt lists, etc...
Symptoms of error is oops w/ either:
"Badness in kref_get in lib/kref.c:32"
"Unable to handle kernel paging request for data at address 0x00000010"
from kref_get
- Fix fc_rport_create failure path - too many put's on parent
- Add commenting to easily track ref taking.
-- james s
Signed-off-by: James Smart <james.smart@emulex.com>
diff -upNr a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c
--- a/drivers/scsi/scsi_transport_fc.c 2006-06-14 11:37:09.000000000 -0400
+++ b/drivers/scsi/scsi_transport_fc.c 2006-06-14 16:33:55.000000000 -0400
@@ -1077,7 +1077,7 @@ static int fc_target_match(struct attrib
static void fc_rport_dev_release(struct device *dev)
{
struct fc_rport *rport = dev_to_rport(dev);
- put_device(dev->parent);
+ put_device(dev->parent); /* for parent reference */
kfree(rport);
}
@@ -1476,7 +1476,8 @@ fc_rport_final_delete(void *data)
transport_remove_device(dev);
device_del(dev);
transport_destroy_device(dev);
- put_device(&shost->shost_gendev);
+ put_device(&shost->shost_gendev); /* for fc_host->rport list */
+ put_device(dev); /* for self-reference */
}
@@ -1537,13 +1538,13 @@ fc_rport_create(struct Scsi_Host *shost,
else
rport->scsi_target_id = -1;
list_add_tail(&rport->peers, &fc_host->rports);
- get_device(&shost->shost_gendev);
+ get_device(&shost->shost_gendev); /* for fc_host->rport list */
spin_unlock_irqrestore(shost->host_lock, flags);
dev = &rport->dev;
device_initialize(dev);
- dev->parent = get_device(&shost->shost_gendev);
+ dev->parent = get_device(&shost->shost_gendev); /* parent reference */
dev->release = fc_rport_dev_release;
sprintf(dev->bus_id, "rport-%d:%d-%d",
shost->host_no, channel, rport->number);
@@ -1554,6 +1555,9 @@ fc_rport_create(struct Scsi_Host *shost,
printk(KERN_ERR "FC Remote Port device_add failed\n");
goto delete_rport;
}
+
+ get_device(dev); /* for self-reference */
+
transport_add_device(dev);
transport_configure_device(dev);
@@ -1567,12 +1571,11 @@ fc_rport_create(struct Scsi_Host *shost,
delete_rport:
transport_destroy_device(dev);
- put_device(dev->parent);
+ put_device(dev->parent); /* for parent reference */
spin_lock_irqsave(shost->host_lock, flags);
list_del(&rport->peers);
- put_device(&shost->shost_gendev);
+ put_device(&shost->shost_gendev); /* for fc_host->rport list */
spin_unlock_irqrestore(shost->host_lock, flags);
- put_device(dev->parent);
kfree(rport);
return NULL;
}
reply other threads:[~2006-06-15 16:48 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1150390065.29774.24.camel@localhost.localdomain \
--to=james.smart@emulex.com \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox