/* return DSI of the device the rpmdb lives on */ static rpmDiskSpaceInfo rpmtsDbDSI(const rpmts ts) { const char *dbhome = rpmdbHome(rpmtsGetRdb(ts)); struct stat sb; int rc; rc = stat(dbhome, &sb); if (rc) { return NULL; } return rpmtsGetDSI(ts, sb.st_dev, dbhome); }
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; }