Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
This commit is contained in:
Коммит
223ddcea89
|
@ -618,7 +618,7 @@ appldata_offline_cpu(int cpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
static int
|
static int __cpuinit
|
||||||
appldata_cpu_notify(struct notifier_block *self,
|
appldata_cpu_notify(struct notifier_block *self,
|
||||||
unsigned long action, void *hcpu)
|
unsigned long action, void *hcpu)
|
||||||
{
|
{
|
||||||
|
|
|
@ -129,7 +129,7 @@ void __init paging_init(void)
|
||||||
/*
|
/*
|
||||||
* pg_table is physical at this point
|
* pg_table is physical at this point
|
||||||
*/
|
*/
|
||||||
pg_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
|
pg_table = (pte_t *) alloc_bootmem_pages(PAGE_SIZE);
|
||||||
|
|
||||||
pg_dir->pgd0 = (_PAGE_TABLE | __pa(pg_table));
|
pg_dir->pgd0 = (_PAGE_TABLE | __pa(pg_table));
|
||||||
pg_dir->pgd1 = (_PAGE_TABLE | (__pa(pg_table)+1024));
|
pg_dir->pgd1 = (_PAGE_TABLE | (__pa(pg_table)+1024));
|
||||||
|
@ -219,7 +219,7 @@ void __init paging_init(void)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pm_dir = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE*4);
|
pm_dir = (pmd_t *) alloc_bootmem_pages(PAGE_SIZE * 4);
|
||||||
pgd_populate(&init_mm, pg_dir, pm_dir);
|
pgd_populate(&init_mm, pg_dir, pm_dir);
|
||||||
|
|
||||||
for (j = 0 ; j < PTRS_PER_PMD ; j++,pm_dir++) {
|
for (j = 0 ; j < PTRS_PER_PMD ; j++,pm_dir++) {
|
||||||
|
@ -228,7 +228,7 @@ void __init paging_init(void)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pt_dir = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
|
pt_dir = (pte_t *) alloc_bootmem_pages(PAGE_SIZE);
|
||||||
pmd_populate_kernel(&init_mm, pm_dir, pt_dir);
|
pmd_populate_kernel(&init_mm, pm_dir, pt_dir);
|
||||||
|
|
||||||
for (k = 0 ; k < PTRS_PER_PTE ; k++,pt_dir++) {
|
for (k = 0 ; k < PTRS_PER_PTE ; k++,pt_dir++) {
|
||||||
|
|
|
@ -1730,8 +1730,8 @@ dasd_flush_request_queue(struct dasd_device * device)
|
||||||
req = elv_next_request(device->request_queue);
|
req = elv_next_request(device->request_queue);
|
||||||
if (req == NULL)
|
if (req == NULL)
|
||||||
break;
|
break;
|
||||||
dasd_end_request(req, 0);
|
|
||||||
blkdev_dequeue_request(req);
|
blkdev_dequeue_request(req);
|
||||||
|
dasd_end_request(req, 0);
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&device->request_queue_lock);
|
spin_unlock_irq(&device->request_queue_lock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,18 +48,20 @@ struct dasd_devmap {
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dasd_servermap is used to store the server_id of all storage servers
|
* dasd_server_ssid_map contains a globally unique storage server subsystem ID.
|
||||||
* accessed by DASD device driver.
|
* dasd_server_ssid_list contains the list of all subsystem IDs accessed by
|
||||||
|
* the DASD device driver.
|
||||||
*/
|
*/
|
||||||
struct dasd_servermap {
|
struct dasd_server_ssid_map {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
struct server_id {
|
struct server_id {
|
||||||
char vendor[4];
|
char vendor[4];
|
||||||
char serial[15];
|
char serial[15];
|
||||||
} sid;
|
} sid;
|
||||||
|
__u16 ssid;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct list_head dasd_serverlist;
|
static struct list_head dasd_server_ssid_list;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parameter parsing functions for dasd= parameter. The syntax is:
|
* Parameter parsing functions for dasd= parameter. The syntax is:
|
||||||
|
@ -89,7 +91,7 @@ static char *dasd[256];
|
||||||
module_param_array(dasd, charp, NULL, 0);
|
module_param_array(dasd, charp, NULL, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Single spinlock to protect devmap structures and lists.
|
* Single spinlock to protect devmap and servermap structures and lists.
|
||||||
*/
|
*/
|
||||||
static DEFINE_SPINLOCK(dasd_devmap_lock);
|
static DEFINE_SPINLOCK(dasd_devmap_lock);
|
||||||
|
|
||||||
|
@ -264,8 +266,9 @@ dasd_parse_keyword( char *parsestring ) {
|
||||||
if (dasd_page_cache)
|
if (dasd_page_cache)
|
||||||
return residual_str;
|
return residual_str;
|
||||||
dasd_page_cache =
|
dasd_page_cache =
|
||||||
kmem_cache_create("dasd_page_cache", PAGE_SIZE, 0,
|
kmem_cache_create("dasd_page_cache", PAGE_SIZE,
|
||||||
SLAB_CACHE_DMA, NULL, NULL );
|
PAGE_SIZE, SLAB_CACHE_DMA,
|
||||||
|
NULL, NULL );
|
||||||
if (!dasd_page_cache)
|
if (!dasd_page_cache)
|
||||||
MESSAGE(KERN_WARNING, "%s", "Failed to create slab, "
|
MESSAGE(KERN_WARNING, "%s", "Failed to create slab, "
|
||||||
"fixed buffer mode disabled.");
|
"fixed buffer mode disabled.");
|
||||||
|
@ -858,39 +861,6 @@ static struct attribute_group dasd_attr_group = {
|
||||||
.attrs = dasd_attrs,
|
.attrs = dasd_attrs,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Check if the related storage server is already contained in the
|
|
||||||
* dasd_serverlist. If server is not contained, create new entry.
|
|
||||||
* Return 0 if server was already in serverlist,
|
|
||||||
* 1 if the server was added successfully
|
|
||||||
* <0 in case of error.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
dasd_add_server(struct dasd_uid *uid)
|
|
||||||
{
|
|
||||||
struct dasd_servermap *new, *tmp;
|
|
||||||
|
|
||||||
/* check if server is already contained */
|
|
||||||
list_for_each_entry(tmp, &dasd_serverlist, list)
|
|
||||||
// normale cmp?
|
|
||||||
if (strncmp(tmp->sid.vendor, uid->vendor,
|
|
||||||
sizeof(tmp->sid.vendor)) == 0
|
|
||||||
&& strncmp(tmp->sid.serial, uid->serial,
|
|
||||||
sizeof(tmp->sid.serial)) == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
new = (struct dasd_servermap *)
|
|
||||||
kzalloc(sizeof(struct dasd_servermap), GFP_KERNEL);
|
|
||||||
if (!new)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
strncpy(new->sid.vendor, uid->vendor, sizeof(new->sid.vendor));
|
|
||||||
strncpy(new->sid.serial, uid->serial, sizeof(new->sid.serial));
|
|
||||||
list_add(&new->list, &dasd_serverlist);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return copy of the device unique identifier.
|
* Return copy of the device unique identifier.
|
||||||
*/
|
*/
|
||||||
|
@ -910,6 +880,9 @@ dasd_get_uid(struct ccw_device *cdev, struct dasd_uid *uid)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Register the given device unique identifier into devmap struct.
|
* Register the given device unique identifier into devmap struct.
|
||||||
|
* In addition check if the related storage server subsystem ID is already
|
||||||
|
* contained in the dasd_server_ssid_list. If subsystem ID is not contained,
|
||||||
|
* create new entry.
|
||||||
* Return 0 if server was already in serverlist,
|
* Return 0 if server was already in serverlist,
|
||||||
* 1 if the server was added successful
|
* 1 if the server was added successful
|
||||||
* <0 in case of error.
|
* <0 in case of error.
|
||||||
|
@ -918,16 +891,39 @@ int
|
||||||
dasd_set_uid(struct ccw_device *cdev, struct dasd_uid *uid)
|
dasd_set_uid(struct ccw_device *cdev, struct dasd_uid *uid)
|
||||||
{
|
{
|
||||||
struct dasd_devmap *devmap;
|
struct dasd_devmap *devmap;
|
||||||
int rc;
|
struct dasd_server_ssid_map *srv, *tmp;
|
||||||
|
|
||||||
devmap = dasd_find_busid(cdev->dev.bus_id);
|
devmap = dasd_find_busid(cdev->dev.bus_id);
|
||||||
if (IS_ERR(devmap))
|
if (IS_ERR(devmap))
|
||||||
return PTR_ERR(devmap);
|
return PTR_ERR(devmap);
|
||||||
|
|
||||||
|
/* generate entry for server_ssid_map */
|
||||||
|
srv = (struct dasd_server_ssid_map *)
|
||||||
|
kzalloc(sizeof(struct dasd_server_ssid_map), GFP_KERNEL);
|
||||||
|
if (!srv)
|
||||||
|
return -ENOMEM;
|
||||||
|
strncpy(srv->sid.vendor, uid->vendor, sizeof(srv->sid.vendor) - 1);
|
||||||
|
strncpy(srv->sid.serial, uid->serial, sizeof(srv->sid.serial) - 1);
|
||||||
|
srv->ssid = uid->ssid;
|
||||||
|
|
||||||
|
/* server is already contained ? */
|
||||||
spin_lock(&dasd_devmap_lock);
|
spin_lock(&dasd_devmap_lock);
|
||||||
devmap->uid = *uid;
|
devmap->uid = *uid;
|
||||||
rc = dasd_add_server(uid);
|
list_for_each_entry(tmp, &dasd_server_ssid_list, list) {
|
||||||
|
if (!memcmp(&srv->sid, &tmp->sid,
|
||||||
|
sizeof(struct dasd_server_ssid_map))) {
|
||||||
|
kfree(srv);
|
||||||
|
srv = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add servermap to serverlist */
|
||||||
|
if (srv)
|
||||||
|
list_add(&srv->list, &dasd_server_ssid_list);
|
||||||
spin_unlock(&dasd_devmap_lock);
|
spin_unlock(&dasd_devmap_lock);
|
||||||
return rc;
|
|
||||||
|
return (srv ? 1 : 0);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(dasd_set_uid);
|
EXPORT_SYMBOL_GPL(dasd_set_uid);
|
||||||
|
|
||||||
|
@ -995,7 +991,7 @@ dasd_devmap_init(void)
|
||||||
INIT_LIST_HEAD(&dasd_hashlists[i]);
|
INIT_LIST_HEAD(&dasd_hashlists[i]);
|
||||||
|
|
||||||
/* Initialize servermap structure. */
|
/* Initialize servermap structure. */
|
||||||
INIT_LIST_HEAD(&dasd_serverlist);
|
INIT_LIST_HEAD(&dasd_server_ssid_list);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -468,10 +468,10 @@ dasd_eckd_generate_uid(struct dasd_device *device, struct dasd_uid *uid)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
memset(uid, 0, sizeof(struct dasd_uid));
|
memset(uid, 0, sizeof(struct dasd_uid));
|
||||||
strncpy(uid->vendor, confdata->ned1.HDA_manufacturer,
|
memcpy(uid->vendor, confdata->ned1.HDA_manufacturer,
|
||||||
sizeof(uid->vendor) - 1);
|
sizeof(uid->vendor) - 1);
|
||||||
EBCASC(uid->vendor, sizeof(uid->vendor) - 1);
|
EBCASC(uid->vendor, sizeof(uid->vendor) - 1);
|
||||||
strncpy(uid->serial, confdata->ned1.HDA_location,
|
memcpy(uid->serial, confdata->ned1.HDA_location,
|
||||||
sizeof(uid->serial) - 1);
|
sizeof(uid->serial) - 1);
|
||||||
EBCASC(uid->serial, sizeof(uid->serial) - 1);
|
EBCASC(uid->serial, sizeof(uid->serial) - 1);
|
||||||
uid->ssid = confdata->neq.subsystemID;
|
uid->ssid = confdata->neq.subsystemID;
|
||||||
|
|
|
@ -48,15 +48,6 @@
|
||||||
#define PRINT_ERR(x...) printk(KERN_ERR XPRAM_NAME " error:" x)
|
#define PRINT_ERR(x...) printk(KERN_ERR XPRAM_NAME " error:" x)
|
||||||
|
|
||||||
|
|
||||||
static struct sysdev_class xpram_sysclass = {
|
|
||||||
set_kset_name("xpram"),
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct sys_device xpram_sys_device = {
|
|
||||||
.id = 0,
|
|
||||||
.cls = &xpram_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned int size; /* size of xpram segment in pages */
|
unsigned int size; /* size of xpram segment in pages */
|
||||||
unsigned int offset; /* start page of xpram segment */
|
unsigned int offset; /* start page of xpram segment */
|
||||||
|
@ -451,8 +442,6 @@ static void __exit xpram_exit(void)
|
||||||
}
|
}
|
||||||
unregister_blkdev(XPRAM_MAJOR, XPRAM_NAME);
|
unregister_blkdev(XPRAM_MAJOR, XPRAM_NAME);
|
||||||
blk_cleanup_queue(xpram_queue);
|
blk_cleanup_queue(xpram_queue);
|
||||||
sysdev_unregister(&xpram_sys_device);
|
|
||||||
sysdev_class_unregister(&xpram_sysclass);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init xpram_init(void)
|
static int __init xpram_init(void)
|
||||||
|
@ -470,19 +459,7 @@ static int __init xpram_init(void)
|
||||||
rc = xpram_setup_sizes(xpram_pages);
|
rc = xpram_setup_sizes(xpram_pages);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
rc = sysdev_class_register(&xpram_sysclass);
|
return xpram_setup_blkdev();
|
||||||
if (rc)
|
|
||||||
return rc;
|
|
||||||
|
|
||||||
rc = sysdev_register(&xpram_sys_device);
|
|
||||||
if (rc) {
|
|
||||||
sysdev_class_unregister(&xpram_sysclass);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
rc = xpram_setup_blkdev();
|
|
||||||
if (rc)
|
|
||||||
sysdev_unregister(&xpram_sys_device);
|
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(xpram_init);
|
module_init(xpram_init);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче