diff options
author | Dave Chinner <david@fromorbit.com> | 2014-05-20 08:56:00 +1000 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2014-05-20 08:56:00 +1000 |
commit | 0d907a3bb4a77cffebebd17c323e898048301aa3 (patch) | |
tree | c093289c9ab443935ce10e138ab49efacb2c283f /fs/xfs/xfs_log.h | |
parent | 2d6dcc6d7e95cc83046b2f97e179e6bbb7921245 (diff) | |
parent | 376c2f3a5f0706868b08ccf043bf3532936a03b1 (diff) |
Merge branch 'xfs-misc-fixes-2-for-3.16' into for-next
Conflicts:
fs/xfs/xfs_ialloc.c
Diffstat (limited to 'fs/xfs/xfs_log.h')
-rw-r--r-- | fs/xfs/xfs_log.h | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 2c4004475e7..84e0deb95ab 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -24,7 +24,8 @@ struct xfs_log_vec { struct xfs_log_iovec *lv_iovecp; /* iovec array */ struct xfs_log_item *lv_item; /* owner */ char *lv_buf; /* formatted buffer */ - int lv_buf_len; /* size of formatted buffer */ + int lv_bytes; /* accounted space in buffer */ + int lv_buf_len; /* aligned size of buffer */ int lv_size; /* size of allocated lv */ }; @@ -52,15 +53,21 @@ xlog_prepare_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp, return vec->i_addr; } +/* + * We need to make sure the next buffer is naturally aligned for the biggest + * basic data type we put into it. We already accounted for this padding when + * sizing the buffer. + * + * However, this padding does not get written into the log, and hence we have to + * track the space used by the log vectors separately to prevent log space hangs + * due to inaccurate accounting (i.e. a leak) of the used log space through the + * CIL context ticket. + */ static inline void xlog_finish_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec *vec, int len) { - /* - * We need to make sure the next buffer is naturally aligned for the - * biggest basic data type we put into it. We already accounted for - * this when sizing the buffer. - */ lv->lv_buf_len += round_up(len, sizeof(uint64_t)); + lv->lv_bytes += len; vec->i_len = len; } |