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