ide: /proc/ide/hd*/settings rework
* Add struct ide_devset, S_* flags, *DEVSET() & ide*_devset_*() macros. * Add 'const struct ide_devset **settings' to ide_driver_t. * Use 'const struct ide_devset **settings' in ide_drive_t instead of 'struct ide_settings_s *settings'. Then convert core code and device drivers to use struct ide_devset and co.: - device settings are no longer allocated dynamically for each device but instead there is an unique struct ide_devset instance per setting - device driver keeps the pointer to the table of pointers to its settings in ide_driver_t.settings - generic settings are kept in ide_generic_setting[] - ide_proc_[un]register_driver(), ide_find_setting_by_name(), ide_{read,write}_setting() and proc_ide_{read,write}_settings() are updated accordingly - ide*_add_settings() are removed * Remove no longer used __ide_add_setting(), ide_add_setting(), __ide_remove_setting() and auto_remove_settings(). * Remove no longer used TYPE_*, SETTING_*, ide_procset_t and ide_settings_t. * ->keep_settings, ->using_dma, ->unmask, ->noflush, ->dsc_overlap, ->nice1, ->addressing, ->wcache and ->nowerr ide_drive_t fields can now be bitfield flags. While at it: * Rename ide_find_setting_by_name() to ide_find_setting(). * Rename write_wcache() to set_wcache(). There should be no functional changes caused by this patch. Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
这个提交包含在:
@@ -287,6 +287,8 @@ int ide_spin_wait_hwgroup (ide_drive_t *drive)
|
||||
|
||||
EXPORT_SYMBOL(ide_spin_wait_hwgroup);
|
||||
|
||||
ide_devset_get(io_32bit, io_32bit);
|
||||
|
||||
int set_io_32bit(ide_drive_t *drive, int arg)
|
||||
{
|
||||
if (drive->no_io_32bit)
|
||||
@@ -305,6 +307,8 @@ int set_io_32bit(ide_drive_t *drive, int arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
ide_devset_get(ksettings, keep_settings);
|
||||
|
||||
int set_ksettings(ide_drive_t *drive, int arg)
|
||||
{
|
||||
if (arg < 0 || arg > 1)
|
||||
@@ -318,6 +322,8 @@ int set_ksettings(ide_drive_t *drive, int arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
ide_devset_get(using_dma, using_dma);
|
||||
|
||||
int set_using_dma(ide_drive_t *drive, int arg)
|
||||
{
|
||||
#ifdef CONFIG_BLK_DEV_IDEDMA
|
||||
@@ -394,6 +400,8 @@ int set_pio_mode(ide_drive_t *drive, int arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
ide_devset_get(unmaskirq, unmask);
|
||||
|
||||
int set_unmaskirq(ide_drive_t *drive, int arg)
|
||||
{
|
||||
if (drive->no_unmask)
|
||||
@@ -555,14 +563,13 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
|
||||
{
|
||||
unsigned long flags;
|
||||
ide_driver_t *drv;
|
||||
int err = 0, (*setfunc)(ide_drive_t *, int);
|
||||
u8 *val;
|
||||
int err = 0, (*getfunc)(ide_drive_t *), (*setfunc)(ide_drive_t *, int);
|
||||
|
||||
switch (cmd) {
|
||||
case HDIO_GET_32BIT: val = &drive->io_32bit; goto read_val;
|
||||
case HDIO_GET_KEEPSETTINGS: val = &drive->keep_settings; goto read_val;
|
||||
case HDIO_GET_UNMASKINTR: val = &drive->unmask; goto read_val;
|
||||
case HDIO_GET_DMA: val = &drive->using_dma; goto read_val;
|
||||
case HDIO_GET_32BIT: getfunc = get_io_32bit; goto read_val;
|
||||
case HDIO_GET_KEEPSETTINGS: getfunc = get_ksettings; goto read_val;
|
||||
case HDIO_GET_UNMASKINTR: getfunc = get_unmaskirq; goto read_val;
|
||||
case HDIO_GET_DMA: getfunc = get_using_dma; goto read_val;
|
||||
case HDIO_SET_32BIT: setfunc = set_io_32bit; goto set_val;
|
||||
case HDIO_SET_KEEPSETTINGS: setfunc = set_ksettings; goto set_val;
|
||||
case HDIO_SET_PIO_MODE: setfunc = set_pio_mode; goto set_val;
|
||||
@@ -638,7 +645,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
|
||||
read_val:
|
||||
mutex_lock(&ide_setting_mtx);
|
||||
spin_lock_irqsave(&ide_lock, flags);
|
||||
err = *val;
|
||||
err = getfunc(drive);
|
||||
spin_unlock_irqrestore(&ide_lock, flags);
|
||||
mutex_unlock(&ide_setting_mtx);
|
||||
return err >= 0 ? put_user(err, (long __user *)arg) : err;
|
||||
|
在新工单中引用
屏蔽一个用户