Blame sysdeps/freebsd/fsusage.c

Packit Service 407539
#include <config.h>
Packit Service 407539
#include <glibtop.h>
Packit Service 407539
#include <glibtop/error.h>
Packit Service 407539
#include <glibtop/fsusage.h>
Packit Service 407539
Packit Service 407539
#include <glibtop_suid.h>
Packit Service 407539
Packit Service 407539
#include <glib.h>
Packit Service 407539
Packit Service 407539
#include <unistd.h>
Packit Service 407539
#include <sys/param.h>
Packit Service 407539
#include <sys/mount.h>
Packit Service 407539
#include <sys/statvfs.h>
Packit Service 407539
#if 0
Packit Service 407539
#include <libgeom.h>
Packit Service 407539
#include <sys/resource.h>
Packit Service 407539
#include <devstat.h>
Packit Service 407539
#include <sys/devicestat.h>
Packit Service 407539
#endif
Packit Service 407539
Packit Service 407539
#include <stdio.h>
Packit Service 407539
#include <string.h>
Packit Service 407539
#include <stdlib.h>
Packit Service 407539
Packit Service 407539
static const unsigned long _glibtop_sysdeps_fsusage =
Packit Service 407539
(1L << GLIBTOP_FSUSAGE_BLOCKS) + (1L << GLIBTOP_FSUSAGE_BFREE)
Packit Service 407539
+ (1L << GLIBTOP_FSUSAGE_BAVAIL) + (1L << GLIBTOP_FSUSAGE_FILES)
Packit Service 407539
+ (1L << GLIBTOP_FSUSAGE_FFREE) + (1L << GLIBTOP_FSUSAGE_BLOCK_SIZE);
Packit Service 407539
Packit Service 407539
static void
Packit Service 407539
_glibtop_get_fsusage_read_write (glibtop *server, glibtop_fsusage *buf, const char *path)
Packit Service 407539
{
Packit Service 407539
        int result;
Packit Service 407539
        struct statfs sfs;
Packit Service 407539
#if 0
Packit Service 407539
        struct devstat *ds;
Packit Service 407539
        void *sc;
Packit Service 407539
        struct timespec ts;
Packit Service 407539
        struct gprovider *gp;
Packit Service 407539
        struct gident *gid;
Packit Service 407539
        struct gmesh gmp;
Packit Service 407539
        double etime;
Packit Service 407539
        uint64_t ld[2];
Packit Service 407539
#endif
Packit Service 407539
Packit Service 407539
        result = statfs (path, &sfs;;
Packit Service 407539
Packit Service 407539
        if (result == -1) {
Packit Service 407539
                glibtop_warn_io_r (server, "statfs");
Packit Service 407539
                return;
Packit Service 407539
        }
Packit Service 407539
#if 0
Packit Service 407539
        ld[0] = 0;
Packit Service 407539
        ld[1] = 0;
Packit Service 407539
        result = geom_gettree (&gmp);
Packit Service 407539
        if (result != 0) {
Packit Service 407539
                glibtop_warn_io_r (server, "geom_gettree = %d", result);
Packit Service 407539
                return;
Packit Service 407539
        }
Packit Service 407539
Packit Service 407539
        result = geom_stats_open ();
Packit Service 407539
        if (result != 0) {
Packit Service 407539
                glibtop_warn_io_r (server, "geom_stats_open()");
Packit Service 407539
                geom_deletetree (&gmp);
Packit Service 407539
                return;
Packit Service 407539
        }
Packit Service 407539
Packit Service 407539
        sc = NULL;
Packit Service 407539
        sc = geom_stats_snapshot_get ();
Packit Service 407539
        if (sc == NULL) {
Packit Service 407539
                glibtop_warn_io_r (server, "geom_stats_snapshot_get()");
Packit Service 407539
                geom_stats_close ();
Packit Service 407539
                geom_deletetree (&gmp);
Packit Service 407539
                return;
Packit Service 407539
        }
Packit Service 407539
        geom_stats_snapshot_timestamp (sc, &ts);
Packit Service 407539
        etime = ts.tv_sec + (ts.tv_nsec * 1e-9);
Packit Service 407539
        geom_stats_snapshot_reset (sc);
Packit Service 407539
Packit Service 407539
        for (;;) {
Packit Service 407539
                ds = geom_stats_snapshot_next (sc);
Packit Service 407539
                if (ds == NULL) {
Packit Service 407539
                        break;
Packit Service 407539
                }
Packit Service 407539
                if (ds->id == NULL) {
Packit Service 407539
                        continue;
Packit Service 407539
                }
Packit Service 407539
Packit Service 407539
                gid = geom_lookupid (&gmp, ds->id);
Packit Service 407539
                if (gid == NULL) {
Packit Service 407539
                        geom_deletetree (&gmp);
Packit Service 407539
                        result = geom_gettree (&gmp);
Packit Service 407539
                        gid = geom_lookupid (&gmp, ds->id);
Packit Service 407539
                }
Packit Service 407539
Packit Service 407539
                if (gid == NULL) {
Packit Service 407539
                        continue;
Packit Service 407539
                }
Packit Service 407539
                if (gid->lg_what == ISCONSUMER) {
Packit Service 407539
                        continue;
Packit Service 407539
                }
Packit Service 407539
Packit Service 407539
                gp = gid->lg_ptr;
Packit Service 407539
Packit Service 407539
                if (!g_str_has_suffix (sfs.f_mntfromname, gp->lg_name)) {
Packit Service 407539
                        continue;
Packit Service 407539
                } else {
Packit Service 407539
                        result = devstat_compute_statistics (ds, NULL, etime,
Packit Service 407539
                                                             DSM_TOTAL_TRANSFERS_READ,
Packit Service 407539
                                                             &ld[0],
Packit Service 407539
                                                             DSM_TOTAL_TRANSFERS_WRITE,
Packit Service 407539
                                                             &ld[1], DSM_NONE);
Packit Service 407539
                        if (result != 0) {
Packit Service 407539
                                glibtop_warn_io_r (server,
Packit Service 407539
                                                   "devstat_compute_statistics()");
Packit Service 407539
                                geom_stats_snapshot_free (sc);
Packit Service 407539
                                geom_stats_close ();
Packit Service 407539
                                geom_deletetree (&gmp);
Packit Service 407539
                                return;
Packit Service 407539
                        }
Packit Service 407539
                        break;
Packit Service 407539
                }
Packit Service 407539
        }
Packit Service 407539
Packit Service 407539
        geom_stats_snapshot_free (sc);
Packit Service 407539
        geom_stats_close ();
Packit Service 407539
        geom_deletetree (&gmp);
Packit Service 407539
Packit Service 407539
        buf->read = ld[0];
Packit Service 407539
        buf->write = ld[1];
Packit Service 407539
#else
Packit Service 407539
        buf->read = sfs.f_syncreads + sfs.f_asyncreads;
Packit Service 407539
        buf->write = sfs.f_syncwrites + sfs.f_asyncwrites;
Packit Service 407539
#endif
Packit Service 407539
	if (buf->read || buf->write) {
Packit Service 407539
                buf->flags |= (1 << GLIBTOP_FSUSAGE_READ) | (1 << GLIBTOP_FSUSAGE_WRITE);
Packit Service 407539
	}
Packit Service 407539
}
Packit Service 407539
Packit Service 407539
void
Packit Service 407539
glibtop_get_fsusage_s(glibtop *server, glibtop_fsusage *buf, const char *path)
Packit Service 407539
{
Packit Service 407539
	struct statvfs fsd;
Packit Service 407539
Packit Service 407539
	memset (buf, 0, sizeof (glibtop_fsusage));
Packit Service 407539
Packit Service 407539
	if (statvfs (path, &fsd) < 0)
Packit Service 407539
		return;
Packit Service 407539
Packit Service 407539
	buf->block_size = fsd.f_frsize;
Packit Service 407539
	buf->blocks = fsd.f_blocks;
Packit Service 407539
	buf->bfree  = fsd.f_bfree;
Packit Service 407539
	buf->bavail = (fsd.f_bavail > fsd.f_bfree) ? 0 : fsd.f_bavail;
Packit Service 407539
	buf->files  = fsd.f_files;
Packit Service 407539
	buf->ffree  = fsd.f_ffree;
Packit Service 407539
Packit Service 407539
	buf->flags = _glibtop_sysdeps_fsusage;
Packit Service 407539
Packit Service 407539
	_glibtop_get_fsusage_read_write(server, buf, path);
Packit Service 407539
}
Packit Service 407539