]> err.no Git - linux-2.6/commitdiff
IB/uverbs: Don't store struct file * for event files
authorRoland Dreier <rolandd@cisco.com>
Thu, 17 Apr 2008 04:01:08 +0000 (21:01 -0700)
committerRoland Dreier <rolandd@cisco.com>
Thu, 17 Apr 2008 04:01:08 +0000 (21:01 -0700)
The file member of struct ib_uverbs_event_file was only used to keep
track of whether the file had been closed or not.  The only thing we
ever did with the value was check if it was NULL or not.  Simplify the
code and get rid of the need to keep track of the struct file * we
allocate by replacing the file member with an is_closed member.

Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/core/uverbs.h
drivers/infiniband/core/uverbs_main.c

index c75eb6c9bd49dee9a6d355e9d5fba9e211642247..2cad8b4b52924a1b72e61b49b42b1cad47896c34 100644 (file)
@@ -81,13 +81,13 @@ struct ib_uverbs_device {
 
 struct ib_uverbs_event_file {
        struct kref                             ref;
-       struct file                            *file;
        struct ib_uverbs_file                  *uverbs_file;
        spinlock_t                              lock;
-       int                                     is_async;
        wait_queue_head_t                       poll_wait;
        struct fasync_struct                   *async_queue;
        struct list_head                        event_list;
+       int                                     is_async;
+       int                                     is_closed;
 };
 
 struct ib_uverbs_file {
index 7c2ac39055822fa6e4db39a8fcd105ac35385e97..63335da42744abe78f444ca79d293bebb7896c54 100644 (file)
@@ -352,7 +352,7 @@ static int ib_uverbs_event_close(struct inode *inode, struct file *filp)
        struct ib_uverbs_event *entry, *tmp;
 
        spin_lock_irq(&file->lock);
-       file->file = NULL;
+       file->is_closed = 1;
        list_for_each_entry_safe(entry, tmp, &file->event_list, list) {
                if (entry->counter)
                        list_del(&entry->obj_list);
@@ -390,7 +390,7 @@ void ib_uverbs_comp_handler(struct ib_cq *cq, void *cq_context)
                return;
 
        spin_lock_irqsave(&file->lock, flags);
-       if (!file->file) {
+       if (file->is_closed) {
                spin_unlock_irqrestore(&file->lock, flags);
                return;
        }
@@ -423,7 +423,7 @@ static void ib_uverbs_async_handler(struct ib_uverbs_file *file,
        unsigned long flags;
 
        spin_lock_irqsave(&file->async_file->lock, flags);
-       if (!file->async_file->file) {
+       if (!file->async_file->is_closed) {
                spin_unlock_irqrestore(&file->async_file->lock, flags);
                return;
        }
@@ -509,6 +509,7 @@ struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file,
        ev_file->uverbs_file = uverbs_file;
        ev_file->async_queue = NULL;
        ev_file->is_async    = is_async;
+       ev_file->is_closed   = 0;
 
        *fd = get_unused_fd();
        if (*fd < 0) {
@@ -522,8 +523,6 @@ struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file,
                goto err_fd;
        }
 
-       ev_file->file      = filp;
-
        /*
         * fops_get() can't fail here, because we're coming from a
         * system call on a uverbs file, which will already have a