From: Jens Axboe <axboe@suse.de>
To: "Peter T. Breuer" <ptb@it.uc3m.es>
Cc: paul@paulbristow.net, linux kernel <linux-kernel@vger.kernel.org>
Subject: Re: floppy driver 2.6.3 question
Date: Thu, 18 Mar 2004 08:14:18 +0100 [thread overview]
Message-ID: <20040318071418.GB1072@suse.de> (raw)
In-Reply-To: <200403172002.i2HK2GV10366@oboe.it.uc3m.es>
On Wed, Mar 17 2004, Peter T. Breuer wrote:
>
>
> In the 2.6.3 floppy driver, when the driver is asked to revalidate by
> kernel check_disk_change (after the latter asks and the floppy signalled
> media_changed), the floppy driver constructs a read bio for the first
> block and submits it via submit_bio, and waits for completion of the
> bio.
>
> However, the bio's embedded completion only signals back if the
> submitted bio was successful, as far as I can tell:
>
>
> static int floppy_rb0_complete(struct bio *bio, unsigned int bytes_done, int err)
> {
> if (bio->bi_size)
> return 1;
>
> complete((struct completion*)bio->bi_private);
> return 0;
> }
>
> Note that if the bi_size is nonzero, we return without signalling. Now
> bi_size starts out nozero
>
> bio.bi_size = size;
>
> but I _think_ bi_size is zeroed along the way somewhere in end_request
> (who knows?) if all goes well, so that nonzero means we still have more
> to do in this bio. So if things go badly, completion is never signalled
> and the submitted read is waited for forever? (and the result is never
> tested).
You are completely missing how it works... ->bi_end_io() is invoked on
every io completion event that the hardware generates, but typically
most only care about the final completion (and not any eventual partial
completions along the way).
So driver calls end_request* which does a bio_endio() on the number of
sectors passed in, which in turn decrements bio->bi_size. _If_
bio->bi_size never hits zero, then you have a driver bug. If things 'go
badly', then the driver will signal unsuccessful completion of X
sectors.
>
> submit_bio(READ, &bio);
> generic_unplug_device(bdev_get_queue(bdev));
> process_fd_request();
> wait_for_completion(&complete);
>
> __free_page(page);
>
> My reading therefore is that we cannot do revalidation until we are
> sure that the floppy is there. If we feel sure, but are wrong, the
> test read of the first block will hang during the revalidation.
Wrong.
--
Jens Axboe
next prev parent reply other threads:[~2004-03-18 7:14 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-03-17 20:02 floppy driver 2.6.3 question Peter T. Breuer
2004-03-18 7:14 ` Jens Axboe [this message]
2004-03-18 8:23 ` Peter T. Breuer
2004-03-18 9:10 ` Jens Axboe
2004-03-18 10:05 ` Peter T. Breuer
2004-03-18 11:35 ` Jens Axboe
2004-03-18 12:23 ` Peter T. Breuer
2004-03-18 12:28 ` Jens Axboe
2004-03-18 13:25 ` Peter T. Breuer
2004-03-18 13:31 ` Jens Axboe
2004-03-18 16:06 ` Peter T. Breuer
2004-03-18 16:16 ` Jens Axboe
2004-03-18 18:11 ` Peter T. Breuer
2004-03-18 19:05 ` Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040318071418.GB1072@suse.de \
--to=axboe@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=paul@paulbristow.net \
--cc=ptb@it.uc3m.es \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox