diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2007-10-22 14:01:06 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2007-10-22 15:20:03 -0400 |
commit | d6ec084200c37683278c821338f74ddf21ab80f5 (patch) | |
tree | 931a112061e3a861768384b8b6ea20fdd35bd41b /include/linux/scatterlist.h | |
parent | 18dabf473e15850c0dbc8ff13ac1e2806d542c15 (diff) |
Add CONFIG_DEBUG_SG sg validation
Add a Kconfig entry which will toggle some sanity checks on the sg
entry and tables.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'include/linux/scatterlist.h')
-rw-r--r-- | include/linux/scatterlist.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index c6136e8a7f58..42daf5e15265 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h | |||
@@ -23,6 +23,8 @@ | |||
23 | * | 23 | * |
24 | */ | 24 | */ |
25 | 25 | ||
26 | #define SG_MAGIC 0x87654321 | ||
27 | |||
26 | /** | 28 | /** |
27 | * sg_set_page - Set sg entry to point at given page | 29 | * sg_set_page - Set sg entry to point at given page |
28 | * @sg: SG entry | 30 | * @sg: SG entry |
@@ -39,6 +41,9 @@ static inline void sg_set_page(struct scatterlist *sg, struct page *page) | |||
39 | { | 41 | { |
40 | unsigned long page_link = sg->page_link & 0x3; | 42 | unsigned long page_link = sg->page_link & 0x3; |
41 | 43 | ||
44 | #ifdef CONFIG_DEBUG_SG | ||
45 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
46 | #endif | ||
42 | sg->page_link = page_link | (unsigned long) page; | 47 | sg->page_link = page_link | (unsigned long) page; |
43 | } | 48 | } |
44 | 49 | ||
@@ -81,6 +86,9 @@ static inline void sg_set_buf(struct scatterlist *sg, const void *buf, | |||
81 | **/ | 86 | **/ |
82 | static inline struct scatterlist *sg_next(struct scatterlist *sg) | 87 | static inline struct scatterlist *sg_next(struct scatterlist *sg) |
83 | { | 88 | { |
89 | #ifdef CONFIG_DEBUG_SG | ||
90 | BUG_ON(sg->sg_magic != SG_MAGIC); | ||
91 | #endif | ||
84 | if (sg_is_last(sg)) | 92 | if (sg_is_last(sg)) |
85 | return NULL; | 93 | return NULL; |
86 | 94 | ||
@@ -124,6 +132,10 @@ static inline struct scatterlist *sg_last(struct scatterlist *sgl, | |||
124 | ret = sg; | 132 | ret = sg; |
125 | 133 | ||
126 | #endif | 134 | #endif |
135 | #ifdef CONFIG_DEBUG_SG | ||
136 | BUG_ON(sgl[0].sg_magic != SG_MAGIC); | ||
137 | BUG_ON(!sg_is_last(ret)); | ||
138 | #endif | ||
127 | return ret; | 139 | return ret; |
128 | } | 140 | } |
129 | 141 | ||
@@ -180,6 +192,9 @@ static inline void sg_init_one(struct scatterlist *sg, const void *buf, | |||
180 | unsigned int buflen) | 192 | unsigned int buflen) |
181 | { | 193 | { |
182 | memset(sg, 0, sizeof(*sg)); | 194 | memset(sg, 0, sizeof(*sg)); |
195 | #ifdef CONFIG_DEBUG_SG | ||
196 | sg->sg_magic = SG_MAGIC; | ||
197 | #endif | ||
183 | sg_mark_end(sg, 1); | 198 | sg_mark_end(sg, 1); |
184 | sg_set_buf(sg, buf, buflen); | 199 | sg_set_buf(sg, buf, buflen); |
185 | } | 200 | } |
@@ -198,6 +213,13 @@ static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents) | |||
198 | { | 213 | { |
199 | memset(sgl, 0, sizeof(*sgl) * nents); | 214 | memset(sgl, 0, sizeof(*sgl) * nents); |
200 | sg_mark_end(sgl, nents); | 215 | sg_mark_end(sgl, nents); |
216 | #ifdef CONFIG_DEBUG_SG | ||
217 | { | ||
218 | int i; | ||
219 | for (i = 0; i < nents; i++) | ||
220 | sgl[i].sg_magic = SG_MAGIC; | ||
221 | } | ||
222 | #endif | ||
201 | } | 223 | } |
202 | 224 | ||
203 | /** | 225 | /** |