|
Lines 3694-3699
static int floppy_open(struct block_device *bdev, fmode_t mode)
Link Here
|
| 3694 |
check_disk_change(bdev); |
3694 |
check_disk_change(bdev); |
| 3695 |
if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags)) |
3695 |
if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags)) |
| 3696 |
goto out; |
3696 |
goto out; |
|
|
3697 |
if (test_bit(FD_DRIVE_BROKEN_BIT, &UDRS->flags)) |
| 3698 |
goto out; |
| 3697 |
} |
3699 |
} |
| 3698 |
res = -EROFS; |
3700 |
res = -EROFS; |
| 3699 |
if ((mode & FMODE_WRITE) && |
3701 |
if ((mode & FMODE_WRITE) && |
|
Lines 3746-3762
static unsigned int floppy_check_events(struct gendisk *disk,
Link Here
|
| 3746 |
* a disk in the drive, and whether that disk is writable. |
3748 |
* a disk in the drive, and whether that disk is writable. |
| 3747 |
*/ |
3749 |
*/ |
| 3748 |
|
3750 |
|
| 3749 |
static void floppy_rb0_complete(struct bio *bio, int err) |
3751 |
struct rb0_cbdata { |
|
|
3752 |
int drive; |
| 3753 |
struct completion complete; |
| 3754 |
}; |
| 3755 |
|
| 3756 |
static void floppy_rb0_cb(struct bio *bio, int err) |
| 3750 |
{ |
3757 |
{ |
| 3751 |
complete((struct completion *)bio->bi_private); |
3758 |
struct rb0_cbdata *cbdata = (struct rb0_cbdata *)bio->bi_private; |
|
|
3759 |
int drive = cbdata->drive; |
| 3760 |
|
| 3761 |
if (err) { |
| 3762 |
printk(KERN_DEBUG "floppy: error %d while reading block 0", err); |
| 3763 |
set_bit(FD_DRIVE_BROKEN_BIT, &UDRS->flags); |
| 3764 |
} |
| 3765 |
complete(&cbdata->complete); |
| 3752 |
} |
3766 |
} |
| 3753 |
|
3767 |
|
| 3754 |
static int __floppy_read_block_0(struct block_device *bdev) |
3768 |
static int __floppy_read_block_0(struct block_device *bdev) |
| 3755 |
{ |
3769 |
{ |
| 3756 |
struct bio bio; |
3770 |
struct bio bio; |
| 3757 |
struct bio_vec bio_vec; |
3771 |
struct bio_vec bio_vec; |
| 3758 |
struct completion complete; |
|
|
| 3759 |
struct page *page; |
3772 |
struct page *page; |
|
|
3773 |
struct rb0_cbdata cbdata; |
| 3760 |
size_t size; |
3774 |
size_t size; |
| 3761 |
|
3775 |
|
| 3762 |
page = alloc_page(GFP_NOIO); |
3776 |
page = alloc_page(GFP_NOIO); |
|
Lines 3779-3791
static int __floppy_read_block_0(struct block_device *bdev)
Link Here
|
| 3779 |
bio.bi_bdev = bdev; |
3793 |
bio.bi_bdev = bdev; |
| 3780 |
bio.bi_sector = 0; |
3794 |
bio.bi_sector = 0; |
| 3781 |
bio.bi_flags = (1 << BIO_QUIET); |
3795 |
bio.bi_flags = (1 << BIO_QUIET); |
| 3782 |
init_completion(&complete); |
3796 |
bio.bi_private = &cbdata; |
| 3783 |
bio.bi_private = &complete; |
3797 |
bio.bi_end_io = floppy_rb0_cb; |
| 3784 |
bio.bi_end_io = floppy_rb0_complete; |
|
|
| 3785 |
|
3798 |
|
| 3786 |
submit_bio(READ, &bio); |
3799 |
submit_bio(READ, &bio); |
| 3787 |
process_fd_request(); |
3800 |
process_fd_request(); |
| 3788 |
wait_for_completion(&complete); |
3801 |
|
|
|
3802 |
init_completion(&cbdata.complete); |
| 3803 |
wait_for_completion(&cbdata.complete); |
| 3789 |
|
3804 |
|
| 3790 |
__free_page(page); |
3805 |
__free_page(page); |
| 3791 |
|
3806 |
|