775
int rpmtsInitDSI(const rpmts ts)
777
rpmDiskSpaceInfo dsi;
782
if (rpmtsFilterFlags(ts) & RPMPROB_FILTER_DISKSPACE)
785
rpmlog(RPMLOG_DEBUG, "mounted filesystems:\n");
787
" i dev bsize bavail iavail mount point\n");
789
rc = rpmGetFilesystemList(&ts->filesystems, &ts->filesystemCount);
790
if (rc || ts->filesystems == NULL || ts->filesystemCount <= 0)
793
/* Get available space on mounted file systems. */
795
ts->dsi = _free(ts->dsi);
796
ts->dsi = xcalloc((ts->filesystemCount + 1), sizeof(*ts->dsi));
801
for (i = 0; (i < ts->filesystemCount) && dsi; i++, dsi++) {
802
#if STATFS_IN_SYS_STATVFS
804
memset(&sfb, 0, sizeof(sfb));
805
rc = statvfs(ts->filesystems[i], &sfb);
808
memset(&sfb, 0, sizeof(sfb));
810
/* This platform has the 4-argument version of the statfs call. The last two
811
* should be the size of struct statfs and 0, respectively. The 0 is the
812
* filesystem type, and is always 0 when statfs is called on a mounted
813
* filesystem, as we're doing.
815
rc = statfs(ts->filesystems[i], &sfb, sizeof(sfb), 0);
817
rc = statfs(ts->filesystems[i], &sfb);
823
rc = stat(ts->filesystems[i], &sb);
826
dsi->dev = sb.st_dev;
828
dsi->bsize = sfb.f_bsize;
831
#ifdef STATFS_HAS_F_BAVAIL
832
dsi->bavail = (sfb.f_flag & ST_RDONLY) ? 0 : sfb.f_bavail;
834
/* FIXME: the statfs struct doesn't have a member to tell how many blocks are
835
* available for non-superusers. f_blocks - f_bfree is probably too big, but
836
* it's about all we can do.
838
dsi->bavail = sfb.f_blocks - sfb.f_bfree;
840
/* XXX Avoid FAT and other file systems that have not inodes. */
841
/* XXX assigning negative value to unsigned type */
842
dsi->iavail = !(sfb.f_ffree == 0 && sfb.f_files == 0)
845
"%5d 0x%08x %8" PRId64 " %12" PRId64 " %12" PRId64" %s\n",
846
i, (unsigned) dsi->dev, dsi->bsize,
847
dsi->bavail, dsi->iavail,
853
void rpmtsUpdateDSI(const rpmts ts, dev_t dev,
854
rpm_loff_t fileSize, rpm_loff_t prevSize, rpm_loff_t fixupSize,
855
rpmFileAction action)
857
rpmDiskSpaceInfo dsi;
862
while (dsi->bsize && dsi->dev != dev)
870
bneeded = BLOCK_ROUND(fileSize, dsi->bsize);
877
dsi->bneeded += bneeded;
881
* FIXME: If two packages share a file (same md5sum), and
882
* that file is being replaced on disk, will dsi->bneeded get
883
* adjusted twice? Quite probably!
886
dsi->bneeded += bneeded;
887
dsi->bneeded -= BLOCK_ROUND(prevSize, dsi->bsize);
892
dsi->bneeded -= bneeded;
900
dsi->bneeded -= BLOCK_ROUND(fixupSize, dsi->bsize);
903
void rpmtsCheckDSIProblems(const rpmts ts, const rpmte te)
905
rpmDiskSpaceInfo dsi;
910
if (ts->filesystems == NULL || ts->filesystemCount <= 0)
916
fc = rpmfiFC(rpmteFI(te));
920
ps = rpmtsProblems(ts);
921
for (i = 0; i < ts->filesystemCount; i++, dsi++) {
923
if (dsi->bavail >= 0 && adj_fs_blocks(dsi->bneeded) > dsi->bavail) {
924
if (dsi->bneeded != dsi->obneeded) {
925
rpmpsAppend(ps, RPMPROB_DISKSPACE,
926
rpmteNEVRA(te), rpmteKey(te),
927
ts->filesystems[i], NULL, NULL,
928
(adj_fs_blocks(dsi->bneeded) - dsi->bavail) * dsi->bsize);
929
dsi->obneeded = dsi->bneeded;
933
if (dsi->iavail >= 0 && adj_fs_blocks(dsi->ineeded) > dsi->iavail) {
934
if (dsi->ineeded != dsi->oineeded) {
935
rpmpsAppend(ps, RPMPROB_DISKNODES,
936
rpmteNEVRA(te), rpmteKey(te),
937
ts->filesystems[i], NULL, NULL,
938
(adj_fs_blocks(dsi->ineeded) - dsi->iavail));
939
dsi->oineeded = dsi->ineeded;
946
745
void * rpmtsNotify(rpmts ts, rpmte te,
947
746
rpmCallbackType what, rpm_loff_t amount, rpm_loff_t total)