aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/block/scm_blk.h
diff options
context:
space:
mode:
authorSebastian Ott <sebott@linux.vnet.ibm.com>2012-08-28 10:51:19 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2012-09-26 09:45:01 -0400
commit0d804b20735d974534abb422f723d404b779433a (patch)
tree5ca065600a604eec5c45878cb0f432fb5c2b397d /drivers/s390/block/scm_blk.h
parentf30664e2c85c7804f07c636bbe99f35e0b2d4c76 (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.h38
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
27struct scm_request { 30struct 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 *);
40void scm_blk_dev_cleanup(struct scm_blk_dev *); 50void scm_blk_dev_cleanup(struct scm_blk_dev *);
41void scm_blk_irq(struct scm_device *, void *, int); 51void scm_blk_irq(struct scm_device *, void *, int);
42 52
53void scm_request_finish(struct scm_request *);
54void scm_request_requeue(struct scm_request *);
55
43int scm_drv_init(void); 56int scm_drv_init(void);
44void scm_drv_cleanup(void); 57void scm_drv_cleanup(void);
45 58
59#ifdef CONFIG_SCM_BLOCK_CLUSTER_WRITE
60void __scm_free_rq_cluster(struct scm_request *);
61int __scm_alloc_rq_cluster(struct scm_request *);
62void scm_request_cluster_init(struct scm_request *);
63bool scm_reserve_cluster(struct scm_request *);
64void scm_release_cluster(struct scm_request *);
65void scm_blk_dev_cluster_setup(struct scm_blk_dev *);
66bool scm_need_cluster_request(struct scm_request *);
67void scm_initiate_cluster_request(struct scm_request *);
68void scm_cluster_request_irq(struct scm_request *);
69bool scm_test_cluster_request(struct scm_request *);
70bool 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
47extern debug_info_t *scm_debug; 85extern debug_info_t *scm_debug;
48 86