View | Details | Raw Unified | Return to bug 848796
Collapse All | Expand All

(-)a/drivers/block/floppy.c (-7 / +22 lines)
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
(-)a/include/uapi/linux/fd.h (-2 / +2 lines)
Lines 185-191 enum { Link Here
185
				 * to clear media change status */
185
				 * to clear media change status */
186
	FD_UNUSED_BIT,
186
	FD_UNUSED_BIT,
187
	FD_DISK_CHANGED_BIT,	/* disk has been changed since last i/o */
187
	FD_DISK_CHANGED_BIT,	/* disk has been changed since last i/o */
188
	FD_DISK_WRITABLE_BIT	/* disk is writable */
188
	FD_DISK_WRITABLE_BIT,	/* disk is writable */
189
	FD_DRIVE_BROKEN_BIT
189
};
190
};
190
191
191
#define FDSETDRVPRM _IOW(2, 0x90, struct floppy_drive_params)
192
#define FDSETDRVPRM _IOW(2, 0x90, struct floppy_drive_params)
192
- 

Return to bug 848796