Commit 1a8a74f0 authored by Tejun Heo's avatar Tejun Heo

floppy,{ami|ata}flop: Convert to bdops->check_events()

Convert the floppy drivers from ->media_changed() to ->check_events().
Both floppy and ataflop buffer media changed state bit and clear them
on revalidation and will behave correctly with kernel event polling.

I can't tell how amiflop clears its event and it's possible that it
may generate spurious events when polled.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Kay Sievers <kay.sievers@vrfy.org>
parent 5b03a1b1
...@@ -1658,12 +1658,12 @@ static int floppy_release(struct gendisk *disk, fmode_t mode) ...@@ -1658,12 +1658,12 @@ static int floppy_release(struct gendisk *disk, fmode_t mode)
} }
/* /*
* floppy-change is never called from an interrupt, so we can relax a bit * check_events is never called from an interrupt, so we can relax a bit
* here, sleep etc. Note that floppy-on tries to set current_DOR to point * here, sleep etc. Note that floppy-on tries to set current_DOR to point
* to the desired drive, but it will probably not survive the sleep if * to the desired drive, but it will probably not survive the sleep if
* several floppies are used at the same time: thus the loop. * several floppies are used at the same time: thus the loop.
*/ */
static int amiga_floppy_change(struct gendisk *disk) static unsigned amiga_check_events(struct gendisk *disk, unsigned int clearing)
{ {
struct amiga_floppy_struct *p = disk->private_data; struct amiga_floppy_struct *p = disk->private_data;
int drive = p - unit; int drive = p - unit;
...@@ -1686,7 +1686,7 @@ static int amiga_floppy_change(struct gendisk *disk) ...@@ -1686,7 +1686,7 @@ static int amiga_floppy_change(struct gendisk *disk)
p->dirty = 0; p->dirty = 0;
writepending = 0; /* if this was true before, too bad! */ writepending = 0; /* if this was true before, too bad! */
writefromint = 0; writefromint = 0;
return 1; return DISK_EVENT_MEDIA_CHANGE;
} }
return 0; return 0;
} }
...@@ -1697,7 +1697,7 @@ static const struct block_device_operations floppy_fops = { ...@@ -1697,7 +1697,7 @@ static const struct block_device_operations floppy_fops = {
.release = floppy_release, .release = floppy_release,
.ioctl = fd_ioctl, .ioctl = fd_ioctl,
.getgeo = fd_getgeo, .getgeo = fd_getgeo,
.media_changed = amiga_floppy_change, .check_events = amiga_check_events,
}; };
static int __init fd_probe_drives(void) static int __init fd_probe_drives(void)
...@@ -1736,6 +1736,7 @@ static int __init fd_probe_drives(void) ...@@ -1736,6 +1736,7 @@ static int __init fd_probe_drives(void)
disk->major = FLOPPY_MAJOR; disk->major = FLOPPY_MAJOR;
disk->first_minor = drive; disk->first_minor = drive;
disk->fops = &floppy_fops; disk->fops = &floppy_fops;
disk->events = DISK_EVENT_MEDIA_CHANGE;
sprintf(disk->disk_name, "fd%d", drive); sprintf(disk->disk_name, "fd%d", drive);
disk->private_data = &unit[drive]; disk->private_data = &unit[drive];
set_capacity(disk, 880*2); set_capacity(disk, 880*2);
......
...@@ -1324,23 +1324,24 @@ static void finish_fdc_done( int dummy ) ...@@ -1324,23 +1324,24 @@ static void finish_fdc_done( int dummy )
* due to unrecognised disk changes. * due to unrecognised disk changes.
*/ */
static int check_floppy_change(struct gendisk *disk) static unsigned int floppy_check_events(struct gendisk *disk,
unsigned int clearing)
{ {
struct atari_floppy_struct *p = disk->private_data; struct atari_floppy_struct *p = disk->private_data;
unsigned int drive = p - unit; unsigned int drive = p - unit;
if (test_bit (drive, &fake_change)) { if (test_bit (drive, &fake_change)) {
/* simulated change (e.g. after formatting) */ /* simulated change (e.g. after formatting) */
return 1; return DISK_EVENT_MEDIA_CHANGE;
} }
if (test_bit (drive, &changed_floppies)) { if (test_bit (drive, &changed_floppies)) {
/* surely changed (the WP signal changed at least once) */ /* surely changed (the WP signal changed at least once) */
return 1; return DISK_EVENT_MEDIA_CHANGE;
} }
if (UD.wpstat) { if (UD.wpstat) {
/* WP is on -> could be changed: to be sure, buffers should be /* WP is on -> could be changed: to be sure, buffers should be
* invalidated... * invalidated...
*/ */
return 1; return DISK_EVENT_MEDIA_CHANGE;
} }
return 0; return 0;
...@@ -1570,7 +1571,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -1570,7 +1571,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode,
* or the next access will revalidate - and clear UDT :-( * or the next access will revalidate - and clear UDT :-(
*/ */
if (check_floppy_change(disk)) if (floppy_check_events(disk, 0))
floppy_revalidate(disk); floppy_revalidate(disk);
if (UD.flags & FTD_MSG) if (UD.flags & FTD_MSG)
...@@ -1904,7 +1905,7 @@ static const struct block_device_operations floppy_fops = { ...@@ -1904,7 +1905,7 @@ static const struct block_device_operations floppy_fops = {
.open = floppy_unlocked_open, .open = floppy_unlocked_open,
.release = floppy_release, .release = floppy_release,
.ioctl = fd_ioctl, .ioctl = fd_ioctl,
.media_changed = check_floppy_change, .check_events = floppy_check_events,
.revalidate_disk= floppy_revalidate, .revalidate_disk= floppy_revalidate,
}; };
...@@ -1963,6 +1964,7 @@ static int __init atari_floppy_init (void) ...@@ -1963,6 +1964,7 @@ static int __init atari_floppy_init (void)
unit[i].disk->first_minor = i; unit[i].disk->first_minor = i;
sprintf(unit[i].disk->disk_name, "fd%d", i); sprintf(unit[i].disk->disk_name, "fd%d", i);
unit[i].disk->fops = &floppy_fops; unit[i].disk->fops = &floppy_fops;
unit[i].disk->events = DISK_EVENT_MEDIA_CHANGE;
unit[i].disk->private_data = &unit[i]; unit[i].disk->private_data = &unit[i];
unit[i].disk->queue = blk_init_queue(do_fd_request, unit[i].disk->queue = blk_init_queue(do_fd_request,
&ataflop_lock); &ataflop_lock);
......
...@@ -3770,13 +3770,14 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) ...@@ -3770,13 +3770,14 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
/* /*
* Check if the disk has been changed or if a change has been faked. * Check if the disk has been changed or if a change has been faked.
*/ */
static int check_floppy_change(struct gendisk *disk) static unsigned int floppy_check_events(struct gendisk *disk,
unsigned int clearing)
{ {
int drive = (long)disk->private_data; int drive = (long)disk->private_data;
if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) || if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
test_bit(FD_VERIFY_BIT, &UDRS->flags)) test_bit(FD_VERIFY_BIT, &UDRS->flags))
return 1; return DISK_EVENT_MEDIA_CHANGE;
if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) { if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
lock_fdc(drive, false); lock_fdc(drive, false);
...@@ -3788,7 +3789,7 @@ static int check_floppy_change(struct gendisk *disk) ...@@ -3788,7 +3789,7 @@ static int check_floppy_change(struct gendisk *disk)
test_bit(FD_VERIFY_BIT, &UDRS->flags) || test_bit(FD_VERIFY_BIT, &UDRS->flags) ||
test_bit(drive, &fake_change) || test_bit(drive, &fake_change) ||
drive_no_geom(drive)) drive_no_geom(drive))
return 1; return DISK_EVENT_MEDIA_CHANGE;
return 0; return 0;
} }
...@@ -3898,7 +3899,7 @@ static const struct block_device_operations floppy_fops = { ...@@ -3898,7 +3899,7 @@ static const struct block_device_operations floppy_fops = {
.release = floppy_release, .release = floppy_release,
.ioctl = fd_ioctl, .ioctl = fd_ioctl,
.getgeo = fd_getgeo, .getgeo = fd_getgeo,
.media_changed = check_floppy_change, .check_events = floppy_check_events,
.revalidate_disk = floppy_revalidate, .revalidate_disk = floppy_revalidate,
}; };
...@@ -4205,6 +4206,7 @@ static int __init floppy_init(void) ...@@ -4205,6 +4206,7 @@ static int __init floppy_init(void)
disks[dr]->major = FLOPPY_MAJOR; disks[dr]->major = FLOPPY_MAJOR;
disks[dr]->first_minor = TOMINOR(dr); disks[dr]->first_minor = TOMINOR(dr);
disks[dr]->fops = &floppy_fops; disks[dr]->fops = &floppy_fops;
disks[dr]->events = DISK_EVENT_MEDIA_CHANGE;
sprintf(disks[dr]->disk_name, "fd%d", dr); sprintf(disks[dr]->disk_name, "fd%d", dr);
init_timer(&motor_off_timer[dr]); init_timer(&motor_off_timer[dr]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment