static int agp_release(struct inode *inode, struct file *file)
{
	struct agp_file_private *priv = file->private_data;

	down(&(agp_fe.agp_mutex));

	DBG("priv=%p", priv);

	if (test_bit(AGP_FF_IS_CONTROLLER, &priv->access_flags)) {
		struct agp_controller *controller;

		controller = agp_find_controller_by_pid(priv->my_pid);

		if (controller != NULL) {
			if (controller == agp_fe.current_controller)
				agp_controller_release_current(controller, priv);
			agp_remove_controller(controller);
			controller = NULL;
		}
	}

	if (test_bit(AGP_FF_IS_CLIENT, &priv->access_flags))
		agp_remove_client(priv->my_pid);

	agp_remove_file_private(priv);
	kfree(priv);
	file->private_data = NULL;
	up(&(agp_fe.agp_mutex));
	return 0;
}
Ejemplo n.º 2
0
static int agp_release(struct inode *inode, struct file *file)
{
	agp_file_private *priv = (agp_file_private *) file->private_data;

	lock_kernel();
	AGP_LOCK();

	if (test_bit(AGP_FF_IS_CONTROLLER, &priv->access_flags)) {
		agp_controller *controller;

		controller = agp_find_controller_by_pid(priv->my_pid);

		if (controller != NULL) {
			if (controller == agp_fe.current_controller) {
				agp_controller_release_current(controller,
							       priv);
			}
			agp_remove_controller(controller);
		}
	}
	if (test_bit(AGP_FF_IS_CLIENT, &priv->access_flags)) {
		agp_remove_client(priv->my_pid);
	}
	agp_remove_file_private(priv);
	kfree(priv);
	AGP_UNLOCK();
	unlock_kernel();
	return 0;
}