Commit Diff


commit - 7e4524011b432ca5225d9768ba7f11a377776fbf
commit + e46cacb0ea9585214d69351de895e7f460f4846f
blob - 4d8ab578e2cf177bcb3dcc2546627bfd48e1004f
blob + a8aaaa795524a553f0b8f183a1d2f20d57745e81
--- src/cmd/venti/srv/arena.c
+++ src/cmd/venti/srv/arena.c
@@ -613,7 +613,8 @@ wbarenahead(Arena *arena)
 	 * during initialization.
 	 */
 	bad = packarenahead(&head, b->data)<0 ||
-	      writepart(arena->part, arena->base - arena->blocksize, b->data, arena->blocksize)<0;
+	      writepart(arena->part, arena->base - arena->blocksize, b->data, arena->blocksize)<0 ||
+	      flushpart(arena->part)<0;
 	freezblock(b);
 	if(bad)
 		return -1;
blob - 05cb396b7736f34c911e120e25a8609b167dcb17
blob + cb402e2036ce2632fc988c4943c6516c24881909
--- src/cmd/venti/srv/arenas.c
+++ src/cmd/venti/srv/arenas.c
@@ -222,7 +222,8 @@ wbarenapart(ArenaPart *ap)
 		freezblock(b);
 		return -1;
 	}
