Commit 8d9d34e2 authored by Willy Tarreau's avatar Willy Tarreau Committed by Jens Axboe

floppy: cleanup: expand macro UDRS

This macro doesn't bring much value and only slightly obfuscates the
code by silently using local variable "drive", let's expand it.

Link: https://lore.kernel.org/r/20200224212352.8640-5-w@1wt.euSigned-off-by: default avatarWilly Tarreau <w@1wt.eu>
Signed-off-by: default avatarDenis Efremov <efremov@linux.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 1ce9ae96
...@@ -310,7 +310,6 @@ static bool initialized; ...@@ -310,7 +310,6 @@ static bool initialized;
#define DRS (&drive_state[current_drive]) #define DRS (&drive_state[current_drive])
#define DRWE (&write_errors[current_drive]) #define DRWE (&write_errors[current_drive])
#define UDRS (&drive_state[drive])
#define UDRWE (&write_errors[drive]) #define UDRWE (&write_errors[drive])
#define PH_HEAD(floppy, head) (((((floppy)->stretch & 2) >> 1) ^ head) << 2) #define PH_HEAD(floppy, head) (((((floppy)->stretch & 2) >> 1) ^ head) << 2)
...@@ -603,7 +602,7 @@ static unsigned char in_sector_offset; /* offset within physical sector, ...@@ -603,7 +602,7 @@ static unsigned char in_sector_offset; /* offset within physical sector,
static inline bool drive_no_geom(int drive) static inline bool drive_no_geom(int drive)
{ {
return !current_type[drive] && !ITYPE(UDRS->fd_device); return !current_type[drive] && !ITYPE(drive_state[drive].fd_device);
} }
#ifndef fd_eject #ifndef fd_eject
...@@ -737,7 +736,7 @@ static int disk_change(int drive) ...@@ -737,7 +736,7 @@ static int disk_change(int drive)
{ {
int fdc = FDC(drive); int fdc = FDC(drive);
if (time_before(jiffies, UDRS->select_date + drive_params[drive].select_delay)) if (time_before(jiffies, drive_state[drive].select_date + drive_params[drive].select_delay))
DPRINT("WARNING disk change called early\n"); DPRINT("WARNING disk change called early\n");
if (!(fdc_state[fdc].dor & (0x10 << UNIT(drive))) || if (!(fdc_state[fdc].dor & (0x10 << UNIT(drive))) ||
(fdc_state[fdc].dor & 3) != UNIT(drive) || fdc != FDC(drive)) { (fdc_state[fdc].dor & 3) != UNIT(drive) || fdc != FDC(drive)) {
...@@ -751,19 +750,22 @@ static int disk_change(int drive) ...@@ -751,19 +750,22 @@ static int disk_change(int drive)
debug_dcl(drive_params[drive].flags, "jiffies=%lu\n", jiffies); debug_dcl(drive_params[drive].flags, "jiffies=%lu\n", jiffies);
debug_dcl(drive_params[drive].flags, "disk change line=%x\n", debug_dcl(drive_params[drive].flags, "disk change line=%x\n",
fd_inb(FD_DIR) & 0x80); fd_inb(FD_DIR) & 0x80);
debug_dcl(drive_params[drive].flags, "flags=%lx\n", UDRS->flags); debug_dcl(drive_params[drive].flags, "flags=%lx\n",
drive_state[drive].flags);
if (drive_params[drive].flags & FD_BROKEN_DCL) if (drive_params[drive].flags & FD_BROKEN_DCL)
return test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags); return test_bit(FD_DISK_CHANGED_BIT,
&drive_state[drive].flags);
if ((fd_inb(FD_DIR) ^ drive_params[drive].flags) & 0x80) { if ((fd_inb(FD_DIR) ^ drive_params[drive].flags) & 0x80) {
set_bit(FD_VERIFY_BIT, &UDRS->flags); set_bit(FD_VERIFY_BIT, &drive_state[drive].flags);
/* verify write protection */ /* verify write protection */
if (UDRS->maxblock) /* mark it changed */ if (drive_state[drive].maxblock) /* mark it changed */
set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags); set_bit(FD_DISK_CHANGED_BIT,
&drive_state[drive].flags);
/* invalidate its geometry */ /* invalidate its geometry */
if (UDRS->keep_data >= 0) { if (drive_state[drive].keep_data >= 0) {
if ((drive_params[drive].flags & FTD_MSG) && if ((drive_params[drive].flags & FTD_MSG) &&
current_type[drive] != NULL) current_type[drive] != NULL)
DPRINT("Disk type is undefined after disk change\n"); DPRINT("Disk type is undefined after disk change\n");
...@@ -773,8 +775,8 @@ static int disk_change(int drive) ...@@ -773,8 +775,8 @@ static int disk_change(int drive)
return 1; return 1;
} else { } else {
UDRS->last_checked = jiffies; drive_state[drive].last_checked = jiffies;
clear_bit(FD_DISK_NEWCHANGE_BIT, &UDRS->flags); clear_bit(FD_DISK_NEWCHANGE_BIT, &drive_state[drive].flags);
} }
return 0; return 0;
} }
...@@ -816,7 +818,7 @@ static int set_dor(int fdc, char mask, char data) ...@@ -816,7 +818,7 @@ static int set_dor(int fdc, char mask, char data)
unit = newdor & 0x3; unit = newdor & 0x3;
if (!is_selected(olddor, unit) && is_selected(newdor, unit)) { if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
drive = REVDRIVE(fdc, unit); drive = REVDRIVE(fdc, unit);
UDRS->select_date = jiffies; drive_state[drive].select_date = jiffies;
} }
} }
return olddor; return olddor;
...@@ -844,8 +846,8 @@ static void reset_fdc_info(int mode) ...@@ -844,8 +846,8 @@ static void reset_fdc_info(int mode)
fdc_state[fdc].perp_mode = 1; fdc_state[fdc].perp_mode = 1;
fdc_state[fdc].rawcmd = 0; fdc_state[fdc].rawcmd = 0;
for (drive = 0; drive < N_DRIVE; drive++) for (drive = 0; drive < N_DRIVE; drive++)
if (FDC(drive) == fdc && (mode || UDRS->track != NEED_1_RECAL)) if (FDC(drive) == fdc && (mode || drive_state[drive].track != NEED_1_RECAL))
UDRS->track = NEED_2_RECAL; drive_state[drive].track = NEED_2_RECAL;
} }
/* selects the fdc and drive, and enables the fdc's input/dma. */ /* selects the fdc and drive, and enables the fdc's input/dma. */
...@@ -930,7 +932,7 @@ static void floppy_off(unsigned int drive) ...@@ -930,7 +932,7 @@ static void floppy_off(unsigned int drive)
/* make spindle stop in a position which minimizes spinup time /* make spindle stop in a position which minimizes spinup time
* next time */ * next time */
if (drive_params[drive].rps) { if (drive_params[drive].rps) {
delta = jiffies - UDRS->first_read_date + HZ - delta = jiffies - drive_state[drive].first_read_date + HZ -
drive_params[drive].spindown_offset; drive_params[drive].spindown_offset;
delta = ((delta * drive_params[drive].rps) % HZ) / drive_params[drive].rps; delta = ((delta * drive_params[drive].rps) % HZ) / drive_params[drive].rps;
motor_off_timer[drive].expires = motor_off_timer[drive].expires =
...@@ -956,7 +958,7 @@ static void scandrives(void) ...@@ -956,7 +958,7 @@ static void scandrives(void)
saved_drive = current_drive; saved_drive = current_drive;
for (i = 0; i < N_DRIVE; i++) { for (i = 0; i < N_DRIVE; i++) {
drive = (saved_drive + i + 1) % N_DRIVE; drive = (saved_drive + i + 1) % N_DRIVE;
if (UDRS->fd_ref == 0 || drive_params[drive].select_delay != 0) if (drive_state[drive].fd_ref == 0 || drive_params[drive].select_delay != 0)
continue; /* skip closed drives */ continue; /* skip closed drives */
set_fdc(drive); set_fdc(drive);
if (!(set_dor(fdc, ~3, UNIT(drive) | (0x10 << UNIT(drive))) & if (!(set_dor(fdc, ~3, UNIT(drive) | (0x10 << UNIT(drive))) &
...@@ -2065,7 +2067,7 @@ static void bad_flp_intr(void) ...@@ -2065,7 +2067,7 @@ static void bad_flp_intr(void)
static void set_floppy(int drive) static void set_floppy(int drive)
{ {
int type = ITYPE(UDRS->fd_device); int type = ITYPE(drive_state[drive].fd_device);
if (type) if (type)
_floppy = floppy_type + type; _floppy = floppy_type + type;
...@@ -3183,11 +3185,11 @@ static int raw_cmd_ioctl(int cmd, void __user *param) ...@@ -3183,11 +3185,11 @@ static int raw_cmd_ioctl(int cmd, void __user *param)
if (FDC(drive) != fdc) if (FDC(drive) != fdc)
continue; continue;
if (drive == current_drive) { if (drive == current_drive) {
if (UDRS->fd_ref > 1) { if (drive_state[drive].fd_ref > 1) {
fdc_state[fdc].rawcmd = 2; fdc_state[fdc].rawcmd = 2;
break; break;
} }
} else if (UDRS->fd_ref) { } else if (drive_state[drive].fd_ref) {
fdc_state[fdc].rawcmd = 2; fdc_state[fdc].rawcmd = 2;
break; break;
} }
...@@ -3405,7 +3407,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int ...@@ -3405,7 +3407,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
unsigned long param) unsigned long param)
{ {
int drive = (long)bdev->bd_disk->private_data; int drive = (long)bdev->bd_disk->private_data;
int type = ITYPE(UDRS->fd_device); int type = ITYPE(drive_state[drive].fd_device);
int i; int i;
int ret; int ret;
int size; int size;
...@@ -3453,7 +3455,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int ...@@ -3453,7 +3455,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
switch (cmd) { switch (cmd) {
case FDEJECT: case FDEJECT:
if (UDRS->fd_ref != 1) if (drive_state[drive].fd_ref != 1)
/* somebody else has this drive open */ /* somebody else has this drive open */
return -EBUSY; return -EBUSY;
if (lock_fdc(drive)) if (lock_fdc(drive))
...@@ -3463,8 +3465,8 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int ...@@ -3463,8 +3465,8 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
* non-Sparc architectures */ * non-Sparc architectures */
ret = fd_eject(UNIT(drive)); ret = fd_eject(UNIT(drive));
set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags); set_bit(FD_DISK_CHANGED_BIT, &drive_state[drive].flags);
set_bit(FD_VERIFY_BIT, &UDRS->flags); set_bit(FD_VERIFY_BIT, &drive_state[drive].flags);
process_fd_request(); process_fd_request();
return ret; return ret;
case FDCLRPRM: case FDCLRPRM:
...@@ -3472,7 +3474,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int ...@@ -3472,7 +3474,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
return -EINTR; return -EINTR;
current_type[drive] = NULL; current_type[drive] = NULL;
floppy_sizes[drive] = MAX_DISK_SIZE << 1; floppy_sizes[drive] = MAX_DISK_SIZE << 1;
UDRS->keep_data = 0; drive_state[drive].keep_data = 0;
return invalidate_drive(bdev); return invalidate_drive(bdev);
case FDSETPRM: case FDSETPRM:
case FDDEFPRM: case FDDEFPRM:
...@@ -3497,7 +3499,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int ...@@ -3497,7 +3499,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
return -EINTR; return -EINTR;
if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR) if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
return -EINTR; return -EINTR;
ret = UDRS->flags; ret = drive_state[drive].flags;
process_fd_request(); process_fd_request();
if (ret & FD_VERIFY) if (ret & FD_VERIFY)
return -ENODEV; return -ENODEV;
...@@ -3505,7 +3507,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int ...@@ -3505,7 +3507,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
return -EROFS; return -EROFS;
return 0; return 0;
case FDFMTTRK: case FDFMTTRK:
if (UDRS->fd_ref != 1) if (drive_state[drive].fd_ref != 1)
return -EBUSY; return -EBUSY;
return do_format(drive, &inparam.f); return do_format(drive, &inparam.f);
case FDFMTEND: case FDFMTEND:
...@@ -3543,7 +3545,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int ...@@ -3543,7 +3545,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
process_fd_request(); process_fd_request();
/* fall through */ /* fall through */
case FDGETDRVSTAT: case FDGETDRVSTAT:
outparam = UDRS; outparam = &drive_state[drive];
break; break;
case FDRESET: case FDRESET:
return user_reset_fdc(drive, (int)param, true); return user_reset_fdc(drive, (int)param, true);
...@@ -3690,7 +3692,7 @@ static int compat_set_geometry(struct block_device *bdev, fmode_t mode, unsigned ...@@ -3690,7 +3692,7 @@ static int compat_set_geometry(struct block_device *bdev, fmode_t mode, unsigned
mutex_lock(&floppy_mutex); mutex_lock(&floppy_mutex);
drive = (long)bdev->bd_disk->private_data; drive = (long)bdev->bd_disk->private_data;
type = ITYPE(UDRS->fd_device); type = ITYPE(drive_state[drive].fd_device);
err = set_geometry(cmd == FDSETPRM32 ? FDSETPRM : FDDEFPRM, err = set_geometry(cmd == FDSETPRM32 ? FDSETPRM : FDDEFPRM,
&v, drive, type, bdev); &v, drive, type, bdev);
mutex_unlock(&floppy_mutex); mutex_unlock(&floppy_mutex);
...@@ -3706,7 +3708,8 @@ static int compat_get_prm(int drive, ...@@ -3706,7 +3708,8 @@ static int compat_get_prm(int drive,
memset(&v, 0, sizeof(v)); memset(&v, 0, sizeof(v));
mutex_lock(&floppy_mutex); mutex_lock(&floppy_mutex);
err = get_floppy_geometry(drive, ITYPE(UDRS->fd_device), &p); err = get_floppy_geometry(drive, ITYPE(drive_state[drive].fd_device),
&p);
if (err) { if (err) {
mutex_unlock(&floppy_mutex); mutex_unlock(&floppy_mutex);
return err; return err;
...@@ -3803,20 +3806,20 @@ static int compat_getdrvstat(int drive, bool poll, ...@@ -3803,20 +3806,20 @@ static int compat_getdrvstat(int drive, bool poll,
goto Eintr; goto Eintr;
process_fd_request(); process_fd_request();
} }
v.spinup_date = UDRS->spinup_date; v.spinup_date = drive_state[drive].spinup_date;
v.select_date = UDRS->select_date; v.select_date = drive_state[drive].select_date;
v.first_read_date = UDRS->first_read_date; v.first_read_date = drive_state[drive].first_read_date;
v.probed_format = UDRS->probed_format; v.probed_format = drive_state[drive].probed_format;
v.track = UDRS->track; v.track = drive_state[drive].track;
v.maxblock = UDRS->maxblock; v.maxblock = drive_state[drive].maxblock;
v.maxtrack = UDRS->maxtrack; v.maxtrack = drive_state[drive].maxtrack;
v.generation = UDRS->generation; v.generation = drive_state[drive].generation;
v.keep_data = UDRS->keep_data; v.keep_data = drive_state[drive].keep_data;
v.fd_ref = UDRS->fd_ref; v.fd_ref = drive_state[drive].fd_ref;
v.fd_device = UDRS->fd_device; v.fd_device = drive_state[drive].fd_device;
v.last_checked = UDRS->last_checked; v.last_checked = drive_state[drive].last_checked;
v.dmabuf = (uintptr_t)UDRS->dmabuf; v.dmabuf = (uintptr_t) drive_state[drive].dmabuf;
v.bufblocks = UDRS->bufblocks; v.bufblocks = drive_state[drive].bufblocks;
mutex_unlock(&floppy_mutex); mutex_unlock(&floppy_mutex);
if (copy_to_user(arg, &v, sizeof(struct compat_floppy_drive_struct))) if (copy_to_user(arg, &v, sizeof(struct compat_floppy_drive_struct)))
...@@ -3985,11 +3988,11 @@ static void floppy_release(struct gendisk *disk, fmode_t mode) ...@@ -3985,11 +3988,11 @@ static void floppy_release(struct gendisk *disk, fmode_t mode)
mutex_lock(&floppy_mutex); mutex_lock(&floppy_mutex);
mutex_lock(&open_lock); mutex_lock(&open_lock);
if (!UDRS->fd_ref--) { if (!drive_state[drive].fd_ref--) {
DPRINT("floppy_release with fd_ref == 0"); DPRINT("floppy_release with fd_ref == 0");
UDRS->fd_ref = 0; drive_state[drive].fd_ref = 0;
} }
if (!UDRS->fd_ref) if (!drive_state[drive].fd_ref)
opened_bdev[drive] = NULL; opened_bdev[drive] = NULL;
mutex_unlock(&open_lock); mutex_unlock(&open_lock);
mutex_unlock(&floppy_mutex); mutex_unlock(&floppy_mutex);
...@@ -4010,16 +4013,16 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) ...@@ -4010,16 +4013,16 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
mutex_lock(&floppy_mutex); mutex_lock(&floppy_mutex);
mutex_lock(&open_lock); mutex_lock(&open_lock);
old_dev = UDRS->fd_device; old_dev = drive_state[drive].fd_device;
if (opened_bdev[drive] && opened_bdev[drive] != bdev) if (opened_bdev[drive] && opened_bdev[drive] != bdev)
goto out2; goto out2;
if (!UDRS->fd_ref && (drive_params[drive].flags & FD_BROKEN_DCL)) { if (!drive_state[drive].fd_ref && (drive_params[drive].flags & FD_BROKEN_DCL)) {
set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags); set_bit(FD_DISK_CHANGED_BIT, &drive_state[drive].flags);
set_bit(FD_VERIFY_BIT, &UDRS->flags); set_bit(FD_VERIFY_BIT, &drive_state[drive].flags);
} }
UDRS->fd_ref++; drive_state[drive].fd_ref++;
opened_bdev[drive] = bdev; opened_bdev[drive] = bdev;
...@@ -4056,7 +4059,7 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) ...@@ -4056,7 +4059,7 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
} }
new_dev = MINOR(bdev->bd_dev); new_dev = MINOR(bdev->bd_dev);
UDRS->fd_device = new_dev; drive_state[drive].fd_device = new_dev;
set_capacity(disks[drive], floppy_sizes[new_dev]); set_capacity(disks[drive], floppy_sizes[new_dev]);
if (old_dev != -1 && old_dev != new_dev) { if (old_dev != -1 && old_dev != new_dev) {
if (buffer_drive == drive) if (buffer_drive == drive)
...@@ -4068,26 +4071,27 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) ...@@ -4068,26 +4071,27 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
if (!(mode & FMODE_NDELAY)) { if (!(mode & FMODE_NDELAY)) {
if (mode & (FMODE_READ|FMODE_WRITE)) { if (mode & (FMODE_READ|FMODE_WRITE)) {
UDRS->last_checked = 0; drive_state[drive].last_checked = 0;
clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags); clear_bit(FD_OPEN_SHOULD_FAIL_BIT,
&drive_state[drive].flags);
check_disk_change(bdev); check_disk_change(bdev);
if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags)) if (test_bit(FD_DISK_CHANGED_BIT, &drive_state[drive].flags))
goto out; goto out;
if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags)) if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &drive_state[drive].flags))
goto out; goto out;
} }
res = -EROFS; res = -EROFS;
if ((mode & FMODE_WRITE) && if ((mode & FMODE_WRITE) &&
!test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags)) !test_bit(FD_DISK_WRITABLE_BIT, &drive_state[drive].flags))
goto out; goto out;
} }
mutex_unlock(&open_lock); mutex_unlock(&open_lock);
mutex_unlock(&floppy_mutex); mutex_unlock(&floppy_mutex);
return 0; return 0;
out: out:
UDRS->fd_ref--; drive_state[drive].fd_ref--;
if (!UDRS->fd_ref) if (!drive_state[drive].fd_ref)
opened_bdev[drive] = NULL; opened_bdev[drive] = NULL;
out2: out2:
mutex_unlock(&open_lock); mutex_unlock(&open_lock);
...@@ -4103,19 +4107,19 @@ static unsigned int floppy_check_events(struct gendisk *disk, ...@@ -4103,19 +4107,19 @@ static unsigned int floppy_check_events(struct gendisk *disk,
{ {
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, &drive_state[drive].flags) ||
test_bit(FD_VERIFY_BIT, &UDRS->flags)) test_bit(FD_VERIFY_BIT, &drive_state[drive].flags))
return DISK_EVENT_MEDIA_CHANGE; return DISK_EVENT_MEDIA_CHANGE;
if (time_after(jiffies, UDRS->last_checked + drive_params[drive].checkfreq)) { if (time_after(jiffies, drive_state[drive].last_checked + drive_params[drive].checkfreq)) {
if (lock_fdc(drive)) if (lock_fdc(drive))
return 0; return 0;
poll_drive(false, 0); poll_drive(false, 0);
process_fd_request(); process_fd_request();
} }
if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) || if (test_bit(FD_DISK_CHANGED_BIT, &drive_state[drive].flags) ||
test_bit(FD_VERIFY_BIT, &UDRS->flags) || test_bit(FD_VERIFY_BIT, &drive_state[drive].flags) ||
test_bit(drive, &fake_change) || test_bit(drive, &fake_change) ||
drive_no_geom(drive)) drive_no_geom(drive))
return DISK_EVENT_MEDIA_CHANGE; return DISK_EVENT_MEDIA_CHANGE;
...@@ -4141,7 +4145,7 @@ static void floppy_rb0_cb(struct bio *bio) ...@@ -4141,7 +4145,7 @@ static void floppy_rb0_cb(struct bio *bio)
if (bio->bi_status) { if (bio->bi_status) {
pr_info("floppy: error %d while reading block 0\n", pr_info("floppy: error %d while reading block 0\n",
bio->bi_status); bio->bi_status);
set_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags); set_bit(FD_OPEN_SHOULD_FAIL_BIT, &drive_state[drive].flags);
} }
complete(&cbdata->complete); complete(&cbdata->complete);
} }
...@@ -4198,8 +4202,8 @@ static int floppy_revalidate(struct gendisk *disk) ...@@ -4198,8 +4202,8 @@ static int floppy_revalidate(struct gendisk *disk)
int cf; int cf;
int res = 0; int res = 0;
if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) || if (test_bit(FD_DISK_CHANGED_BIT, &drive_state[drive].flags) ||
test_bit(FD_VERIFY_BIT, &UDRS->flags) || test_bit(FD_VERIFY_BIT, &drive_state[drive].flags) ||
test_bit(drive, &fake_change) || test_bit(drive, &fake_change) ||
drive_no_geom(drive)) { drive_no_geom(drive)) {
if (WARN(atomic_read(&usage_count) == 0, if (WARN(atomic_read(&usage_count) == 0,
...@@ -4209,20 +4213,20 @@ static int floppy_revalidate(struct gendisk *disk) ...@@ -4209,20 +4213,20 @@ static int floppy_revalidate(struct gendisk *disk)
res = lock_fdc(drive); res = lock_fdc(drive);
if (res) if (res)
return res; return res;
cf = (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) || cf = (test_bit(FD_DISK_CHANGED_BIT, &drive_state[drive].flags) ||
test_bit(FD_VERIFY_BIT, &UDRS->flags)); test_bit(FD_VERIFY_BIT, &drive_state[drive].flags));
if (!(cf || test_bit(drive, &fake_change) || drive_no_geom(drive))) { if (!(cf || test_bit(drive, &fake_change) || drive_no_geom(drive))) {
process_fd_request(); /*already done by another thread */ process_fd_request(); /*already done by another thread */
return 0; return 0;
} }
UDRS->maxblock = 0; drive_state[drive].maxblock = 0;
UDRS->maxtrack = 0; drive_state[drive].maxtrack = 0;
if (buffer_drive == drive) if (buffer_drive == drive)
buffer_track = -1; buffer_track = -1;
clear_bit(drive, &fake_change); clear_bit(drive, &fake_change);
clear_bit(FD_DISK_CHANGED_BIT, &UDRS->flags); clear_bit(FD_DISK_CHANGED_BIT, &drive_state[drive].flags);
if (cf) if (cf)
UDRS->generation++; drive_state[drive].generation++;
if (drive_no_geom(drive)) { if (drive_no_geom(drive)) {
/* auto-sensing */ /* auto-sensing */
res = __floppy_read_block_0(opened_bdev[drive], drive); res = __floppy_read_block_0(opened_bdev[drive], drive);
...@@ -4232,7 +4236,7 @@ static int floppy_revalidate(struct gendisk *disk) ...@@ -4232,7 +4236,7 @@ static int floppy_revalidate(struct gendisk *disk)
process_fd_request(); process_fd_request();
} }
} }
set_capacity(disk, floppy_sizes[UDRS->fd_device]); set_capacity(disk, floppy_sizes[drive_state[drive].fd_device]);
return res; return res;
} }
...@@ -4638,12 +4642,12 @@ static int __init do_floppy_init(void) ...@@ -4638,12 +4642,12 @@ static int __init do_floppy_init(void)
/* initialise drive state */ /* initialise drive state */
for (drive = 0; drive < N_DRIVE; drive++) { for (drive = 0; drive < N_DRIVE; drive++) {
memset(UDRS, 0, sizeof(*UDRS)); memset(&drive_state[drive], 0, sizeof(drive_state[drive]));
memset(UDRWE, 0, sizeof(*UDRWE)); memset(UDRWE, 0, sizeof(*UDRWE));
set_bit(FD_DISK_NEWCHANGE_BIT, &UDRS->flags); set_bit(FD_DISK_NEWCHANGE_BIT, &drive_state[drive].flags);
set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags); set_bit(FD_DISK_CHANGED_BIT, &drive_state[drive].flags);
set_bit(FD_VERIFY_BIT, &UDRS->flags); set_bit(FD_VERIFY_BIT, &drive_state[drive].flags);
UDRS->fd_device = -1; drive_state[drive].fd_device = -1;
floppy_track_buffer = NULL; floppy_track_buffer = NULL;
max_buffer_sectors = 0; max_buffer_sectors = 0;
} }
......
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