diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-09 10:25:38 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-09 10:25:38 -0800 |
commit | 64106104dd2d4a6280777e88c1cbf9f7a52c30bd (patch) | |
tree | 082ed0f5e8be5390e867e4078e6813c509c5e642 /drivers/ieee1394/raw1394.c | |
parent | beda9f3a13bbb22cde92a45f230a02ef2afef6a9 (diff) | |
parent | 91efa462054d44ae52b0c6c8325ed5e899f2cd17 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6:
ieee1394: fix host device registering when nodemgr disabled
ieee1394: video1394: DMA fix
ieee1394: raw1394: prevent unloading of low-level driver
ieee1394: dv1394: tidy up card removal
ieee1394: dv1394: fix CardBus card ejection
ieee1394: sbp2: lower block queue alignment requirement
ieee1394: sbp2: remove bogus "emulated" host flag
ieee1394: save one word in struct hpsb_host
ieee1394: restore config ROM when resuming
ieee1394: ohci1394: drop pcmcia-cs compatibility code
ieee1394: nodemgr: check info_length in ROM header earlier
the scheduled IEEE1394_OUI_DB removal
the scheduled IEEE1394_EXPORT_FULL_API removal
ieee1394: sbp2: use a better wildcard for blacklist
Add PCI class ID for firewire OHCI controllers.
ieee1394: modified csr1212_key_id_type_map to support lisight
Diffstat (limited to 'drivers/ieee1394/raw1394.c')
-rw-r--r-- | drivers/ieee1394/raw1394.c | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c index ad2108f27a0..a77a832828c 100644 --- a/drivers/ieee1394/raw1394.c +++ b/drivers/ieee1394/raw1394.c @@ -636,27 +636,32 @@ static int state_initialized(struct file_info *fi, struct pending_request *req) case RAW1394_REQ_SET_CARD: spin_lock_irqsave(&host_info_lock, flags); - if (req->req.misc < host_count) { - list_for_each_entry(hi, &host_info_list, list) { - if (!req->req.misc--) - break; - } - get_device(&hi->host->device); // XXX Need to handle failure case - list_add_tail(&fi->list, &hi->file_info_list); - fi->host = hi->host; - fi->state = connected; - - req->req.error = RAW1394_ERROR_NONE; - req->req.generation = get_hpsb_generation(fi->host); - req->req.misc = (fi->host->node_id << 16) - | fi->host->node_count; - if (fi->protocol_version > 3) { - req->req.misc |= - NODEID_TO_NODE(fi->host->irm_id) << 8; - } - } else { + if (req->req.misc >= host_count) { req->req.error = RAW1394_ERROR_INVALID_ARG; + goto out_set_card; } + list_for_each_entry(hi, &host_info_list, list) + if (!req->req.misc--) + break; + get_device(&hi->host->device); /* FIXME handle failure case */ + list_add_tail(&fi->list, &hi->file_info_list); + + /* prevent unloading of the host's low-level driver */ + if (!try_module_get(hi->host->driver->owner)) { + req->req.error = RAW1394_ERROR_ABORTED; + goto out_set_card; + } + WARN_ON(fi->host); + fi->host = hi->host; + fi->state = connected; + + req->req.error = RAW1394_ERROR_NONE; + req->req.generation = get_hpsb_generation(fi->host); + req->req.misc = (fi->host->node_id << 16) + | fi->host->node_count; + if (fi->protocol_version > 3) + req->req.misc |= NODEID_TO_NODE(fi->host->irm_id) << 8; +out_set_card: spin_unlock_irqrestore(&host_info_lock, flags); req->req.length = 0; @@ -2955,6 +2960,11 @@ static int raw1394_release(struct inode *inode, struct file *file) put_device(&fi->host->device); } + spin_lock_irqsave(&host_info_lock, flags); + if (fi->host) + module_put(fi->host->driver->owner); + spin_unlock_irqrestore(&host_info_lock, flags); + kfree(fi); return 0; |