-	if(writepart(ap->part, PartBlank, b->data, HeadSize) < 0){
+	if(writepart(ap->part, PartBlank, b->data, HeadSize) < 0 ||
+	   flushpart(ap->part) < 0){
 		seterr(EAdmin, "can't write arena partition header: %r");
 		freezblock(b);
 		return -1;
@@ -325,7 +326,7 @@ wbarenamap(AMap *am, int n, Part *part, u64int base, u
 		freezblock(b);
 		return -1;
 	}
-	if(writepart(part, base, b->data, size) < 0){
+	if(writepart(part, base, b->data, size) < 0 || flushpart(part) < 0){
 		seterr(EAdmin, "can't write arena set: %r");
 		freezblock(b);
 		return -1;
blob - bd398815e031cf80ba718ab1f5357ac67c690048
blob + 0710d362a34520ce1f112f575063cc1997c65525
--- src/cmd/venti/srv/bloom.c
+++ src/cmd/venti/srv/bloom.c
@@ -121,7 +121,11 @@ int
 writebloom(Bloom *b)
 {
 	wbbloomhead(b);
-	return writepart(b->part, 0, b->data, b->size);
+	if(writepart(b->part, 0, b->data, b->size) < 0)
+		return -1;
+	if(flushpart(b->part) < 0)
+		return -1;
+	return 0;
 }
 
 /*
blob - 52a5364d63bc81135f67b493292f29f43ef3f116
blob + 9066296f702060750dcc9ec264db60e1662a14c4
--- src/cmd/venti/srv/dcache.c
+++ src/cmd/venti/srv/dcache.c
@@ -734,7 +734,7 @@ parallelwrites(DBlock **b, DBlock **eb, int dirty)
 	for(p=b; p<q; p++){
 		if(part != (*p)->part){
 			part = (*p)->part;
-			flushpart(part);
+			flushpart(part);	/* what if it fails? */
 		}
 	}
 
blob - c631bfd13d2698df50a1e6696d0edda23e2bf395
blob + 263ccd30e8cc7e2df2b9853a73fb4c1f43044e3b
--- src/cmd/venti/srv/fns.h
+++ src/cmd/venti/srv/fns.h
@@ -38,6 +38,7 @@ Arena		*findarena(char *name);
 int		flushciblocks(Arena *arena);
 void		flushdcache(void);
 void		flushicache(void);
+int		flushpart(Part*);
 void		flushqueue(void);
 void		fmtzbinit(Fmt *f, ZBlock *b);
 void		freearena(Arena *arena);
blob - 8f8fed4ed3cda8b7d79a84837e9af819e7b77250
blob + 49344c9f1de978cbad3c5181952e2a5e320c46f2
--- src/cmd/venti/srv/icachewrite.c
+++ src/cmd/venti/srv/icachewrite.c
@@ -175,13 +175,12 @@ icachewritesect(Index *ix, ISect *is, u8int *buf)
 		diskaccess(1);
 
 		trace(TraceProc, "icachewritesect writepart", addr, nbuf);
-		if(writepart(is->part, addr, buf, nbuf) < 0){
+		if(writepart(is->part, addr, buf, nbuf) < 0 || flushpart(is->part) < 0){
 			/* XXX more details here */
 			fprint(2, "icachewriteproc writepart: %r\n");
 			err = -1;
 			continue;
 		}
-		flushpart(is->part);
 		addstat(StatIsectWriteBytes, nbuf);
 		addstat(StatIsectWrite, 1);
 		icacheclean(chunk);
blob - 7d477e7609db96c7bbc9d0b2c2061eb1960a823b
blob + a5ffeef9cab59fd8a4d5551bf29c7cf3fdc1605c
--- src/cmd/venti/srv/index.c
+++ src/cmd/venti/srv/index.c
@@ -144,7 +144,8 @@ wbindex(Index *ix)
 		return -1;
 	}
 	for(i = 0; i < ix->nsects; i++){
-		if(writepart(ix->sects[i]->part, ix->sects[i]->tabbase, b->data, ix->tabsize) < 0){
+		if(writepart(ix->sects[i]->part, ix->sects[i]->tabbase, b->data, ix->tabsize) < 0
+		|| flushpart(ix->sects[i]->part) < 0){
 			seterr(EOk, "can't write index: %r");
 			freezblock(b);
 			return -1;
@@ -498,7 +499,7 @@ wbisect(ISect *is)
 		freezblock(b);
 		return -1;
 	}
-	if(writepart(is->part, PartBlank, b->data, HeadSize) < 0){
+	if(writepart(is->part, PartBlank, b->data, HeadSize) < 0 || flushpart(is->part) < 0){
 		seterr(EAdmin, "can't write index section header: %r");
 		freezblock(b);
 		return -1;
blob - 0555336a30dd01f57a42a0f48306abcf8c5ece15
blob + 77634e84260883338bfe16d3aa6095edd8bdceb3
--- src/cmd/venti/srv/mirrorarenas.c
+++ src/cmd/venti/srv/mirrorarenas.c
@@ -80,7 +80,7 @@ ereadpart(Part *p, u64int offset, u8int *buf, u32int c
 int
 ewritepart(Part *p, u64int offset, u8int *buf, u32int count)
 {
-	if(writepart(p, offset, buf, count) != count){
+	if(writepart(p, offset, buf, count) != count || flushpart(p) < 0){
 		chat("%T writepart %s at %#llux+%ud: %r\n", p->name, offset, count);
 		return -1;
 	}
blob - e33c7b76ad268e08cd5a772fe181ece6510f2258
blob + 2be6a19fb87c2f3081e6cb2c02732e9c2ace1dc6
--- src/cmd/venti/srv/part.c
+++ src/cmd/venti/srv/part.c
@@ -16,16 +16,6 @@
 #include "dat.h"
 #include "fns.h"
 
-/* TODO for linux:
-don't use O_DIRECT.
-use
-	posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE);
-after block is read and also use
-	posix_fadvise(fd, 0, 0, POSIX_FADV_RANDOM);
-to disable readahead on the index partition.
-bump block size of bloom filter higher.
-*/
-
 u32int	maxblocksize;
 int	readonly;
 
@@ -116,6 +106,9 @@ initpart(char *name, int mode)
 		mode &= (OREAD|OWRITE|ORDWR);
 		mode |= OREAD;
 	}
+#ifdef __linux__	/* sorry, but linus made O_DIRECT unusable! */
+	mode &= ~ODIRECT;
+#endif
 	part->fd = open(file, mode);
 	if(part->fd < 0){
 		if((mode&(OREAD|OWRITE|ORDWR)) == ORDWR)
@@ -130,6 +123,9 @@ initpart(char *name, int mode)
 		}
 		fprint(2, "warning: %s opened for reading only\n", name);
 	}
+#ifdef __linux__	/* sorry again!  still linus's fault! */
+	posix_fadvise(part->fd, 0, 0, POSIX_FADV_RANDOM);	/* disable readahead */
+#endif
 	part->offset = lo;
 	dir = dirfstat(part->fd);
 	if(dir == nil){
@@ -166,9 +162,18 @@ initpart(char *name, int mode)
 	return part;
 }
 
-void
+int
 flushpart(Part *part)
 {
+	USED(part);
+#ifdef __linux__	/* grrr! */
+	if(fsync(part->fd) < 0){
+		logerr(EAdmin, "flushpart %s: %r", part->name);
+		return -1;
+	}
+	posix_fadvise(part->fd, 0, 0, POSIX_FADV_DONTNEED);
+#endif
+	return 0;
 }
 
 void
@@ -420,6 +425,9 @@ rwpart(Part *part, int isread, u64int offset, u8int *b
 #endif
 		break;
 	}
+#ifdef __linux__	/* sigh */
+	posix_fadvise(part->fd, part->offset+offset, n, POSIX_FADV_DONTNEED);
+#endif
 	return n;
 }
 int
blob - b94b72841c419673cbff6f78de2bbe23dd30f653
blob + 97d6038eea6af9c273bc540af4956934ebc1ae9c
--- src/cmd/venti/srv/zeropart.c
+++ src/cmd/venti/srv/zeropart.c
@@ -23,5 +23,8 @@ zeropart(Part *part, int blocksize)
 		if(writepart(part, addr, b->data, blocksize) < 0)
 			sysfatal("can't initialize %s: %r", part->name);
 
+	if(flushpart(part) < 0)
+		sysfatal("can't flush writes to %s: %r", part->name);
+
 	freezblock(b);
 }