Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'for-linus-4.5-merge-window' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs

Pull 9p updates from Eric Van Hensbergen:
"Sorry for the last minute pull request, there's was a change that
didn't get pulled into for-next until two weeks ago and I wanted to
give it some bake time.

Summary:

Rework and error handling fixes, primarily in the fscatch and fd
transports"

* tag 'for-linus-4.5-merge-window' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs:
fs/9p: use fscache mutex rather than spinlock
9p: trans_fd, bail out if recv fcall if missing
9p: trans_fd, read rework to use p9_parse_header
net/9p: Add device name details on error

+47 -43
+46 -42
net/9p/trans_fd.c
··· 108 108 * @unsent_req_list: accounting for requests that haven't been sent 109 109 * @req: current request being processed (if any) 110 110 * @tmp_buf: temporary buffer to read in header 111 - * @rsize: amount to read for current frame 112 - * @rpos: read position in current frame 113 - * @rbuf: current read buffer 111 + * @rc: temporary fcall for reading current frame 114 112 * @wpos: write position for current frame 115 113 * @wsize: amount of data to write for current frame 116 114 * @wbuf: current write buffer ··· 129 131 struct list_head unsent_req_list; 130 132 struct p9_req_t *req; 131 133 char tmp_buf[7]; 132 - int rsize; 133 - int rpos; 134 - char *rbuf; 134 + struct p9_fcall rc; 135 135 int wpos; 136 136 int wsize; 137 137 char *wbuf; ··· 301 305 if (m->err < 0) 302 306 return; 303 307 304 - p9_debug(P9_DEBUG_TRANS, "start mux %p pos %d\n", m, m->rpos); 308 + p9_debug(P9_DEBUG_TRANS, "start mux %p pos %zd\n", m, m->rc.offset); 305 309 306 - if (!m->rbuf) { 307 - m->rbuf = m->tmp_buf; 308 - m->rpos = 0; 309 - m->rsize = 7; /* start by reading header */ 310 + if (!m->rc.sdata) { 311 + m->rc.sdata = m->tmp_buf; 312 + m->rc.offset = 0; 313 + m->rc.capacity = 7; /* start by reading header */ 310 314 } 311 315 312 316 clear_bit(Rpending, &m->wsched); 313 - p9_debug(P9_DEBUG_TRANS, "read mux %p pos %d size: %d = %d\n", 314 - m, m->rpos, m->rsize, m->rsize-m->rpos); 315 - err = p9_fd_read(m->client, m->rbuf + m->rpos, 316 - m->rsize - m->rpos); 317 + p9_debug(P9_DEBUG_TRANS, "read mux %p pos %zd size: %zd = %zd\n", 318 + m, m->rc.offset, m->rc.capacity, 319 + m->rc.capacity - m->rc.offset); 320 + err = p9_fd_read(m->client, m->rc.sdata + m->rc.offset, 321 + m->rc.capacity - m->rc.offset); 317 322 p9_debug(P9_DEBUG_TRANS, "mux %p got %d bytes\n", m, err); 318 - if (err == -EAGAIN) { 323 + if (err == -EAGAIN) 319 324 goto end_clear; 320 - } 321 325 322 326 if (err <= 0) 323 327 goto error; 324 328 325 - m->rpos += err; 329 + m->rc.offset += err; 326 330 327 - if ((!m->req) && (m->rpos == m->rsize)) { /* header read in */ 328 - u16 tag; 331 + /* header read in */ 332 + if ((!m->req) && (m->rc.offset == m->rc.capacity)) { 329 333 p9_debug(P9_DEBUG_TRANS, "got new header\n"); 330 334 331 - n = le32_to_cpu(*(__le32 *) m->rbuf); /* read packet size */ 332 - if (n >= m->client->msize) { 335 + err = p9_parse_header(&m->rc, NULL, NULL, NULL, 0); 336 + if (err) { 333 337 p9_debug(P9_DEBUG_ERROR, 334 - "requested packet size too big: %d\n", n); 338 + "error parsing header: %d\n", err); 339 + goto error; 340 + } 341 + 342 + if (m->rc.size >= m->client->msize) { 343 + p9_debug(P9_DEBUG_ERROR, 344 + "requested packet size too big: %d\n", 345 + m->rc.size); 335 346 err = -EIO; 336 347 goto error; 337 348 } 338 349 339 - tag = le16_to_cpu(*(__le16 *) (m->rbuf+5)); /* read tag */ 340 350 p9_debug(P9_DEBUG_TRANS, 341 - "mux %p pkt: size: %d bytes tag: %d\n", m, n, tag); 351 + "mux %p pkt: size: %d bytes tag: %d\n", 352 + m, m->rc.size, m->rc.tag); 342 353 343 - m->req = p9_tag_lookup(m->client, tag); 354 + m->req = p9_tag_lookup(m->client, m->rc.tag); 344 355 if (!m->req || (m->req->status != REQ_STATUS_SENT)) { 345 356 p9_debug(P9_DEBUG_ERROR, "Unexpected packet tag %d\n", 346 - tag); 357 + m->rc.tag); 347 358 err = -EIO; 348 359 goto error; 349 360 } 350 361 351 362 if (m->req->rc == NULL) { 352 - m->req->rc = kmalloc(sizeof(struct p9_fcall) + 353 - m->client->msize, GFP_NOFS); 354 - if (!m->req->rc) { 355 - m->req = NULL; 356 - err = -ENOMEM; 357 - goto error; 358 - } 363 + p9_debug(P9_DEBUG_ERROR, 364 + "No recv fcall for tag %d (req %p), disconnecting!\n", 365 + m->rc.tag, m->req); 366 + m->req = NULL; 367 + err = -EIO; 368 + goto error; 359 369 } 360 - m->rbuf = (char *)m->req->rc + sizeof(struct p9_fcall); 361 - memcpy(m->rbuf, m->tmp_buf, m->rsize); 362 - m->rsize = n; 370 + m->rc.sdata = (char *)m->req->rc + sizeof(struct p9_fcall); 371 + memcpy(m->rc.sdata, m->tmp_buf, m->rc.capacity); 372 + m->rc.capacity = m->rc.size; 363 373 } 364 374 365 - /* not an else because some packets (like clunk) have no payload */ 366 - if ((m->req) && (m->rpos == m->rsize)) { /* packet is read in */ 375 + /* packet is read in 376 + * not an else because some packets (like clunk) have no payload 377 + */ 378 + if ((m->req) && (m->rc.offset == m->rc.capacity)) { 367 379 p9_debug(P9_DEBUG_TRANS, "got new packet\n"); 368 380 spin_lock(&m->client->lock); 369 381 if (m->req->status != REQ_STATUS_ERROR) ··· 379 375 list_del(&m->req->req_list); 380 376 spin_unlock(&m->client->lock); 381 377 p9_client_cb(m->client, m->req, status); 382 - m->rbuf = NULL; 383 - m->rpos = 0; 384 - m->rsize = 0; 378 + m->rc.sdata = NULL; 379 + m->rc.offset = 0; 380 + m->rc.capacity = 0; 385 381 m->req = NULL; 386 382 } 387 383
+1 -1
net/9p/trans_virtio.c
··· 658 658 mutex_unlock(&virtio_9p_lock); 659 659 660 660 if (!found) { 661 - pr_err("no channels available\n"); 661 + pr_err("no channels available for device %s\n", devname); 662 662 return ret; 663 663 } 664 664