diff --git a/src/knot/server/journal.c b/src/knot/server/journal.c
index 2c1e873a76e69c2fa9c0a7fd2d778d6141ed0541..37ea0829d5b95b695a4a42453edf24179973fc23 100644
--- a/src/knot/server/journal.c
+++ b/src/knot/server/journal.c
@@ -483,10 +483,10 @@ int journal_write_in(journal_t *j, journal_node_t **rn, uint64_t id, size_t len)
 	dbg_journal("journal: will write id=%llu, node=%u, size=%zu, fsize=%zu\n",
 	            (unsigned long long)id, j->qtail, len, j->fsize);
 
-	/* Calculate remaining bytes to reach file size limit. */
-	size_t fs_remaining = 0;
-	if (j->fsize < j->fslimit) {
-		fs_remaining = j->fslimit - j->fsize;
+	/* Calculate file end position (with imposed limits). */
+	size_t file_end = j->fsize;
+	if (file_end > j->fslimit) {
+		file_end = j->fslimit;
 	}
 
 	int seek_ret = 0;
@@ -495,12 +495,12 @@ int journal_write_in(journal_t *j, journal_node_t **rn, uint64_t id, size_t len)
 	dbg_journal("journal: free.pos = %u free.len = %u\n",
 	            j->free.pos, j->free.len);
 	journal_node_t *n = j->nodes + j->qtail;
-	if (j->free.pos + j->free.len == j->fsize) {
+	if (j->free.pos + len >= file_end) {
 
 		dbg_journal_verb("journal: * is last node\n");
 
 		/* Grow journal file until the size limit. */
-		if(j->free.len < len && len <= fs_remaining) {
+		if(j->free.pos + len < j->fslimit) {
 			size_t diff = len - j->free.len;
 			dbg_journal("journal: * growing by +%zu, pos=%u, "
 			            "new fsize=%zu\n",
@@ -509,10 +509,8 @@ int journal_write_in(journal_t *j, journal_node_t **rn, uint64_t id, size_t len)
 			j->fsize += diff; /* Appending increases file size. */
 			j->free.len += diff;
 
-		}
-
-		/*  Rewind if resize is needed, but the limit is reached. */
-		if(j->free.len < len && len > fs_remaining) {
+		} else {
+			/*  Rewind if resize is needed, but the limit is reached. */
 			journal_node_t *head = j->nodes + j->qhead;
 			j->fsize = j->free.pos;
 			j->free.pos = head->pos;