diff options
Diffstat (limited to 'src/backend/storage/smgr/md.c')
-rw-r--r-- | src/backend/storage/smgr/md.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index 6796756358f..cc8a80ee961 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -804,6 +804,21 @@ buffers_to_iovec(struct iovec *iov, void **buffers, int nblocks) } /* + * mdmaxcombine() -- Return the maximum number of total blocks that can be + * combined with an IO starting at blocknum. + */ +uint32 +mdmaxcombine(SMgrRelation reln, ForkNumber forknum, + BlockNumber blocknum) +{ + BlockNumber segoff; + + segoff = blocknum % ((BlockNumber) RELSEG_SIZE); + + return RELSEG_SIZE - segoff; +} + +/* * mdreadv() -- Read the specified blocks from a relation. */ void @@ -833,6 +848,9 @@ mdreadv(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, RELSEG_SIZE - (blocknum % ((BlockNumber) RELSEG_SIZE))); nblocks_this_segment = Min(nblocks_this_segment, lengthof(iov)); + if (nblocks_this_segment != nblocks) + elog(ERROR, "read crosses segment boundary"); + iovcnt = buffers_to_iovec(iov, buffers, nblocks_this_segment); size_this_segment = nblocks_this_segment * BLCKSZ; transferred_this_segment = 0; @@ -956,6 +974,9 @@ mdwritev(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, RELSEG_SIZE - (blocknum % ((BlockNumber) RELSEG_SIZE))); nblocks_this_segment = Min(nblocks_this_segment, lengthof(iov)); + if (nblocks_this_segment != nblocks) + elog(ERROR, "write crosses segment boundary"); + iovcnt = buffers_to_iovec(iov, (void **) buffers, nblocks_this_segment); size_this_segment = nblocks_this_segment * BLCKSZ; transferred_this_segment = 0; |