diff options
| author | Dan Williams <dan.j.williams@intel.com> | 2011-07-29 20:26:39 -0400 |
|---|---|---|
| committer | James Bottomley <JBottomley@Parallels.com> | 2011-08-27 10:35:13 -0400 |
| commit | 4fcf812ca392303aa79dd50e96e83a29faa13bd0 (patch) | |
| tree | 411c33d701989b44ba2f4ecb64fd0cba92214958 | |
| parent | 7ca3c803e85080afdff4097e60fefec865027809 (diff) | |
[SCSI] libsas: export sas_alloc_task()
Now that isci has added a 3rd open coded user of this functionality just
share the libsas version.
Acked-by: Jack Wang <jack_wang@usish.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
| -rw-r--r-- | drivers/scsi/isci/task.c | 29 | ||||
| -rw-r--r-- | drivers/scsi/libsas/sas_init.c | 30 | ||||
| -rw-r--r-- | drivers/scsi/mvsas/mv_sas.c | 29 | ||||
| -rw-r--r-- | drivers/scsi/pm8001/pm8001_sas.c | 38 | ||||
| -rw-r--r-- | include/scsi/libsas.h | 26 |
5 files changed, 41 insertions, 111 deletions
diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c index d6bcdd013dc9..e2d9418683ce 100644 --- a/drivers/scsi/isci/task.c +++ b/drivers/scsi/isci/task.c | |||
| @@ -1345,29 +1345,6 @@ static void isci_smp_task_done(struct sas_task *task) | |||
| 1345 | complete(&task->completion); | 1345 | complete(&task->completion); |
| 1346 | } | 1346 | } |
| 1347 | 1347 | ||
| 1348 | static struct sas_task *isci_alloc_task(void) | ||
| 1349 | { | ||
| 1350 | struct sas_task *task = kzalloc(sizeof(*task), GFP_KERNEL); | ||
| 1351 | |||
| 1352 | if (task) { | ||
| 1353 | INIT_LIST_HEAD(&task->list); | ||
| 1354 | spin_lock_init(&task->task_state_lock); | ||
| 1355 | task->task_state_flags = SAS_TASK_STATE_PENDING; | ||
| 1356 | init_timer(&task->timer); | ||
| 1357 | init_completion(&task->completion); | ||
| 1358 | } | ||
| 1359 | |||
| 1360 | return task; | ||
| 1361 | } | ||
| 1362 | |||
| 1363 | static void isci_free_task(struct isci_host *ihost, struct sas_task *task) | ||
| 1364 | { | ||
| 1365 | if (task) { | ||
| 1366 | BUG_ON(!list_empty(&task->list)); | ||
| 1367 | kfree(task); | ||
| 1368 | } | ||
| 1369 | } | ||
| 1370 | |||
| 1371 | static int isci_smp_execute_task(struct isci_host *ihost, | 1348 | static int isci_smp_execute_task(struct isci_host *ihost, |
| 1372 | struct domain_device *dev, void *req, | 1349 | struct domain_device *dev, void *req, |
| 1373 | int req_size, void *resp, int resp_size) | 1350 | int req_size, void *resp, int resp_size) |
| @@ -1376,7 +1353,7 @@ static int isci_smp_execute_task(struct isci_host *ihost, | |||
| 1376 | struct sas_task *task = NULL; | 1353 | struct sas_task *task = NULL; |
| 1377 | 1354 | ||
| 1378 | for (retry = 0; retry < 3; retry++) { | 1355 | for (retry = 0; retry < 3; retry++) { |
| 1379 | task = isci_alloc_task(); | 1356 | task = sas_alloc_task(GFP_KERNEL); |
| 1380 | if (!task) | 1357 | if (!task) |
| 1381 | return -ENOMEM; | 1358 | return -ENOMEM; |
| 1382 | 1359 | ||
| @@ -1439,13 +1416,13 @@ static int isci_smp_execute_task(struct isci_host *ihost, | |||
| 1439 | SAS_ADDR(dev->sas_addr), | 1416 | SAS_ADDR(dev->sas_addr), |
| 1440 | task->task_status.resp, | 1417 | task->task_status.resp, |
| 1441 | task->task_status.stat); | 1418 | task->task_status.stat); |
| 1442 | isci_free_task(ihost, task); | 1419 | sas_free_task(task); |
| 1443 | task = NULL; | 1420 | task = NULL; |
| 1444 | } | 1421 | } |
| 1445 | } | 1422 | } |
| 1446 | ex_err: | 1423 | ex_err: |
| 1447 | BUG_ON(retry == 3 && task != NULL); | 1424 | BUG_ON(retry == 3 && task != NULL); |
| 1448 | isci_free_task(ihost, task); | 1425 | sas_free_task(task); |
| 1449 | return res; | 1426 | return res; |
| 1450 | } | 1427 | } |
| 1451 | 1428 | ||
diff --git a/drivers/scsi/libsas/sas_init.c b/drivers/scsi/libsas/sas_init.c index 2dc55343f671..dd56ea827665 100644 --- a/drivers/scsi/libsas/sas_init.c +++ b/drivers/scsi/libsas/sas_init.c | |||
| @@ -37,7 +37,32 @@ | |||
| 37 | 37 | ||
| 38 | #include "../scsi_sas_internal.h" | 38 | #include "../scsi_sas_internal.h" |
| 39 | 39 | ||
| 40 | struct kmem_cache *sas_task_cache; | 40 | static struct kmem_cache *sas_task_cache; |
| 41 | |||
| 42 | struct sas_task *sas_alloc_task(gfp_t flags) | ||
| 43 | { | ||
| 44 | struct sas_task *task = kmem_cache_zalloc(sas_task_cache, flags); | ||
| 45 | |||
| 46 | if (task) { | ||
| 47 | INIT_LIST_HEAD(&task->list); | ||
| 48 | spin_lock_init(&task->task_state_lock); | ||
| 49 | task->task_state_flags = SAS_TASK_STATE_PENDING; | ||
| 50 | init_timer(&task->timer); | ||
| 51 | init_completion(&task->completion); | ||
| 52 | } | ||
| 53 | |||
| 54 | return task; | ||
| 55 | } | ||
| 56 | EXPORT_SYMBOL_GPL(sas_alloc_task); | ||
| 57 | |||
| 58 | void sas_free_task(struct sas_task *task) | ||
| 59 | { | ||
| 60 | if (task) { | ||
| 61 | BUG_ON(!list_empty(&task->list)); | ||
| 62 | kmem_cache_free(sas_task_cache, task); | ||
| 63 | } | ||
| 64 | } | ||
| 65 | EXPORT_SYMBOL_GPL(sas_free_task); | ||
| 41 | 66 | ||
| 42 | /*------------ SAS addr hash -----------*/ | 67 | /*------------ SAS addr hash -----------*/ |
| 43 | void sas_hash_addr(u8 *hashed, const u8 *sas_addr) | 68 | void sas_hash_addr(u8 *hashed, const u8 *sas_addr) |
| @@ -293,8 +318,7 @@ EXPORT_SYMBOL_GPL(sas_domain_release_transport); | |||
| 293 | 318 | ||
| 294 | static int __init sas_class_init(void) | 319 | static int __init sas_class_init(void) |
| 295 | { | 320 | { |
| 296 | sas_task_cache = kmem_cache_create("sas_task", sizeof(struct sas_task), | 321 | sas_task_cache = KMEM_CACHE(sas_task, SLAB_HWCACHE_ALIGN); |
| 297 | 0, SLAB_HWCACHE_ALIGN, NULL); | ||
| 298 | if (!sas_task_cache) | 322 | if (!sas_task_cache) |
| 299 | return -ENOMEM; | 323 | return -ENOMEM; |
| 300 | 324 | ||
diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index 4958fefff365..4196eee33dc9 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c | |||
| @@ -1387,28 +1387,6 @@ void mvs_dev_gone(struct domain_device *dev) | |||
| 1387 | mvs_dev_gone_notify(dev); | 1387 | mvs_dev_gone_notify(dev); |
| 1388 | } | 1388 | } |
| 1389 | 1389 | ||
| 1390 | static struct sas_task *mvs_alloc_task(void) | ||
| 1391 | { | ||
| 1392 | struct sas_task *task = kzalloc(sizeof(struct sas_task), GFP_KERNEL); | ||
| 1393 | |||
| 1394 | if (task) { | ||
| 1395 | INIT_LIST_HEAD(&task->list); | ||
| 1396 | spin_lock_init(&task->task_state_lock); | ||
| 1397 | task->task_state_flags = SAS_TASK_STATE_PENDING; | ||
| 1398 | init_timer(&task->timer); | ||
| 1399 | init_completion(&task->completion); | ||
| 1400 | } | ||
| 1401 | return task; | ||
| 1402 | } | ||
| 1403 | |||
| 1404 | static void mvs_free_task(struct sas_task *task) | ||
| 1405 | { | ||
| 1406 | if (task) { | ||
| 1407 | BUG_ON(!list_empty(&task->list)); | ||
| 1408 | kfree(task); | ||
| 1409 | } | ||
| 1410 | } | ||
| 1411 | |||
| 1412 | static void mvs_task_done(struct sas_task *task) | 1390 | static void mvs_task_done(struct sas_task *task) |
| 1413 | { | 1391 | { |
| 1414 | if (!del_timer(&task->timer)) | 1392 | if (!del_timer(&task->timer)) |
| @@ -1432,7 +1410,7 @@ static int mvs_exec_internal_tmf_task(struct domain_device *dev, | |||
| 1432 | struct sas_task *task = NULL; | 1410 | struct sas_task *task = NULL; |
| 1433 | 1411 | ||
| 1434 | for (retry = 0; retry < 3; retry++) { | 1412 | for (retry = 0; retry < 3; retry++) { |
| 1435 | task = mvs_alloc_task(); | 1413 | task = sas_alloc_task(GFP_KERNEL); |
| 1436 | if (!task) | 1414 | if (!task) |
| 1437 | return -ENOMEM; | 1415 | return -ENOMEM; |
| 1438 | 1416 | ||
| @@ -1490,15 +1468,14 @@ static int mvs_exec_internal_tmf_task(struct domain_device *dev, | |||
| 1490 | SAS_ADDR(dev->sas_addr), | 1468 | SAS_ADDR(dev->sas_addr), |
| 1491 | task->task_status.resp, | 1469 | task->task_status.resp, |
| 1492 | task->task_status.stat); | 1470 | task->task_status.stat); |
| 1493 | mvs_free_task(task); | 1471 | sas_free_task(task); |
| 1494 | task = NULL; | 1472 | task = NULL; |
| 1495 | 1473 | ||
| 1496 | } | 1474 | } |
| 1497 | } | 1475 | } |
| 1498 | ex_err: | 1476 | ex_err: |
| 1499 | BUG_ON(retry == 3 && task != NULL); | 1477 | BUG_ON(retry == 3 && task != NULL); |
| 1500 | if (task != NULL) | 1478 | sas_free_task(task); |
| 1501 | mvs_free_task(task); | ||
| 1502 | return res; | 1479 | return res; |
| 1503 | } | 1480 | } |
| 1504 | 1481 | ||
diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c index 6ae059ebb4bb..7dbbf8bb4d88 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c | |||
| @@ -669,30 +669,6 @@ int pm8001_dev_found(struct domain_device *dev) | |||
| 669 | return pm8001_dev_found_notify(dev); | 669 | return pm8001_dev |
