RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: [email protected] Module: rpm Date: 13-Oct-2009 01:05:39 Branch: HEAD Handle: 2009101223053900 Modified files: rpm/lib fsm.c rpm/rpmdb logio.h logio.src logio_rec.c rpmdb.h Log: - dbi: log content for unlink/rename undo. Summary: Revision Changes Path 2.192 +59 -7 rpm/lib/fsm.c 1.8 +3 -3 rpm/rpmdb/logio.h 1.7 +10 -3 rpm/rpmdb/logio.src 1.6 +44 -2 rpm/rpmdb/logio_rec.c 1.117 +37 -21 rpm/rpmdb/rpmdb.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/lib/fsm.c ============================================================================ $ cvs diff -u -r2.191 -r2.192 fsm.c --- rpm/lib/fsm.c 12 Oct 2009 02:35:30 -0000 2.191 +++ rpm/lib/fsm.c 12 Oct 2009 23:05:39 -0000 2.192 @@ -981,6 +981,17 @@ int rc = 0; int xx; + { const char * fn = fsm->path; + mode_t mode = st->st_mode; + uint8_t * b = (uint8_t *)""; + size_t blen = 1; + const uint8_t * d = fsm->digest; + size_t dlen = fsm->digestlen; + uint32_t dalgo = fsm->fdigestalgo; + + xx = rpmlioCreat(rpmtsGetRdb(fsmGetTs(fsm)), fn, mode, b, blen, d, dlen, dalgo); + } + rc = fsmNext(fsm, IOSM_WOPEN); if (rc) goto exit; @@ -988,9 +999,6 @@ if (st->st_size > 0 && (fsm->fdigest != NULL || fsm->digest != NULL)) fdInitDigest(fsm->wfd, fsm->fdigestalgo, 0); - rc = rpmlioCreat(rpmtsGetRdb(fsmGetTs(fsm)), fsm->path, st->st_mode, - fsm->digest, fsm->digestlen, fsm->fdigestalgo); - while (left) { fsm->wrlen = (left > fsm->wrsize ? fsm->wrsize : left); @@ -1035,6 +1043,7 @@ exit: (void) fsmNext(fsm, IOSM_WCLOSE); + return rc; } /*...@=compdef@*/ @@ -2269,11 +2278,54 @@ /*...@notreached@*/ break; case IOSM_UNLINK: - rc = rpmlioUnlink(rpmtsGetRdb(fsmGetTs(fsm)), fsm->path, st->st_mode); - goto iosmcall; + { const char * fn = fsm->path; + uint8_t * b = (uint8_t *)""; + size_t blen = 0; + uint8_t * d = NULL; + size_t dlen = 0; + uint32_t dalgo = 0; + FD_t fd = NULL; + struct stat sb; + mode_t mode; + sb.st_mode = 0; + if (!Lstat(fn, &sb) && S_ISREG(sb.st_mode)) { + fd = Fopen(fn, "r.fdio"); + blen = sb.st_size; + b = mmap(NULL, blen, PROT_READ, MAP_SHARED, Fileno(fd), 0); + } + mode = sb.st_mode; + rc = rpmlioUnlink(rpmtsGetRdb(fsmGetTs(fsm)), fn, mode, b, blen, d, dlen, dalgo); + if (fd != NULL) { + (void)munmap(b, blen); + (void) Fclose(fd); + fd = NULL; + } + } goto iosmcall; case IOSM_RENAME: - rc = rpmlioRename(rpmtsGetRdb(fsmGetTs(fsm)), fsm->opath, fsm->path); - goto iosmcall; + { const char * ofn = fsm->opath; + const char * fn = fsm->path; + uint8_t * b = NULL; + size_t blen = 0; + uint8_t * d = NULL; + size_t dlen = 0; + uint32_t dalgo = 0; + FD_t fd = NULL; + struct stat sb; + mode_t mode; + sb.st_mode = 0; + if (!Lstat(fn, &sb) && S_ISREG(sb.st_mode)) { + fd = Fopen(fn, "r.fdio"); + blen = sb.st_size; + b = mmap(NULL, blen, PROT_READ, MAP_SHARED, Fileno(fd), 0); + } + mode = sb.st_mode; + rc = rpmlioRename(rpmtsGetRdb(fsmGetTs(fsm)), ofn, fn, mode, b, blen, d, dlen, dalgo); + if (fd != NULL) { + (void)munmap(b, blen); + (void) Fclose(fd); + fd = NULL; + } + } goto iosmcall; case IOSM_MKDIR: rc = rpmlioMkdir(rpmtsGetRdb(fsmGetTs(fsm)), fsm->path, st->st_mode); goto iosmcall; @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/logio.h ============================================================================ $ cvs diff -u -r1.7 -r1.8 logio.h --- rpm/rpmdb/logio.h 12 Oct 2009 19:03:48 -0000 1.7 +++ rpm/rpmdb/logio.h 12 Oct 2009 23:05:39 -0000 1.8 @@ -12,15 +12,15 @@ __P((DB_ENV *, DBT *, DB_LSN *, db_recops)) int logio_Creat_log - __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT *, mode_t)); + __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, mode_t, const DBT *, const DBT *, uint32_t)); _LOGIO_PROTO(Creat); int logio_Unlink_log - __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT *, mode_t)); + __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, mode_t, const DBT *, const DBT *, uint32_t)); _LOGIO_PROTO(Unlink); int logio_Rename_log - __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT *, const DBT *)); + __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT *, mode_t, const DBT *, const DBT *, uint32_t)); _LOGIO_PROTO(Rename); int logio_Mkdir_log @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/logio.src ============================================================================ $ cvs diff -u -r1.6 -r1.7 logio.src --- rpm/rpmdb/logio.src 12 Oct 2009 19:03:48 -0000 1.6 +++ rpm/rpmdb/logio.src 12 Oct 2009 23:05:39 -0000 1.7 @@ -14,23 +14,30 @@ /* Creat(2) */ BEGIN Creat 48 10000 -DBT fid DBT s DBT path DBT s ARG mode mode_t o +DBT content DBT s +DBT digest DBT s +ARG dalgo uint32_t lu END /* Unlink(2) */ BEGIN Unlink 48 10001 -DBT fid DBT s DBT path DBT s ARG mode mode_t o +DBT content DBT s +DBT digest DBT s +ARG dalgo uint32_t lu END /* Rename(2) */ BEGIN Rename 48 10002 -DBT fid DBT s DBT oldpath DBT s DBT newpath DBT s +ARG mode mode_t o +DBT content DBT s +DBT digest DBT s +ARG dalgo uint32_t lu END /* Mkdir(2) */ @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/logio_rec.c ============================================================================ $ cvs diff -u -r1.5 -r1.6 logio_rec.c --- rpm/rpmdb/logio_rec.c 12 Oct 2009 02:35:29 -0000 1.5 +++ rpm/rpmdb/logio_rec.c 12 Oct 2009 23:05:39 -0000 1.6 @@ -2,7 +2,7 @@ #include "system.h" -#include <rpmio.h> +#include <rpmio_internal.h> /* XXX fdInitDigest */ #include <db.h> @@ -14,6 +14,45 @@ #include "debug.h" +static int writeFile(const char * fn, mode_t mode, + const DBT * content, const DBT * digest, uint32_t dalgo) +{ + uint8_t * b = content->data; + size_t blen = content->size; + uint8_t * d = digest->data; + size_t dlen = digest->size; + int ret = 0; + int xx; + + if (S_ISREG(mode)) { + FD_t fd = Fopen(fn, "w.fdio"); + size_t nw; + + if (dalgo > 0 && d && dlen > 0) + fdInitDigest(fd, dalgo, 0); + nw = Fwrite(b, 1, blen, fd); + + xx = fsync(Fileno(fd)); + + if (dalgo > 0 && d && dlen > 0) { + static int asAscii = 0; + void * digest = NULL; + size_t digestlen = 0; + + (void) Fflush(fd); + fdFiniDigest(fd, dalgo, &digest, &digestlen, asAscii); + if (digest == NULL || digestlen != dlen || memcmp(digest, d, dlen)) + ret = -1; + digest = _free(digest); + } + (void) Fclose(fd); + fd = NULL; + if (nw != blen) + ret = -1; + } + return ret; +} + /* * logio_Creat_recover -- * Recovery function for Creat. @@ -94,7 +133,8 @@ switch (op) { case DB_TXN_ABORT: case DB_TXN_BACKWARD_ROLL: - ret = creat(argp->path.data, argp->mode); + ret = writeFile(argp->path.data, argp->mode, &argp->content, + &argp->digest, argp->dalgo); if (ret != 0) dbenv->err(dbenv, ret, "Unlink: DB_TXN_BACKWARD_ROLL"); else @@ -152,6 +192,8 @@ switch (op) { case DB_TXN_ABORT: case DB_TXN_BACKWARD_ROLL: + ret = writeFile(argp->newpath.data, argp->mode, &argp->content, + &argp->digest, argp->dalgo); ret = Rename(argp->newpath.data, argp->oldpath.data); if (ret != 0) dbenv->err(dbenv, ret, "Rename: DB_TXN_BACKWARD_ROLL"); @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.h ============================================================================ $ cvs diff -u -r1.116 -r1.117 rpmdb.h --- rpm/rpmdb/rpmdb.h 12 Oct 2009 19:03:48 -0000 1.116 +++ rpm/rpmdb/rpmdb.h 12 Oct 2009 23:05:39 -0000 1.117 @@ -1147,65 +1147,81 @@ } /*...@unused@*/ static inline -int rpmlioCreat(rpmdb rpmdb, void * fid, const char * fn, mode_t mode) +int rpmlioCreat(rpmdb rpmdb, const char * fn, mode_t mode, + const uint8_t * b, size_t blen, + const uint8_t * d, size_t dlen, uint32_t dalgo) { int rc = 0; extern int logio_Creat_log - __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT *, mode_t)); + __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, mode_t, const DBT *, const DBT *, uint32_t)); DB_ENV * dbenv = rpmdb->db_dbenv; DB_TXN * _txn = rpmdb->db_txnid; DB_LSN _lsn = {0,0}; - DBT FIDdbt = {0}; DBT FNdbt = {0}; - FIDdbt.data = ""; - FIDdbt.size = 1; + DBT Bdbt = {0}; + DBT Ddbt = {0}; FNdbt.data = (void *)fn; FNdbt.size = strlen(fn) + 1; /* trailing NUL too */ - rc = logio_Creat_log(dbenv, _txn, &_lsn, DB_FLUSH, &FIDdbt, &FNdbt, mode); -fprintf(stderr, "<== %s(%p, %s, 0%o) rc %d\n", __FUNCTION__, fid, fn, mode, rc); + Bdbt.data = (void *)b; + Bdbt.size = blen; + Ddbt.data = (void *)d; + Ddbt.size = dlen; + rc = logio_Creat_log(dbenv, _txn, &_lsn, DB_FLUSH, &FNdbt, mode, &Bdbt, &Ddbt, dalgo); +fprintf(stderr, "<== %s(%s, 0%o, %p[%u], %p[%u], %u) rc %d\n", __FUNCTION__, fn, mode, b, (unsigned)blen, d, (unsigned)dlen, dalgo, rc); return rc; } /*...@unused@*/ static inline -int rpmlioUnlink(rpmdb rpmdb, void * fid, const char * fn, mode_t mode) +int rpmlioUnlink(rpmdb rpmdb, const char * fn, mode_t mode, + const uint8_t * b, size_t blen, + const uint8_t * d, size_t dlen, uint32_t dalgo) { int rc = 0; extern int logio_Unlink_log - __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT *, mode_t)); + __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, mode_t, const DBT *, const DBT *, uint32_t)); DB_ENV * dbenv = rpmdb->db_dbenv; DB_TXN * _txn = rpmdb->db_txnid; DB_LSN _lsn = {0,0}; - DBT FIDdbt = {0}; DBT FNdbt = {0}; - FIDdbt.data = ""; - FIDdbt.size = 1; + DBT Bdbt = {0}; + DBT Ddbt = {0}; FNdbt.data = (void *)fn; FNdbt.size = strlen(fn) + 1; /* trailing NUL too */ - rc = logio_Unlink_log(dbenv, _txn, &_lsn, DB_FLUSH, &FIDdbt, &FNdbt, mode); -fprintf(stderr, "<== %s(%p, %s, 0%o) rc %d\n", __FUNCTION__, fid, fn, mode, rc); + Bdbt.data = (void *)b; + Bdbt.size = blen; + Ddbt.data = (void *)d; + Ddbt.size = dlen; + rc = logio_Unlink_log(dbenv, _txn, &_lsn, DB_FLUSH, &FNdbt, mode, &Bdbt, &Ddbt, dalgo); +fprintf(stderr, "<== %s(%s, 0%o, %p[%u], %p[%u], %u) rc %d\n", __FUNCTION__, fn, mode, b, (unsigned)blen, d, (unsigned)dlen, dalgo, rc); return rc; } /*...@unused@*/ static inline -int rpmlioRename(rpmdb rpmdb, void * oldfid, const char * oldname, const char * newname) +int rpmlioRename(rpmdb rpmdb, const char * oldname, const char * newname, + mode_t mode, + const uint8_t * b, size_t blen, + const uint8_t * d, size_t dlen, uint32_t dalgo) { int rc = 0; extern int logio_Rename_log - __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT *, const DBT *)); + __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT *, mode_t, const DBT *, const DBT *, uint32_t)); DB_ENV * dbenv = rpmdb->db_dbenv; DB_TXN * _txn = rpmdb->db_txnid; DB_LSN _lsn = {0,0}; - DBT FIDdbt = {0}; DBT ONdbt = {0}; DBT NNdbt = {0}; - FIDdbt.data = ""; - FIDdbt.size = 1; + DBT Bdbt = {0}; + DBT Ddbt = {0}; ONdbt.data = (void *)oldname; ONdbt.size = strlen(oldname) + 1; /* trailing NUL too */ NNdbt.data = (void *)newname; NNdbt.size = strlen(newname) + 1; /* trailing NUL too */ - rc = logio_Rename_log(dbenv, _txn, &_lsn, DB_FLUSH, &FIDdbt, &ONdbt, &NNdbt); -fprintf(stderr, "<== %s(%p, %s, %s) rc %d\n", __FUNCTION__, oldfid, oldname, newname, rc); + Bdbt.data = (void *)b; + Bdbt.size = blen; + Ddbt.data = (void *)d; + Ddbt.size = dlen; + rc = logio_Rename_log(dbenv, _txn, &_lsn, DB_FLUSH, &ONdbt, &NNdbt, mode, &Bdbt, &Ddbt, dalgo); +fprintf(stderr, "<== %s(%s, %s, 0%o, %p[%u], %p[%u], %u) rc %d\n", __FUNCTION__, oldname, newname, mode, b, (unsigned)blen, d, (unsigned)dlen, dalgo, rc); return rc; } @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository [email protected]
