diff options
Diffstat (limited to 'fs/xfs/xfs_log.h')
-rw-r--r-- | fs/xfs/xfs_log.h | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 384c6c469661..b0f4ef77fa70 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h | |||
@@ -31,18 +31,51 @@ struct xfs_log_vec { | |||
31 | #define XFS_LOG_VEC_ORDERED (-1) | 31 | #define XFS_LOG_VEC_ORDERED (-1) |
32 | 32 | ||
33 | static inline void * | 33 | static inline void * |
34 | xlog_copy_iovec(struct xfs_log_iovec **vecp, uint type, void *data, int len) | 34 | xlog_prepare_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp, |
35 | uint type) | ||
35 | { | 36 | { |
36 | struct xfs_log_iovec *vec = *vecp; | 37 | struct xfs_log_iovec *vec = *vecp; |
37 | 38 | ||
39 | if (vec) { | ||
40 | ASSERT(vec - lv->lv_iovecp < lv->lv_niovecs); | ||
41 | vec++; | ||
42 | } else { | ||
43 | vec = &lv->lv_iovecp[0]; | ||
44 | } | ||
45 | |||
38 | vec->i_type = type; | 46 | vec->i_type = type; |
39 | vec->i_addr = data; | 47 | vec->i_addr = lv->lv_buf + lv->lv_buf_len; |
40 | vec->i_len = len; | 48 | |
49 | ASSERT(IS_ALIGNED((unsigned long)vec->i_addr, sizeof(uint64_t))); | ||
41 | 50 | ||
42 | *vecp = vec + 1; | 51 | *vecp = vec; |
43 | return vec->i_addr; | 52 | return vec->i_addr; |
44 | } | 53 | } |
45 | 54 | ||
55 | static inline void | ||
56 | xlog_finish_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec *vec, int len) | ||
57 | { | ||
58 | /* | ||
59 | * We need to make sure the next buffer is naturally aligned for the | ||
60 | * biggest basic data type we put into it. We already accounted for | ||
61 | * this when sizing the buffer. | ||
62 | */ | ||
63 | lv->lv_buf_len += round_up(len, sizeof(uint64_t)); | ||
64 | vec->i_len = len; | ||
65 | } | ||
66 | |||
67 | static inline void * | ||
68 | xlog_copy_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp, | ||
69 | uint type, void *data, int len) | ||
70 | { | ||
71 | void *buf; | ||
72 | |||
73 | buf = xlog_prepare_iovec(lv, vecp, type); | ||
74 | memcpy(buf, data, len); | ||
75 | xlog_finish_iovec(lv, *vecp, len); | ||
76 | return buf; | ||
77 | } | ||
78 | |||
46 | /* | 79 | /* |
47 | * Structure used to pass callback function and the function's argument | 80 | * Structure used to pass callback function and the function's argument |
48 | * to the log manager. | 81 | * to the log manager. |