smgr-fix.patch
text/x-patch
Filename: smgr-fix.patch
Type: text/x-patch
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/storage/smgr/smgr.c | 18 | 13 |
| src/include/storage/smgr.h | 1 | 0 |
diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c
index 0c0bba4ab3..02a5d5cdda 100644
--- a/src/backend/storage/smgr/smgr.c
+++ b/src/backend/storage/smgr/smgr.c
@@ -259,7 +259,12 @@ static void
add_to_unowned_list(SMgrRelation reln)
{
/* place it at head of the list (to make smgrsetowner cheap) */
+ reln->prev_unowned_reln = NULL;
reln->next_unowned_reln = first_unowned_reln;
+
+ if (first_unowned_reln)
+ first_unowned_reln->prev_unowned_reln = reln;
+
first_unowned_reln = reln;
}
@@ -279,20 +284,20 @@ add_to_unowned_list(SMgrRelation reln)
static void
remove_from_unowned_list(SMgrRelation reln)
{
- SMgrRelation *link;
- SMgrRelation cur;
+ SMgrRelation prev;
+ SMgrRelation next;
- for (link = &first_unowned_reln, cur = *link;
- cur != NULL;
- link = &cur->next_unowned_reln, cur = *link)
- {
- if (cur == reln)
- {
- *link = cur->next_unowned_reln;
- cur->next_unowned_reln = NULL;
- break;
- }
- }
+ prev = reln->prev_unowned_reln;
+ next = reln->next_unowned_reln;
+
+ if (prev)
+ prev->next_unowned_reln = reln->next_unowned_reln;
+
+ if (next)
+ next->prev_unowned_reln = reln->prev_unowned_reln;
+
+ if (reln == first_unowned_reln)
+ first_unowned_reln = next;
}
/*
diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h
index 820d08ed4e..ed6c4421eb 100644
--- a/src/include/storage/smgr.h
+++ b/src/include/storage/smgr.h
@@ -72,6 +72,7 @@ typedef struct SMgrRelationData
struct _MdfdVec *md_seg_fds[MAX_FORKNUM + 1];
/* if unowned, list link in list of all unowned SMgrRelations */
+ struct SMgrRelationData *prev_unowned_reln;
struct SMgrRelationData *next_unowned_reln;
} SMgrRelationData;