Lines Matching full:file

9  * General Public License (GPL) Version 2, available from the file
70 * device special file is opened, we take a reference on the
145 static int hdr_size(struct ib_umad_file *file) in hdr_size() argument
147 return file->use_pkey_index ? sizeof (struct ib_user_mad_hdr) : in hdr_size()
151 /* caller must hold file->mutex */
152 static struct ib_mad_agent *__get_agent(struct ib_umad_file *file, int id) in __get_agent() argument
154 return file->agents_dead ? NULL : file->agent[id]; in __get_agent()
157 static int queue_packet(struct ib_umad_file *file, in queue_packet() argument
163 mutex_lock(&file->mutex); in queue_packet()
168 if (agent == __get_agent(file, packet->mad.hdr.id)) { in queue_packet()
169 list_add_tail(&packet->list, &file->recv_list); in queue_packet()
170 wake_up_interruptible(&file->recv_wait); in queue_packet()
175 mutex_unlock(&file->mutex); in queue_packet()
180 static void dequeue_send(struct ib_umad_file *file, in dequeue_send() argument
183 spin_lock_irq(&file->send_lock); in dequeue_send()
185 spin_unlock_irq(&file->send_lock); in dequeue_send()
191 struct ib_umad_file *file = agent->context; in send_handler() local
194 dequeue_send(file, packet); in send_handler()
201 if (!queue_packet(file, agent, packet)) in send_handler()
210 struct ib_umad_file *file = agent->context; in recv_handler() local
224 packet->mad.hdr.length = hdr_size(file) + mad_recv_wc->mad_len; in recv_handler()
245 if (queue_packet(file, agent, packet)) in recv_handler()
255 static ssize_t copy_recv_mad(struct ib_umad_file *file, char __user *buf, in copy_recv_mad() argument
264 count < hdr_size(file) + packet->length) || in copy_recv_mad()
266 count < hdr_size(file) + sizeof (*recv_buf->mad))) in copy_recv_mad()
269 if (copy_to_user(buf, &packet->mad, hdr_size(file))) in copy_recv_mad()
272 buf += hdr_size(file); in copy_recv_mad()
282 if (count < hdr_size(file) + packet->length) { in copy_recv_mad()
302 return hdr_size(file) + packet->length; in copy_recv_mad()
305 static ssize_t copy_send_mad(struct ib_umad_file *file, char __user *buf, in copy_send_mad() argument
308 ssize_t size = hdr_size(file) + packet->length; in copy_send_mad()
313 if (copy_to_user(buf, &packet->mad, hdr_size(file))) in copy_send_mad()
316 buf += hdr_size(file); in copy_send_mad()
324 static ssize_t ib_umad_read(struct file *filp, char __user *buf, in ib_umad_read()
327 struct ib_umad_file *file = filp->private_data; in ib_umad_read() local
331 if (count < hdr_size(file)) in ib_umad_read()
334 mutex_lock(&file->mutex); in ib_umad_read()
336 while (list_empty(&file->recv_list)) { in ib_umad_read()
337 mutex_unlock(&file->mutex); in ib_umad_read()
342 if (wait_event_interruptible(file->recv_wait, in ib_umad_read()
343 !list_empty(&file->recv_list))) in ib_umad_read()
346 mutex_lock(&file->mutex); in ib_umad_read()
349 packet = list_entry(file->recv_list.next, struct ib_umad_packet, list); in ib_umad_read()
352 mutex_unlock(&file->mutex); in ib_umad_read()
355 ret = copy_recv_mad(file, buf, packet, count); in ib_umad_read()
357 ret = copy_send_mad(file, buf, packet, count); in ib_umad_read()
361 mutex_lock(&file->mutex); in ib_umad_read()
362 list_add(&packet->list, &file->recv_list); in ib_umad_read()
363 mutex_unlock(&file->mutex); in ib_umad_read()
404 static int is_duplicate(struct ib_umad_file *file, in is_duplicate() argument
411 list_for_each_entry(sent_packet, &file->send_list, list) { in is_duplicate()
437 static ssize_t ib_umad_write(struct file *filp, const char __user *buf, in ib_umad_write()
440 struct ib_umad_file *file = filp->private_data; in ib_umad_write() local
449 if (count < hdr_size(file) + IB_MGMT_RMPP_HDR) in ib_umad_write()
456 if (copy_from_user(&packet->mad, buf, hdr_size(file))) { in ib_umad_write()
466 buf += hdr_size(file); in ib_umad_write()
473 mutex_lock(&file->mutex); in ib_umad_write()
475 agent = __get_agent(file, packet->mad.hdr.id); in ib_umad_write()
485 ah_attr.port_num = file->port->port_num; in ib_umad_write()
512 data_len = count - hdr_size(file) - hdr_len; in ib_umad_write()
555 spin_lock_irq(&file->send_lock); in ib_umad_write()
556 ret = is_duplicate(file, packet); in ib_umad_write()
558 list_add_tail(&packet->list, &file->send_list); in ib_umad_write()
559 spin_unlock_irq(&file->send_lock); in ib_umad_write()
569 mutex_unlock(&file->mutex); in ib_umad_write()
573 dequeue_send(file, packet); in ib_umad_write()
579 mutex_unlock(&file->mutex); in ib_umad_write()
585 static unsigned int ib_umad_poll(struct file *filp, struct poll_table_struct *wait) in ib_umad_poll()
587 struct ib_umad_file *file = filp->private_data; in ib_umad_poll() local
592 poll_wait(filp, &file->recv_wait, wait); in ib_umad_poll()
594 if (!list_empty(&file->recv_list)) in ib_umad_poll()
600 static int ib_umad_reg_agent(struct ib_umad_file *file, void __user *arg, in ib_umad_reg_agent() argument
609 mutex_lock(&file->port->file_mutex); in ib_umad_reg_agent()
610 mutex_lock(&file->mutex); in ib_umad_reg_agent()
612 if (!file->port->ib_dev) { in ib_umad_reg_agent()
628 if (!__get_agent(file, agent_id)) in ib_umad_reg_agent()
652 agent = ib_register_mad_agent(file->port->ib_dev, file->port->port_num, in ib_umad_reg_agent()
656 send_handler, recv_handler, file); in ib_umad_reg_agent()
669 if (!file->already_used) { in ib_umad_reg_agent()
670 file->already_used = 1; in ib_umad_reg_agent()
671 if (!file->use_pkey_index) { in ib_umad_reg_agent()
679 file->agent[agent_id] = agent; in ib_umad_reg_agent()
683 mutex_unlock(&file->mutex); in ib_umad_reg_agent()
688 mutex_unlock(&file->port->file_mutex); in ib_umad_reg_agent()
693 static int ib_umad_unreg_agent(struct ib_umad_file *file, u32 __user *arg) in ib_umad_unreg_agent() argument
702 mutex_lock(&file->port->file_mutex); in ib_umad_unreg_agent()
703 mutex_lock(&file->mutex); in ib_umad_unreg_agent()
705 if (id >= IB_UMAD_MAX_AGENTS || !__get_agent(file, id)) { in ib_umad_unreg_agent()
710 agent = file->agent[id]; in ib_umad_unreg_agent()
711 file->agent[id] = NULL; in ib_umad_unreg_agent()
714 mutex_unlock(&file->mutex); in ib_umad_unreg_agent()
719 mutex_unlock(&file->port->file_mutex); in ib_umad_unreg_agent()
724 static long ib_umad_enable_pkey(struct ib_umad_file *file) in ib_umad_enable_pkey() argument
728 mutex_lock(&file->mutex); in ib_umad_enable_pkey()
729 if (file->already_used) in ib_umad_enable_pkey()
732 file->use_pkey_index = 1; in ib_umad_enable_pkey()
733 mutex_unlock(&file->mutex); in ib_umad_enable_pkey()
738 static long ib_umad_ioctl(struct file *filp, unsigned int cmd, in ib_umad_ioctl()
754 static long ib_umad_compat_ioctl(struct file *filp, unsigned int cmd, in ib_umad_compat_ioctl()
774 * everything else is purely local to the file being created, so
777 * file structure being operated on;
779 static int ib_umad_open(struct inode *inode, struct file *filp) in ib_umad_open()
782 struct ib_umad_file *file; in ib_umad_open() local
798 file = kzalloc(sizeof *file, GFP_KERNEL); in ib_umad_open()
799 if (!file) { in ib_umad_open()
805 mutex_init(&file->mutex); in ib_umad_open()
806 spin_lock_init(&file->send_lock); in ib_umad_open()
807 INIT_LIST_HEAD(&file->recv_list); in ib_umad_open()
808 INIT_LIST_HEAD(&file->send_list); in ib_umad_open()
809 init_waitqueue_head(&file->recv_wait); in ib_umad_open()
811 file->port = port; in ib_umad_open()
812 filp->private_data = file; in ib_umad_open()
814 list_add_tail(&file->port_list, &port->file_list); in ib_umad_open()
823 static int ib_umad_close(struct inode *inode, struct file *filp) in ib_umad_close()
825 struct ib_umad_file *file = filp->private_data; in ib_umad_close() local
826 struct ib_umad_device *dev = file->port->umad_dev; in ib_umad_close()
831 mutex_lock(&file->port->file_mutex); in ib_umad_close()
832 mutex_lock(&file->mutex); in ib_umad_close()
834 already_dead = file->agents_dead; in ib_umad_close()
835 file->agents_dead = 1; in ib_umad_close()
837 list_for_each_entry_safe(packet, tmp, &file->recv_list, list) { in ib_umad_close()
843 list_del(&file->port_list); in ib_umad_close()
845 mutex_unlock(&file->mutex); in ib_umad_close()
849 if (file->agent[i]) in ib_umad_close()
850 ib_unregister_mad_agent(file->agent[i]); in ib_umad_close()
852 mutex_unlock(&file->port->file_mutex); in ib_umad_close()
854 kfree(file); in ib_umad_close()
874 static int ib_umad_sm_open(struct inode *inode, struct file *filp) in ib_umad_sm_open()
915 static int ib_umad_sm_close(struct inode *inode, struct file *filp) in ib_umad_sm_close()
1086 struct ib_umad_file *file; in ib_umad_kill_port() local
1102 list_for_each_entry(file, &port->file_list, port_list) { in ib_umad_kill_port()
1103 mutex_lock(&file->mutex); in ib_umad_kill_port()
1104 file->agents_dead = 1; in ib_umad_kill_port()
1105 mutex_unlock(&file->mutex); in ib_umad_kill_port()
1108 if (file->agent[id]) in ib_umad_kill_port()
1109 ib_unregister_mad_agent(file->agent[id]); in ib_umad_kill_port()