19b6f151eSMauro Carvalho Chehab.. SPDX-License-Identifier: GPL-2.0
29b6f151eSMauro Carvalho Chehab
39b6f151eSMauro Carvalho Chehab===============
49b6f151eSMauro Carvalho ChehabQuota subsystem
59b6f151eSMauro Carvalho Chehab===============
69b6f151eSMauro Carvalho Chehab
79b6f151eSMauro Carvalho ChehabQuota subsystem allows system administrator to set limits on used space and
89b6f151eSMauro Carvalho Chehabnumber of used inodes (inode is a filesystem structure which is associated with
99b6f151eSMauro Carvalho Chehabeach file or directory) for users and/or groups. For both used space and number
109b6f151eSMauro Carvalho Chehabof used inodes there are actually two limits. The first one is called softlimit
119b6f151eSMauro Carvalho Chehaband the second one hardlimit.  A user can never exceed a hardlimit for any
129b6f151eSMauro Carvalho Chehabresource (unless he has CAP_SYS_RESOURCE capability). User is allowed to exceed
139b6f151eSMauro Carvalho Chehabsoftlimit but only for limited period of time. This period is called "grace
149b6f151eSMauro Carvalho Chehabperiod" or "grace time". When grace time is over, user is not able to allocate
159b6f151eSMauro Carvalho Chehabmore space/inodes until he frees enough of them to get below softlimit.
169b6f151eSMauro Carvalho Chehab
179b6f151eSMauro Carvalho ChehabQuota limits (and amount of grace time) are set independently for each
189b6f151eSMauro Carvalho Chehabfilesystem.
199b6f151eSMauro Carvalho Chehab
209b6f151eSMauro Carvalho ChehabFor more details about quota design, see the documentation in quota-tools package
21476fdf14SJan Kara(https://sourceforge.net/projects/linuxquota).
229b6f151eSMauro Carvalho Chehab
239b6f151eSMauro Carvalho ChehabQuota netlink interface
249b6f151eSMauro Carvalho Chehab=======================
259b6f151eSMauro Carvalho ChehabWhen user exceeds a softlimit, runs out of grace time or reaches hardlimit,
269b6f151eSMauro Carvalho Chehabquota subsystem traditionally printed a message to the controlling terminal of
279b6f151eSMauro Carvalho Chehabthe process which caused the excess. This method has the disadvantage that
289b6f151eSMauro Carvalho Chehabwhen user is using a graphical desktop he usually cannot see the message.
299b6f151eSMauro Carvalho ChehabThus quota netlink interface has been designed to pass information about
309b6f151eSMauro Carvalho Chehabthe above events to userspace. There they can be captured by an application
319b6f151eSMauro Carvalho Chehaband processed accordingly.
329b6f151eSMauro Carvalho Chehab
339b6f151eSMauro Carvalho ChehabThe interface uses generic netlink framework (see
34476fdf14SJan Karahttps://lwn.net/Articles/208755/ and http://www.infradead.org/~tgr/libnl/ for
35476fdf14SJan Karamore details about this layer). The name of the quota generic netlink interface
36476fdf14SJan Karais "VFS_DQUOT". Definitions of constants below are in <linux/quota.h>.  Since
37476fdf14SJan Karathe quota netlink protocol is not namespace aware, quota netlink messages are
38476fdf14SJan Karasent only in initial network namespace.
399b6f151eSMauro Carvalho Chehab
409b6f151eSMauro Carvalho ChehabCurrently, the interface supports only one message type QUOTA_NL_C_WARNING.
419b6f151eSMauro Carvalho ChehabThis command is used to send a notification about any of the above mentioned
429b6f151eSMauro Carvalho Chehabevents. Each message has six attributes. These are (type of the argument is
439b6f151eSMauro Carvalho Chehabin parentheses):
449b6f151eSMauro Carvalho Chehab
459b6f151eSMauro Carvalho Chehab        QUOTA_NL_A_QTYPE (u32)
469b6f151eSMauro Carvalho Chehab	  - type of quota being exceeded (one of USRQUOTA, GRPQUOTA)
479b6f151eSMauro Carvalho Chehab        QUOTA_NL_A_EXCESS_ID (u64)
489b6f151eSMauro Carvalho Chehab	  - UID/GID (depends on quota type) of user / group whose limit
499b6f151eSMauro Carvalho Chehab	    is being exceeded.
509b6f151eSMauro Carvalho Chehab        QUOTA_NL_A_CAUSED_ID (u64)
519b6f151eSMauro Carvalho Chehab	  - UID of a user who caused the event
529b6f151eSMauro Carvalho Chehab        QUOTA_NL_A_WARNING (u32)
539b6f151eSMauro Carvalho Chehab	  - what kind of limit is exceeded:
549b6f151eSMauro Carvalho Chehab
559b6f151eSMauro Carvalho Chehab		QUOTA_NL_IHARDWARN
569b6f151eSMauro Carvalho Chehab		    inode hardlimit
579b6f151eSMauro Carvalho Chehab		QUOTA_NL_ISOFTLONGWARN
589b6f151eSMauro Carvalho Chehab		    inode softlimit is exceeded longer
599b6f151eSMauro Carvalho Chehab		    than given grace period
609b6f151eSMauro Carvalho Chehab		QUOTA_NL_ISOFTWARN
619b6f151eSMauro Carvalho Chehab		    inode softlimit
629b6f151eSMauro Carvalho Chehab		QUOTA_NL_BHARDWARN
639b6f151eSMauro Carvalho Chehab		    space (block) hardlimit
649b6f151eSMauro Carvalho Chehab		QUOTA_NL_BSOFTLONGWARN
659b6f151eSMauro Carvalho Chehab		    space (block) softlimit is exceeded
669b6f151eSMauro Carvalho Chehab		    longer than given grace period.
679b6f151eSMauro Carvalho Chehab		QUOTA_NL_BSOFTWARN
689b6f151eSMauro Carvalho Chehab		    space (block) softlimit
699b6f151eSMauro Carvalho Chehab
709b6f151eSMauro Carvalho Chehab	  - four warnings are also defined for the event when user stops
719b6f151eSMauro Carvalho Chehab	    exceeding some limit:
729b6f151eSMauro Carvalho Chehab
739b6f151eSMauro Carvalho Chehab		QUOTA_NL_IHARDBELOW
749b6f151eSMauro Carvalho Chehab		    inode hardlimit
759b6f151eSMauro Carvalho Chehab		QUOTA_NL_ISOFTBELOW
769b6f151eSMauro Carvalho Chehab		    inode softlimit
779b6f151eSMauro Carvalho Chehab		QUOTA_NL_BHARDBELOW
789b6f151eSMauro Carvalho Chehab		    space (block) hardlimit
799b6f151eSMauro Carvalho Chehab		QUOTA_NL_BSOFTBELOW
809b6f151eSMauro Carvalho Chehab		    space (block) softlimit
819b6f151eSMauro Carvalho Chehab
829b6f151eSMauro Carvalho Chehab        QUOTA_NL_A_DEV_MAJOR (u32)
839b6f151eSMauro Carvalho Chehab	  - major number of a device with the affected filesystem
849b6f151eSMauro Carvalho Chehab        QUOTA_NL_A_DEV_MINOR (u32)
859b6f151eSMauro Carvalho Chehab	  - minor number of a device with the affected filesystem
86