diff options
author | Sebastian Ott <sebott@linux.vnet.ibm.com> | 2012-08-28 10:51:19 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2012-09-26 09:45:01 -0400 |
commit | 0d804b20735d974534abb422f723d404b779433a (patch) | |
tree | 5ca065600a604eec5c45878cb0f432fb5c2b397d /drivers/s390/block/scm_blk.h | |
parent | f30664e2c85c7804f07c636bbe99f35e0b2d4c76 (diff) |
s390/scm_block: force cluster writes
Force writes to Storage Class Memory (SCM) to be in done in clusters.
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/block/scm_blk.h')
-rw-r--r-- | drivers/s390/block/scm_blk.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/s390/block/scm_blk.h b/drivers/s390/block/scm_blk.h index 5aba5612588f..7ac6bad919ef 100644 --- a/drivers/s390/block/scm_blk.h +++ b/drivers/s390/block/scm_blk.h | |||
@@ -22,6 +22,9 @@ struct scm_blk_dev { | |||
22 | spinlock_t lock; /* guard the rest of the blockdev */ | 22 | spinlock_t lock; /* guard the rest of the blockdev */ |
23 | atomic_t queued_reqs; | 23 | atomic_t queued_reqs; |
24 | struct list_head finished_requests; | 24 | struct list_head finished_requests; |
25 | #ifdef CONFIG_SCM_BLOCK_CLUSTER_WRITE | ||
26 | struct list_head cluster_list; | ||
27 | #endif | ||
25 | }; | 28 | }; |
26 | 29 | ||
27 | struct scm_request { | 30 | struct scm_request { |
@@ -32,6 +35,13 @@ struct scm_request { | |||
32 | struct list_head list; | 35 | struct list_head list; |
33 | u8 retries; | 36 | u8 retries; |
34 | int error; | 37 | int error; |
38 | #ifdef CONFIG_SCM_BLOCK_CLUSTER_WRITE | ||
39 | struct { | ||
40 | enum {CLUSTER_NONE, CLUSTER_READ, CLUSTER_WRITE} state; | ||
41 | struct list_head list; | ||
42 | void **buf; | ||
43 | } cluster; | ||
44 | #endif | ||
35 | }; | 45 | }; |
36 | 46 | ||
37 | #define to_aobrq(rq) container_of((void *) rq, struct aob_rq_header, data) | 47 | #define to_aobrq(rq) container_of((void *) rq, struct aob_rq_header, data) |
@@ -40,9 +50,37 @@ int scm_blk_dev_setup(struct scm_blk_dev *, struct scm_device *); | |||
40 | void scm_blk_dev_cleanup(struct scm_blk_dev *); | 50 | void scm_blk_dev_cleanup(struct scm_blk_dev *); |
41 | void scm_blk_irq(struct scm_device *, void *, int); | 51 | void scm_blk_irq(struct scm_device *, void *, int); |
42 | 52 | ||
53 | void scm_request_finish(struct scm_request *); | ||
54 | void scm_request_requeue(struct scm_request *); | ||
55 | |||
43 | int scm_drv_init(void); | 56 | int scm_drv_init(void); |
44 | void scm_drv_cleanup(void); | 57 | void scm_drv_cleanup(void); |
45 | 58 | ||
59 | #ifdef CONFIG_SCM_BLOCK_CLUSTER_WRITE | ||
60 | void __scm_free_rq_cluster(struct scm_request *); | ||
61 | int __scm_alloc_rq_cluster(struct scm_request *); | ||
62 | void scm_request_cluster_init(struct scm_request *); | ||
63 | bool scm_reserve_cluster(struct scm_request *); | ||
64 | void scm_release_cluster(struct scm_request *); | ||
65 | void scm_blk_dev_cluster_setup(struct scm_blk_dev *); | ||
66 | bool scm_need_cluster_request(struct scm_request *); | ||
67 | void scm_initiate_cluster_request(struct scm_request *); | ||
68 | void scm_cluster_request_irq(struct scm_request *); | ||
69 | bool scm_test_cluster_request(struct scm_request *); | ||
70 | bool scm_cluster_size_valid(void); | ||
71 | #else | ||
72 | #define __scm_free_rq_cluster(scmrq) {} | ||
73 | #define __scm_alloc_rq_cluster(scmrq) 0 | ||
74 | #define scm_request_cluster_init(scmrq) {} | ||
75 | #define scm_reserve_cluster(scmrq) true | ||
76 | #define scm_release_cluster(scmrq) {} | ||
77 | #define scm_blk_dev_cluster_setup(bdev) {} | ||
78 | #define scm_need_cluster_request(scmrq) false | ||
79 | #define scm_initiate_cluster_request(scmrq) {} | ||
80 | #define scm_cluster_request_irq(scmrq) {} | ||
81 | #define scm_test_cluster_request(scmrq) false | ||
82 | #define scm_cluster_size_valid() true | ||
83 | #endif | ||
46 | 84 | ||
47 | extern debug_info_t *scm_debug; | 85 | extern debug_info_t *scm_debug; |
48 | 86 | ||