|
@@ -39,6 +39,14 @@ static inline struct xfs_buf_log_item *BUF_ITEM(struct xfs_log_item *lip)
|
|
|
|
|
|
STATIC void xfs_buf_do_callbacks(struct xfs_buf *bp);
|
|
|
|
|
|
+static inline int
|
|
|
+xfs_buf_log_format_size(
|
|
|
+ struct xfs_buf_log_format *blfp)
|
|
|
+{
|
|
|
+ return offsetof(struct xfs_buf_log_format, blf_data_map) +
|
|
|
+ (blfp->blf_map_size * sizeof(blfp->blf_data_map[0]));
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* This returns the number of log iovecs needed to log the
|
|
|
* given buf log item.
|
|
@@ -49,25 +57,27 @@ STATIC void xfs_buf_do_callbacks(struct xfs_buf *bp);
|
|
|
*
|
|
|
* If the XFS_BLI_STALE flag has been set, then log nothing.
|
|
|
*/
|
|
|
-STATIC uint
|
|
|
+STATIC void
|
|
|
xfs_buf_item_size_segment(
|
|
|
struct xfs_buf_log_item *bip,
|
|
|
- struct xfs_buf_log_format *blfp)
|
|
|
+ struct xfs_buf_log_format *blfp,
|
|
|
+ int *nvecs,
|
|
|
+ int *nbytes)
|
|
|
{
|
|
|
struct xfs_buf *bp = bip->bli_buf;
|
|
|
- uint nvecs;
|
|
|
int next_bit;
|
|
|
int last_bit;
|
|
|
|
|
|
last_bit = xfs_next_bit(blfp->blf_data_map, blfp->blf_map_size, 0);
|
|
|
if (last_bit == -1)
|
|
|
- return 0;
|
|
|
+ return;
|
|
|
|
|
|
/*
|
|
|
* initial count for a dirty buffer is 2 vectors - the format structure
|
|
|
* and the first dirty region.
|
|
|
*/
|
|
|
- nvecs = 2;
|
|
|
+ *nvecs += 2;
|
|
|
+ *nbytes += xfs_buf_log_format_size(blfp) + XFS_BLF_CHUNK;
|
|
|
|
|
|
while (last_bit != -1) {
|
|
|
/*
|
|
@@ -87,18 +97,17 @@ xfs_buf_item_size_segment(
|
|
|
break;
|
|
|
} else if (next_bit != last_bit + 1) {
|
|
|
last_bit = next_bit;
|
|
|
- nvecs++;
|
|
|
+ (*nvecs)++;
|
|
|
} else if (xfs_buf_offset(bp, next_bit * XFS_BLF_CHUNK) !=
|
|
|
(xfs_buf_offset(bp, last_bit * XFS_BLF_CHUNK) +
|
|
|
XFS_BLF_CHUNK)) {
|
|
|
last_bit = next_bit;
|
|
|
- nvecs++;
|
|
|
+ (*nvecs)++;
|
|
|
} else {
|
|
|
last_bit++;
|
|
|
}
|
|
|
+ *nbytes += XFS_BLF_CHUNK;
|
|
|
}
|
|
|
-
|
|
|
- return nvecs;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -118,12 +127,13 @@ xfs_buf_item_size_segment(
|
|
|
* If the XFS_BLI_STALE flag has been set, then log nothing but the buf log
|
|
|
* format structures.
|
|
|
*/
|
|
|
-STATIC uint
|
|
|
+STATIC void
|
|
|
xfs_buf_item_size(
|
|
|
- struct xfs_log_item *lip)
|
|
|
+ struct xfs_log_item *lip,
|
|
|
+ int *nvecs,
|
|
|
+ int *nbytes)
|
|
|
{
|
|
|
struct xfs_buf_log_item *bip = BUF_ITEM(lip);
|
|
|
- uint nvecs;
|
|
|
int i;
|
|
|
|
|
|
ASSERT(atomic_read(&bip->bli_refcount) > 0);
|
|
@@ -135,7 +145,11 @@ xfs_buf_item_size(
|
|
|
*/
|
|
|
trace_xfs_buf_item_size_stale(bip);
|
|
|
ASSERT(bip->__bli_format.blf_flags & XFS_BLF_CANCEL);
|
|
|
- return bip->bli_format_count;
|
|
|
+ *nvecs += bip->bli_format_count;
|
|
|
+ for (i = 0; i < bip->bli_format_count; i++) {
|
|
|
+ *nbytes += xfs_buf_log_format_size(&bip->bli_formats[i]);
|
|
|
+ }
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
ASSERT(bip->bli_flags & XFS_BLI_LOGGED);
|
|
@@ -147,7 +161,8 @@ xfs_buf_item_size(
|
|
|
* commit, so no vectors are used at all.
|
|
|
*/
|
|
|
trace_xfs_buf_item_size_ordered(bip);
|
|
|
- return XFS_LOG_VEC_ORDERED;
|
|
|
+ *nvecs = XFS_LOG_VEC_ORDERED;
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -159,13 +174,11 @@ xfs_buf_item_size(
|
|
|
* count for the extra buf log format structure that will need to be
|
|
|
* written.
|
|
|
*/
|
|
|
- nvecs = 0;
|
|
|
for (i = 0; i < bip->bli_format_count; i++) {
|
|
|
- nvecs += xfs_buf_item_size_segment(bip, &bip->bli_formats[i]);
|
|
|
+ xfs_buf_item_size_segment(bip, &bip->bli_formats[i],
|
|
|
+ nvecs, nbytes);
|
|
|
}
|
|
|
-
|
|
|
trace_xfs_buf_item_size(bip);
|
|
|
- return nvecs;
|
|
|
}
|
|
|
|
|
|
static struct xfs_log_iovec *
|
|
@@ -192,8 +205,7 @@ xfs_buf_item_format_segment(
|
|
|
* the actual size of the dirty bitmap rather than the size of the in
|
|
|
* memory structure.
|
|
|
*/
|
|
|
- base_size = offsetof(struct xfs_buf_log_format, blf_data_map) +
|
|
|
- (blfp->blf_map_size * sizeof(blfp->blf_data_map[0]));
|
|
|
+ base_size = xfs_buf_log_format_size(blfp);
|
|
|
|
|
|
nvecs = 0;
|
|
|
first_bit = xfs_next_bit(blfp->blf_data_map, blfp->blf_map_size, 0);
|