return ib_ucm_destroy_ctx(file, cmd.id); 
down(&ctx_id_mutex); ctx = idr_find(&ctx_id_table, cmd.id); if (!ctx) ctx = ERR_PTR(-ENOENT); else if (ctx->file != file) ctx = ERR_PTR(-EINVAL); else idr_remove(&ctx_id_table, ctx->id); up(&ctx_id_mutex);  if (IS_ERR(ctx)) return PTR_ERR(ctx);  atomic_dec(&ctx->ref); wait_event(ctx->wait, !atomic_read(&ctx->ref));  /* No new events will be generated after destroying the cm_id. */ ib_destroy_cm_id(ctx->cm_id); /* Cleanup events not yet reported to the user. */ ib_ucm_cleanup_events(ctx);  resp.events_reported = ctx->events_reported; if (copy_to_user((void __user *)(unsigned long)cmd.response, &resp, sizeof(resp))) result = -EFAULT;  kfree(ctx); return result; 
static ssize_t ib_ucm_destroy_id(struct ib_ucm_file *file,				 const char __user *inbuf,				 int in_len, int out_len){	struct ib_ucm_destroy_id cmd;	if (copy_from_user(&cmd, inbuf, sizeof(cmd)))		return -EFAULT;	return ib_ucm_destroy_ctx(file, cmd.id);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/0b2b35f68140ceeb1b78ef85680198e63ebc8649/ucm.c/clean/drivers/infiniband/core/ucm.c