#include <sys/stat.h>
#include <sys/mount.h>
#include <sys/xattr.h>
+#include <sys/statvfs.h>
#include <fcntl.h>
#include <stddef.h>
#include <dirent.h>
}
+ std::pair<unsigned long long, unsigned long long>
+ SDir::statvfs() const
+ {
+ struct statvfs64 fsbuf;
+ if (fstatvfs64(dirfd, &fsbuf) != 0)
+ SN_THROW(IOErrorException(sformat("statvfs64 failed path:%s errno:%d (%s)", base_path.c_str(),
+ errno, stringerror(errno).c_str())));
+
+ // f_bavail is used (not f_bfree) since df seems to do the
+ // same. Thus it allows the user to check the result easily.
+
+ return make_pair(fsbuf.f_blocks * fsbuf.f_bsize, fsbuf.f_bavail * fsbuf.f_bsize);
+ }
+
+
int
SDir::mktemp(string& name) const
{
int rename(const string& oldname, const string& newname) const;
int fsync() const;
+ // Query size and free.
+ std::pair<unsigned long long, unsigned long long> statvfs() const;
+
int mktemp(string& name) const;
bool mkdtemp(string& name) const;
/*
* Copyright (c) [2011-2015] Novell, Inc.
- * Copyright (c) [2016,2018] SUSE LLC
+ * Copyright (c) [2016-2020] SUSE LLC
*
* All Rights Reserved.
*
#include <sys/stat.h>
#include <sys/types.h>
-#include <sys/statvfs.h>
#include <glob.h>
#include <string.h>
#include <mntent.h>
quota_rescan(general_dir.fd());
sync(general_dir.fd());
- struct statvfs64 fsbuf;
- if (fstatvfs64(general_dir.fd(), &fsbuf) != 0)
- SN_THROW(QuotaException("statvfs64 failed"));
-
QuotaData quota_data;
- quota_data.size = fsbuf.f_blocks * fsbuf.f_bsize;
+ std::tie(quota_data.size, std::ignore) = general_dir.statvfs();
QGroupUsage qgroup_usage = qgroup_query_usage(general_dir.fd(), btrfs->getQGroup());
quota_data.used = qgroup_usage.exclusive;
filesystem->sync();
- struct statvfs64 fsbuf;
- if (fstatvfs64(general_dir.fd(), &fsbuf) != 0)
- SN_THROW(FreeSpaceException("statvfs64 failed"));
-
FreeSpaceData free_space_data;
-
- // f_bavail is used (not f_bfree) since df seems to do the
- // same. Thus it allows the user to check the result easily.
-
- free_space_data.size = fsbuf.f_blocks * fsbuf.f_bsize;
- free_space_data.free = fsbuf.f_bavail * fsbuf.f_bsize;
+ std::tie(free_space_data.size, free_space_data.free) = general_dir.statvfs();
y2mil("size:" << free_space_data.size << " free:" << free_space_data.free);