static void rpmtsUpdateDSI(const rpmts ts, dev_t dev, const char *dirName, rpm_loff_t fileSize, rpm_loff_t prevSize, rpm_loff_t fixupSize, rpmFileAction action) { int64_t bneeded; rpmDiskSpaceInfo dsi = rpmtsGetDSI(ts, dev, dirName); if (dsi == NULL) return; bneeded = BLOCK_ROUND(fileSize, dsi->bsize); switch (action) { case FA_BACKUP: case FA_SAVE: case FA_ALTNAME: dsi->ineeded++; dsi->bneeded += bneeded; break; case FA_CREATE: dsi->bneeded += bneeded; dsi->ineeded++; if (prevSize) { dsi->bdelta += BLOCK_ROUND(prevSize, dsi->bsize); dsi->idelta++; } if (fixupSize) { dsi->bdelta += BLOCK_ROUND(fixupSize, dsi->bsize); dsi->idelta++; } break; case FA_ERASE: dsi->ineeded--; dsi->bneeded -= bneeded; break; default: break; } /* adjust bookkeeping when requirements shrink */ if (dsi->bneeded < dsi->obneeded) dsi->obneeded = dsi->bneeded; if (dsi->ineeded < dsi->oineeded) dsi->oineeded = dsi->ineeded; }
static void rpmtsUpdateDSI(const rpmts ts, dev_t dev, const char *dirName, rpm_loff_t fileSize, rpm_loff_t prevSize, rpm_loff_t fixupSize, rpmFileAction action) { int64_t bneeded; rpmDiskSpaceInfo dsi = rpmtsGetDSI(ts, dev, dirName); if (dsi == NULL) return; bneeded = BLOCK_ROUND(fileSize, dsi->bsize); switch (action) { case FA_BACKUP: case FA_SAVE: case FA_ALTNAME: dsi->ineeded++; dsi->bneeded += bneeded; break; /* * FIXME: If two packages share a file (same md5sum), and * that file is being replaced on disk, will dsi->bneeded get * adjusted twice? Quite probably! */ case FA_CREATE: dsi->bneeded += bneeded; dsi->bneeded -= BLOCK_ROUND(prevSize, dsi->bsize); break; case FA_ERASE: dsi->ineeded--; dsi->bneeded -= bneeded; break; default: break; } if (fixupSize) dsi->bneeded -= BLOCK_ROUND(fixupSize, dsi->bsize); /* adjust bookkeeping when requirements shrink */ if (dsi->bneeded < dsi->obneeded) dsi->obneeded = dsi->bneeded; if (dsi->ineeded < dsi->oineeded) dsi->oineeded = dsi->ineeded; }
/* Update DSI for changing size of the rpmdb */ static void rpmtsUpdateDSIrpmDBSize(const rpmte p, rpmDiskSpaceInfo dsi) { rpm_loff_t headerSize; int64_t bneeded; /* XXX somehow we can end up here with bsize 0 (RhBug:671056) */ if (dsi == NULL || dsi->bsize == 0) return; headerSize = rpmteHeaderSize(p); bneeded = BLOCK_ROUND(headerSize, dsi->bsize); /* REMOVE doesn't neccessarily shrink the database */ if (rpmteType(p) == TR_ADDED) { /* guessing that db grows 4 times more than the header size */ dsi->bneeded += (bneeded * 4); } }