diff options
| author | Linus Torvalds <[email protected]> | 2010-03-05 13:25:24 -0800 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2010-03-05 13:25:24 -0800 | 
| commit | b13d3c6e8ab6ac53e8c1858a9c837cb6ba3bbef0 (patch) | |
| tree | 4c0b6cba4975b0d7871096e0a99406d450b0272f /net/9p/protocol.c | |
| parent | e213e26ab3988c516c06eba4dcd030ac052f6dc9 (diff) | |
| parent | 5717144a01d701614cfdb15f09ed562d720cf3db (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs:
  fs/9p: Add hardlink support to .u extension
  9P2010.L handshake: .L protocol negotiation
  9P2010.L handshake: Remove "dotu" variable
  9P2010.L handshake: Add mount option
  9P2010.L handshake: Add VFS flags
  net/9p: Handle mount errors correctly.
  net/9p: Remove MAX_9P_CHAN limit
  net/9p: Add multi channel support.
Diffstat (limited to 'net/9p/protocol.c')
| -rw-r--r-- | net/9p/protocol.c | 74 | 
1 files changed, 41 insertions, 33 deletions
| diff --git a/net/9p/protocol.c b/net/9p/protocol.c index fc70147c771e..94f5a8f65e9c 100644 --- a/net/9p/protocol.c +++ b/net/9p/protocol.c @@ -52,7 +52,7 @@  #endif  static int -p9pdu_writef(struct p9_fcall *pdu, int optional, const char *fmt, ...); +p9pdu_writef(struct p9_fcall *pdu, int proto_version, const char *fmt, ...);  #ifdef CONFIG_NET_9P_DEBUG  void @@ -144,7 +144,8 @@ pdu_write_u(struct p9_fcall *pdu, const char __user *udata, size_t size)  */  static int -p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap) +p9pdu_vreadf(struct p9_fcall *pdu, int proto_version, const char *fmt, +	va_list ap)  {  	const char *ptr;  	int errcode = 0; @@ -194,7 +195,8 @@ p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				int16_t len;  				int size; -				errcode = p9pdu_readf(pdu, optional, "w", &len); +				errcode = p9pdu_readf(pdu, proto_version, +								"w", &len);  				if (errcode)  					break; @@ -217,7 +219,7 @@ p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				struct p9_qid *qid =  				    va_arg(ap, struct p9_qid *); -				errcode = p9pdu_readf(pdu, optional, "bdq", +				errcode = p9pdu_readf(pdu, proto_version, "bdq",  						      &qid->type, &qid->version,  						      &qid->path);  			} @@ -230,7 +232,7 @@ p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				stbuf->n_uid = stbuf->n_gid = stbuf->n_muid =  									-1;  				errcode = -				    p9pdu_readf(pdu, optional, +				    p9pdu_readf(pdu, proto_version,  						"wwdQdddqssss?sddd",  						&stbuf->size, &stbuf->type,  						&stbuf->dev, &stbuf->qid, @@ -250,7 +252,7 @@ p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				void **data = va_arg(ap, void **);  				errcode = -				    p9pdu_readf(pdu, optional, "d", count); +				    p9pdu_readf(pdu, proto_version, "d", count);  				if (!errcode) {  					*count =  					    MIN(*count, @@ -263,8 +265,8 @@ p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				int16_t *nwname = va_arg(ap, int16_t *);  				char ***wnames = va_arg(ap, char ***); -				errcode = -				    p9pdu_readf(pdu, optional, "w", nwname); +				errcode = p9pdu_readf(pdu, proto_version, +								"w", nwname);  				if (!errcode) {  					*wnames =  					    kmalloc(sizeof(char *) * *nwname, @@ -278,7 +280,8 @@ p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  					for (i = 0; i < *nwname; i++) {  						errcode = -						    p9pdu_readf(pdu, optional, +						    p9pdu_readf(pdu, +								proto_version,  								"s",  								&(*wnames)[i]);  						if (errcode) @@ -306,7 +309,7 @@ p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				*wqids = NULL;  				errcode = -				    p9pdu_readf(pdu, optional, "w", nwqid); +				    p9pdu_readf(pdu, proto_version, "w", nwqid);  				if (!errcode) {  					*wqids =  					    kmalloc(*nwqid * @@ -321,7 +324,8 @@ p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  					for (i = 0; i < *nwqid; i++) {  						errcode = -						    p9pdu_readf(pdu, optional, +						    p9pdu_readf(pdu, +								proto_version,  								"Q",  								&(*wqids)[i]);  						if (errcode) @@ -336,7 +340,7 @@ p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  			}  			break;  		case '?': -			if (!optional) +			if (proto_version != p9_proto_2000u)  				return 0;  			break;  		default: @@ -352,7 +356,8 @@ p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  }  int -p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap) +p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt, +	va_list ap)  {  	const char *ptr;  	int errcode = 0; @@ -389,7 +394,8 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				if (sptr)  					len = MIN(strlen(sptr), USHORT_MAX); -				errcode = p9pdu_writef(pdu, optional, "w", len); +				errcode = p9pdu_writef(pdu, proto_version, +								"w", len);  				if (!errcode && pdu_write(pdu, sptr, len))  					errcode = -EFAULT;  			} @@ -398,7 +404,7 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				const struct p9_qid *qid =  				    va_arg(ap, const struct p9_qid *);  				errcode = -				    p9pdu_writef(pdu, optional, "bdq", +				    p9pdu_writef(pdu, proto_version, "bdq",  						 qid->type, qid->version,  						 qid->path);  			} break; @@ -406,7 +412,7 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				const struct p9_wstat *stbuf =  				    va_arg(ap, const struct p9_wstat *);  				errcode = -				    p9pdu_writef(pdu, optional, +				    p9pdu_writef(pdu, proto_version,  						 "wwdQdddqssss?sddd",  						 stbuf->size, stbuf->type,  						 stbuf->dev, &stbuf->qid, @@ -421,8 +427,8 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				int32_t count = va_arg(ap, int32_t);  				const void *data = va_arg(ap, const void *); -				errcode = -				    p9pdu_writef(pdu, optional, "d", count); +				errcode = p9pdu_writef(pdu, proto_version, "d", +									count);  				if (!errcode && pdu_write(pdu, data, count))  					errcode = -EFAULT;  			} @@ -431,8 +437,8 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				int32_t count = va_arg(ap, int32_t);  				const char __user *udata =  						va_arg(ap, const void __user *); -				errcode = -				    p9pdu_writef(pdu, optional, "d", count); +				errcode = p9pdu_writef(pdu, proto_version, "d", +									count);  				if (!errcode && pdu_write_u(pdu, udata, count))  					errcode = -EFAULT;  			} @@ -441,14 +447,15 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				int16_t nwname = va_arg(ap, int);  				const char **wnames = va_arg(ap, const char **); -				errcode = -				    p9pdu_writef(pdu, optional, "w", nwname); +				errcode = p9pdu_writef(pdu, proto_version, "w", +									nwname);  				if (!errcode) {  					int i;  					for (i = 0; i < nwname; i++) {  						errcode = -						    p9pdu_writef(pdu, optional, +						    p9pdu_writef(pdu, +								proto_version,  								 "s",  								 wnames[i]);  						if (errcode) @@ -462,14 +469,15 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  				struct p9_qid *wqids =  				    va_arg(ap, struct p9_qid *); -				errcode = -				    p9pdu_writef(pdu, optional, "w", nwqid); +				errcode = p9pdu_writef(pdu, proto_version, "w", +									nwqid);  				if (!errcode) {  					int i;  					for (i = 0; i < nwqid; i++) {  						errcode = -						    p9pdu_writef(pdu, optional, +						    p9pdu_writef(pdu, +								proto_version,  								 "Q",  								 &wqids[i]);  						if (errcode) @@ -479,7 +487,7 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  			}  			break;  		case '?': -			if (!optional) +			if (proto_version != p9_proto_2000u)  				return 0;  			break;  		default: @@ -494,32 +502,32 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap)  	return errcode;  } -int p9pdu_readf(struct p9_fcall *pdu, int optional, const char *fmt, ...) +int p9pdu_readf(struct p9_fcall *pdu, int proto_version, const char *fmt, ...)  {  	va_list ap;  	int ret;  	va_start(ap, fmt); -	ret = p9pdu_vreadf(pdu, optional, fmt, ap); +	ret = p9pdu_vreadf(pdu, proto_version, fmt, ap);  	va_end(ap);  	return ret;  }  static int -p9pdu_writef(struct p9_fcall *pdu, int optional, const char *fmt, ...) +p9pdu_writef(struct p9_fcall *pdu, int proto_version, const char *fmt, ...)  {  	va_list ap;  	int ret;  	va_start(ap, fmt); -	ret = p9pdu_vwritef(pdu, optional, fmt, ap); +	ret = p9pdu_vwritef(pdu, proto_version, fmt, ap);  	va_end(ap);  	return ret;  } -int p9stat_read(char *buf, int len, struct p9_wstat *st, int dotu) +int p9stat_read(char *buf, int len, struct p9_wstat *st, int proto_version)  {  	struct p9_fcall fake_pdu;  	int ret; @@ -529,7 +537,7 @@ int p9stat_read(char *buf, int len, struct p9_wstat *st, int dotu)  	fake_pdu.sdata = buf;  	fake_pdu.offset = 0; -	ret = p9pdu_readf(&fake_pdu, dotu, "S", st); +	ret = p9pdu_readf(&fake_pdu, proto_version, "S", st);  	if (ret) {  		P9_DPRINTK(P9_DEBUG_9P, "<<< p9stat_read failed: %d\n", ret);  		p9pdu_dump(1, &fake_pdu); |