diff options
Diffstat (limited to 'net/9p/client.c')
| -rw-r--r-- | net/9p/client.c | 59 | 
1 files changed, 34 insertions, 25 deletions
diff --git a/net/9p/client.c b/net/9p/client.c index 67717f69412..4b529454616 100644 --- a/net/9p/client.c +++ b/net/9p/client.c @@ -189,6 +189,9 @@ static struct p9_req_t *p9_tag_alloc(struct p9_client *c, u16 tag)  			printk(KERN_ERR "Couldn't grow tag array\n");  			kfree(req->tc);  			kfree(req->rc); +			kfree(req->wq); +			req->tc = req->rc = NULL; +			req->wq = NULL;  			return ERR_PTR(-ENOMEM);  		}  		req->tc->sdata = (char *) req->tc + sizeof(struct p9_fcall); @@ -311,12 +314,6 @@ static void p9_free_req(struct p9_client *c, struct p9_req_t *r)  	r->status = REQ_STATUS_IDLE;  	if (tag != P9_NOTAG && p9_idpool_check(tag, c->tagpool))  		p9_idpool_put(tag, c->tagpool); - -	/* if this was a flush request we have to free response fcall */ -	if (r->rc->id == P9_RFLUSH) { -		kfree(r->tc); -		kfree(r->rc); -	}  }  /** @@ -611,19 +608,21 @@ reterr:  static struct p9_fid *p9_fid_create(struct p9_client *clnt)  { -	int err; +	int ret;  	struct p9_fid *fid; +	unsigned long flags;  	P9_DPRINTK(P9_DEBUG_FID, "clnt %p\n", clnt);  	fid = kmalloc(sizeof(struct p9_fid), GFP_KERNEL);  	if (!fid)  		return ERR_PTR(-ENOMEM); -	fid->fid = p9_idpool_get(clnt->fidpool); +	ret = p9_idpool_get(clnt->fidpool);  	if (fid->fid < 0) { -		err = -ENOSPC; +		ret = -ENOSPC;  		goto error;  	} +	fid->fid = ret;  	memset(&fid->qid, 0, sizeof(struct p9_qid));  	fid->mode = -1; @@ -632,27 +631,28 @@ static struct p9_fid *p9_fid_create(struct p9_client *clnt)  	fid->clnt = clnt;  	fid->aux = NULL; -	spin_lock(&clnt->lock); +	spin_lock_irqsave(&clnt->lock, flags);  	list_add(&fid->flist, &clnt->fidlist); -	spin_unlock(&clnt->lock); +	spin_unlock_irqrestore(&clnt->lock, flags);  	return fid;  error:  	kfree(fid); -	return ERR_PTR(err); +	return ERR_PTR(ret);  }  static void p9_fid_destroy(struct p9_fid *fid)  {  	struct p9_client *clnt; +	unsigned long flags;  	P9_DPRINTK(P9_DEBUG_FID, "fid %d\n", fid->fid);  	clnt = fid->clnt;  	p9_idpool_put(fid->fid, clnt->fidpool); -	spin_lock(&clnt->lock); +	spin_lock_irqsave(&clnt->lock, flags);  	list_del(&fid->flist); -	spin_unlock(&clnt->lock); +	spin_unlock_irqrestore(&clnt->lock, flags);  	kfree(fid);  } @@ -818,7 +818,9 @@ struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid,  	}  	P9_DPRINTK(P9_DEBUG_9P, "<<< RATTACH qid %x.%llx.%x\n", -					qid.type, qid.path, qid.version); +					qid.type, +					(unsigned long long)qid.path, +					qid.version);  	memmove(&fid->qid, &qid, sizeof(struct p9_qid)); @@ -865,7 +867,9 @@ p9_client_auth(struct p9_client *clnt, char *uname, u32 n_uname, char *aname)  	}  	P9_DPRINTK(P9_DEBUG_9P, "<<< RAUTH qid %x.%llx.%x\n", -					qid.type, qid.path, qid.version); +					qid.type, +					(unsigned long long)qid.path, +					qid.version);  	memmove(&afid->qid, &qid, sizeof(struct p9_qid));  	p9_free_req(clnt, req); @@ -930,7 +934,8 @@ struct p9_fid *p9_client_walk(struct p9_fid *oldfid, int nwname, char **wnames,  	for (count = 0; count < nwqids; count++)  		P9_DPRINTK(P9_DEBUG_9P, "<<<     [%d] %x.%llx.%x\n", -			count, wqids[count].type, wqids[count].path, +			count, wqids[count].type, +			(unsigned long long)wqids[count].path,  			wqids[count].version);  	if (nwname) @@ -980,7 +985,9 @@ int p9_client_open(struct p9_fid *fid, int mode)  	}  	P9_DPRINTK(P9_DEBUG_9P, "<<< ROPEN qid %x.%llx.%x iounit %x\n", -				qid.type, qid.path, qid.version, iounit); +				qid.type, +				(unsigned long long)qid.path, +				qid.version, iounit);  	fid->mode = mode;  	fid->iounit = iounit; @@ -1023,7 +1030,9 @@ int p9_client_fcreate(struct p9_fid *fid, char *name, u32 perm, int mode,  	}  	P9_DPRINTK(P9_DEBUG_9P, "<<< RCREATE qid %x.%llx.%x iounit %x\n", -				qid.type, qid.path, qid.version, iounit); +				qid.type, +				(unsigned long long)qid.path, +				qid.version, iounit);  	fid->mode = mode;  	fid->iounit = iounit; @@ -1230,9 +1239,9 @@ struct p9_wstat *p9_client_stat(struct p9_fid *fid)  		"<<<    name=%s uid=%s gid=%s muid=%s extension=(%s)\n"  		"<<<    uid=%d gid=%d n_muid=%d\n",  		ret->size, ret->type, ret->dev, ret->qid.type, -		ret->qid.path, ret->qid.version, ret->mode, -		ret->atime, ret->mtime, ret->length, ret->name, -		ret->uid, ret->gid, ret->muid, ret->extension, +		(unsigned long long)ret->qid.path, ret->qid.version, ret->mode, +		ret->atime, ret->mtime, (unsigned long long)ret->length, +		ret->name, ret->uid, ret->gid, ret->muid, ret->extension,  		ret->n_uid, ret->n_gid, ret->n_muid);  free_and_error: @@ -1255,9 +1264,9 @@ int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst)  		"     name=%s uid=%s gid=%s muid=%s extension=(%s)\n"  		"     uid=%d gid=%d n_muid=%d\n",  		wst->size, wst->type, wst->dev, wst->qid.type, -		wst->qid.path, wst->qid.version, wst->mode, -		wst->atime, wst->mtime, wst->length, wst->name, -		wst->uid, wst->gid, wst->muid, wst->extension, +		(unsigned long long)wst->qid.path, wst->qid.version, wst->mode, +		wst->atime, wst->mtime, (unsigned long long)wst->length, +		wst->name, wst->uid, wst->gid, wst->muid, wst->extension,  		wst->n_uid, wst->n_gid, wst->n_muid);  	err = 0;  	clnt = fid->clnt;  |