call fdatasync() after updating .uidvalidity files
they must be flushed before the file system meta data, as otherwise we may end up with duplicate UIDs after a system crash.
This commit is contained in:
parent
47fe4b7998
commit
2e07e68630
|
@ -42,6 +42,10 @@
|
|||
# define LEGACY_FLOCK 1
|
||||
#endif
|
||||
|
||||
#ifndef _POSIX_SYNCHRONIZED_IO
|
||||
# define fdatasync fsync
|
||||
#endif
|
||||
|
||||
#ifdef USE_DB
|
||||
#include <db.h>
|
||||
#endif /* USE_DB */
|
||||
|
@ -428,7 +432,7 @@ maildir_store_uid( maildir_store_t *ctx )
|
|||
|
||||
n = sprintf( buf, "%d\n%d\n", ctx->gen.uidvalidity, ctx->nuid );
|
||||
lseek( ctx->uvfd, 0, SEEK_SET );
|
||||
if (write( ctx->uvfd, buf, n ) != n || ftruncate( ctx->uvfd, n )) {
|
||||
if (write( ctx->uvfd, buf, n ) != n || ftruncate( ctx->uvfd, n ) || fdatasync( ctx->uvfd )) {
|
||||
error( "Maildir error: cannot write UIDVALIDITY.\n" );
|
||||
return DRV_BOX_BAD;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user