aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/catalog/storage.c4
-rw-r--r--src/backend/storage/smgr/smgr.c24
2 files changed, 24 insertions, 4 deletions
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index 5b22cf10990..11b3ea40200 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -418,7 +418,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks)
* longer exist after truncation is complete, and then truncate the
* corresponding files on disk.
*/
- smgrtruncate(RelationGetSmgr(rel), forks, nforks, old_blocks, blocks);
+ smgrtruncate2(RelationGetSmgr(rel), forks, nforks, old_blocks, blocks);
END_CRIT_SECTION();
@@ -1059,7 +1059,7 @@ smgr_redo(XLogReaderState *record)
if (nforks > 0)
{
START_CRIT_SECTION();
- smgrtruncate(reln, forks, nforks, old_blocks, blocks);
+ smgrtruncate2(reln, forks, nforks, old_blocks, blocks);
END_CRIT_SECTION();
}
diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c
index b3fb8bc3ea8..89d62d1dee8 100644
--- a/src/backend/storage/smgr/smgr.c
+++ b/src/backend/storage/smgr/smgr.c
@@ -693,6 +693,26 @@ smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum)
* smgrtruncate() -- Truncate the given forks of supplied relation to
* each specified numbers of blocks
*
+ * Backward-compatible version of smgrtruncate2() for the benefit of external
+ * callers. This version isn't used in PostgreSQL core code, and can't be
+ * used in a critical section.
+ */
+void
+smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks,
+ BlockNumber *nblocks)
+{
+ BlockNumber old_nblocks[MAX_FORKNUM + 1];
+
+ for (int i = 0; i < nforks; ++i)
+ old_nblocks[i] = smgrnblocks(reln, forknum[i]);
+
+ return smgrtruncate2(reln, forknum, nforks, old_nblocks, nblocks);
+}
+
+/*
+ * smgrtruncate2() -- Truncate the given forks of supplied relation to
+ * each specified numbers of blocks
+ *
* The truncation is done immediately, so this can't be rolled back.
*
* The caller must hold AccessExclusiveLock on the relation, to ensure that
@@ -704,8 +724,8 @@ smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum)
* to this relation should be called in between.
*/
void
-smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks,
- BlockNumber *old_nblocks, BlockNumber *nblocks)
+smgrtruncate2(SMgrRelation reln, ForkNumber *forknum, int nforks,
+ BlockNumber *old_nblocks, BlockNumber *nblocks)
{
int i;