383 } else
384 req_pack_id = old_hdr->pack_id;
385 }
386 srp = sg_get_rq_mark(sfp, req_pack_id);
387 if (!srp) {
388 if (sdp->detached) {
389 retval = -ENODEV;
390 goto free_old_hdr;
391 }
392 if (filp->f_flags & O_NONBLOCK) {
393 retval = -EAGAIN;
394 goto free_old_hdr;
395 }
396 while (1) {
397 retval = 0;
398 __wait_event_interruptible(sfp->read_wait,
399 (sdp->detached ||
400 (srp = sg_get_rq_mark(sfp, req_pack_id))),
401 retval);
402 if (sdp->detached) {
403 retval = -ENODEV;
404 goto free_old_hdr;
405 }
406 if (0 == retval)
407 break;
408
409
410 goto free_old_hdr;
411 }
412 }
413 if (srp->header.interface_id != '\0') {
414 retval = sg_new_read(sfp, buf, count, srp);
415 goto free_old_hdr;
416 }
417
418 hp = &srp->header;
419 if (old_hdr == NULL) {
420 old_hdr = kmalloc(SZ_SG_HEADER, GFP_KERNEL);
421 if (! old_hdr) {
422 retval = -ENOMEM;
423 goto free_old_hdr;