diff options
author | Kristian Høgsberg <krh@redhat.com> | 2007-03-14 17:34:55 -0400 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2007-03-15 13:21:36 -0400 |
commit | 9472316b6eab3500ded544f6e86700c33541ef4e (patch) | |
tree | f155121d72e4881793113ff1890fcc79f37a2c71 /drivers/firewire/fw-device-cdev.c | |
parent | eb0306eac0aad0b7da18d8fbfb777f155b2c010d (diff) |
firewire: Implement deallocation of address ranges.
Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire/fw-device-cdev.c')
-rw-r--r-- | drivers/firewire/fw-device-cdev.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/firewire/fw-device-cdev.c b/drivers/firewire/fw-device-cdev.c index 175ea042ba3f..ebf0d100805e 100644 --- a/drivers/firewire/fw-device-cdev.c +++ b/drivers/firewire/fw-device-cdev.c | |||
@@ -467,6 +467,32 @@ static int ioctl_allocate(struct client *client, void __user *arg) | |||
467 | return 0; | 467 | return 0; |
468 | } | 468 | } |
469 | 469 | ||
470 | static int ioctl_deallocate(struct client *client, void __user *arg) | ||
471 | { | ||
472 | struct fw_cdev_deallocate request; | ||
473 | struct address_handler *handler; | ||
474 | unsigned long flags; | ||
475 | |||
476 | if (copy_from_user(&request, arg, sizeof request)) | ||
477 | return -EFAULT; | ||
478 | |||
479 | spin_lock_irqsave(&client->lock, flags); | ||
480 | list_for_each_entry(handler, &client->handler_list, link) { | ||
481 | if (handler->handler.offset == request.offset) { | ||
482 | list_del(&handler->link); | ||
483 | break; | ||
484 | } | ||
485 | } | ||
486 | spin_unlock_irqrestore(&client->lock, flags); | ||
487 | |||
488 | if (&handler->link == &client->handler_list) | ||
489 | return -EINVAL; | ||
490 | |||
491 | fw_core_remove_address_handler(&handler->handler); | ||
492 | |||
493 | return 0; | ||
494 | } | ||
495 | |||
470 | static int ioctl_send_response(struct client *client, void __user *arg) | 496 | static int ioctl_send_response(struct client *client, void __user *arg) |
471 | { | 497 | { |
472 | struct fw_cdev_send_response request; | 498 | struct fw_cdev_send_response request; |
@@ -696,6 +722,8 @@ dispatch_ioctl(struct client *client, unsigned int cmd, void __user *arg) | |||
696 | return ioctl_send_request(client, arg); | 722 | return ioctl_send_request(client, arg); |
697 | case FW_CDEV_IOC_ALLOCATE: | 723 | case FW_CDEV_IOC_ALLOCATE: |
698 | return ioctl_allocate(client, arg); | 724 | return ioctl_allocate(client, arg); |
725 | case FW_CDEV_IOC_DEALLOCATE: | ||
726 | return ioctl_deallocate(client, arg); | ||
699 | case FW_CDEV_IOC_SEND_RESPONSE: | 727 | case FW_CDEV_IOC_SEND_RESPONSE: |
700 | return ioctl_send_response(client, arg); | 728 | return ioctl_send_response(client, arg); |
701 | case FW_CDEV_IOC_INITIATE_BUS_RESET: | 729 | case FW_CDEV_IOC_INITIATE_BUS_RESET: |