// linux quota version >= 2
libc_enum! { #[repr(i32)] enum QuotaSubCmd {
Q_SYNC,
Q_QUOTAON,
Q_QUOTAOFF,
Q_GETQUOTA,
Q_SETQUOTA,
}
}
libc_enum! { /// The scope of the quota. #[repr(i32)] #[non_exhaustive] pubenum QuotaType { /// Specify a user quota
USRQUOTA, /// Specify a group quota
GRPQUOTA,
}
}
libc_enum! { /// The type of quota format to use. #[repr(i32)] #[non_exhaustive] pubenum QuotaFmt { /// Use the original quota format.
QFMT_VFS_OLD, /// Use the standard VFS v0 quota format. /// /// Handles 32-bit UIDs/GIDs and quota limits up to 2<sup>32</sup> bytes/2<sup>32</sup> inodes.
QFMT_VFS_V0, /// Use the VFS v1 quota format. /// /// Handles 32-bit UIDs/GIDs and quota limits of 2<sup>64</sup> bytes/2<sup>64</sup> inodes.
QFMT_VFS_V1,
}
}
libc_bitflags!( /// Indicates the quota fields that are valid to read from. #[derive(Default)] pubstruct QuotaValidFlags: u32 { /// The block hard & soft limit fields.
QIF_BLIMITS; /// The current space field.
QIF_SPACE; /// The inode hard & soft limit fields.
QIF_ILIMITS; /// The current inodes field.
QIF_INODES; /// The disk use time limit field.
QIF_BTIME; /// The file quote time limit field.
QIF_ITIME; /// All block & inode limits.
QIF_LIMITS; /// The space & inodes usage fields.
QIF_USAGE; /// The time limit fields.
QIF_TIMES; /// All fields.
QIF_ALL;
}
);
/// Wrapper type for `if_dqblk` #[repr(transparent)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] pubstruct Dqblk(libc::dqblk);
impl Dqblk { /// The absolute limit on disk quota blocks allocated. pubfn blocks_hard_limit(&self) -> Option<u64> { let valid_fields =
QuotaValidFlags::from_bits_truncate(self.0.dqb_valid); if valid_fields.contains(QuotaValidFlags::QIF_BLIMITS) {
Some(self.0.dqb_bhardlimit)
} else {
None
}
}
/// Set the absolute limit on disk quota blocks allocated. pubfn set_blocks_hard_limit(&mutself, limit: u64) { self.0.dqb_bhardlimit = limit;
}
/// Preferred limit on disk quota blocks pubfn blocks_soft_limit(&self) -> Option<u64> { let valid_fields =
QuotaValidFlags::from_bits_truncate(self.0.dqb_valid); if valid_fields.contains(QuotaValidFlags::QIF_BLIMITS) {
Some(self.0.dqb_bsoftlimit)
} else {
None
}
}
/// Set the preferred limit on disk quota blocks allocated. pubfn set_blocks_soft_limit(&mutself, limit: u64) { self.0.dqb_bsoftlimit = limit;
}
/// Current occupied space (bytes). pubfn occupied_space(&self) -> Option<u64> { let valid_fields =
QuotaValidFlags::from_bits_truncate(self.0.dqb_valid); if valid_fields.contains(QuotaValidFlags::QIF_SPACE) {
Some(self.0.dqb_curspace)
} else {
None
}
}
/// Maximum number of allocated inodes. pubfn inodes_hard_limit(&self) -> Option<u64> { let valid_fields =
QuotaValidFlags::from_bits_truncate(self.0.dqb_valid); if valid_fields.contains(QuotaValidFlags::QIF_ILIMITS) {
Some(self.0.dqb_ihardlimit)
} else {
None
}
}
/// Set the maximum number of allocated inodes. pubfn set_inodes_hard_limit(&mutself, limit: u64) { self.0.dqb_ihardlimit = limit;
}
/// Set the preferred limit of allocated inodes. pubfn set_inodes_soft_limit(&mutself, limit: u64) { self.0.dqb_isoftlimit = limit;
}
/// Current number of allocated inodes. pubfn allocated_inodes(&self) -> Option<u64> { let valid_fields =
QuotaValidFlags::from_bits_truncate(self.0.dqb_valid); if valid_fields.contains(QuotaValidFlags::QIF_INODES) {
Some(self.0.dqb_curinodes)
} else {
None
}
}
/// Time limit for excessive disk use. pubfn block_time_limit(&self) -> Option<u64> { let valid_fields =
QuotaValidFlags::from_bits_truncate(self.0.dqb_valid); if valid_fields.contains(QuotaValidFlags::QIF_BTIME) {
Some(self.0.dqb_btime)
} else {
None
}
}
/// Set the time limit for excessive disk use. pubfn set_block_time_limit(&mutself, limit: u64) { self.0.dqb_btime = limit;
}
/// Time limit for excessive files. pubfn inode_time_limit(&self) -> Option<u64> { let valid_fields =
QuotaValidFlags::from_bits_truncate(self.0.dqb_valid); if valid_fields.contains(QuotaValidFlags::QIF_ITIME) {
Some(self.0.dqb_itime)
} else {
None
}
}
/// Set the time limit for excessive files. pubfn set_inode_time_limit(&mutself, limit: u64) { self.0.dqb_itime = limit;
}
}
/// Turn on disk quotas for a block device. pubfn quotactl_on<P: ?Sized + NixPath>(
which: QuotaType,
special: &P,
format: QuotaFmt,
quota_file: &P,
) -> Result<()> {
quota_file.with_nix_path(|path| { letmut path_copy = path.to_bytes_with_nul().to_owned(); let p: *mut c_char = path_copy.as_mut_ptr().cast();
quotactl(
QuotaCmd(QuotaSubCmd::Q_QUOTAON, which),
Some(special),
format as c_int,
p,
)
})?
}
/// Disable disk quotas for a block device. pubfn quotactl_off<P: ?Sized + NixPath>(
which: QuotaType,
special: &P,
) -> Result<()> {
quotactl(
QuotaCmd(QuotaSubCmd::Q_QUOTAOFF, which),
Some(special), 0,
ptr::null_mut(),
)
}
/// Update the on-disk copy of quota usages for a filesystem. /// /// If `special` is `None`, then all file systems with active quotas are sync'd. pubfn quotactl_sync<P: ?Sized + NixPath>(
which: QuotaType,
special: Option<&P>,
) -> Result<()> {
quotactl(
QuotaCmd(QuotaSubCmd::Q_SYNC, which),
special, 0,
ptr::null_mut(),
)
}
/// Get disk quota limits and current usage for the given user/group id. pubfn quotactl_get<P: ?Sized + NixPath>(
which: QuotaType,
special: &P,
id: c_int,
) -> Result<Dqblk> { letmut dqblk = mem::MaybeUninit::<libc::dqblk>::uninit();
quotactl(
QuotaCmd(QuotaSubCmd::Q_GETQUOTA, which),
Some(special),
id,
dqblk.as_mut_ptr().cast(),
)?;
Ok(unsafe { Dqblk(dqblk.assume_init()) })
}
/// Configure quota values for the specified fields for a given user/group id. pubfn quotactl_set<P: ?Sized + NixPath>(
which: QuotaType,
special: &P,
id: c_int,
dqblk: &Dqblk,
fields: QuotaValidFlags,
) -> Result<()> { letmut dqblk_copy = *dqblk;
dqblk_copy.0.dqb_valid = fields.bits();
quotactl(
QuotaCmd(QuotaSubCmd::Q_SETQUOTA, which),
Some(special),
id,
&mut dqblk_copy as *mut _ as *mut c_char,
)
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-18)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.