diff --git a/SOURCES/quota-4.01-Prevent-from-grace-period-overflow-in-RPC-transport.patch b/SOURCES/quota-4.01-Prevent-from-grace-period-overflow-in-RPC-transport.patch new file mode 100644 index 0000000..c6c4ad0 --- /dev/null +++ b/SOURCES/quota-4.01-Prevent-from-grace-period-overflow-in-RPC-transport.patch @@ -0,0 +1,174 @@ +From d850a85b2374fe1b83779c0fc61463057eeca4ab Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Mon, 24 Feb 2014 15:54:32 +0100 +Subject: [PATCH] Prevent from grace period overflow in RPC transport +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The RPC transports grace time as unsigned int, but the value stored +there and retrivedd from is treated as singed difference against current time. + +This leads to overflow after expiring the grace time which is +presented as an enourmously large grace time instead of "none" in the +quota(1) output. + +There also possible an overflow when the time difference is still +bigger than an int can represent. + +This first issue is solved by explicit type cast to/from int32_t, the +second issue is fixes by limiting the value into int32_t range. + + + +Signed-off-by: Petr Písař +Signed-off-by: Jan Kara +--- + quotasys.c | 13 +++++++++++++ + quotasys.h | 4 ++++ + rquota_client.c | 10 ++++++---- + rquota_server.c | 9 +++++---- + 4 files changed, 28 insertions(+), 8 deletions(-) + +diff --git a/quotasys.c b/quotasys.c +index 120125a..a5737a8 100644 +--- a/quotasys.c ++++ b/quotasys.c +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + + #include "pot.h" + #include "bylabel.h" +@@ -323,6 +324,18 @@ void difftime2str(time_t seconds, char *buf) + } + + /* ++ * Round difference of two time_t values into int32_t ++ */ ++int32_t difftime2net(time_t later, time_t sooner) ++{ ++ if ((later - sooner) > INT32_MAX) ++ return INT32_MAX; ++ if ((later - sooner) < INT32_MIN) ++ return INT32_MIN; ++ return (later - sooner); ++} ++ ++/* + * Convert time to printable form + */ + void time2str(time_t seconds, char *buf, int flags) +diff --git a/quotasys.h b/quotasys.h +index e79f8cd..d8d79fe 100644 +--- a/quotasys.h ++++ b/quotasys.h +@@ -8,6 +8,7 @@ + #define GUARD_QUOTASYS_H + + #include ++#include + #include "mntopt.h" + #include "quota.h" + +@@ -100,6 +101,9 @@ int util2kernfmt(int fmt); + /* Convert time difference between given time and current time to printable form */ + void difftime2str(time_t, char *); + ++/* Round difference of two time_t values into int32_t */ ++int32_t difftime2net(time_t later, time_t sooner); ++ + /* Convert time to printable form */ + void time2str(time_t, char *, int); + +diff --git a/rquota_client.c b/rquota_client.c +index e26e066..9d4055e 100644 +--- a/rquota_client.c ++++ b/rquota_client.c +@@ -32,11 +32,13 @@ + #include + #include + #include ++#include + + #include "mntopt.h" + #include "rquota.h" + #include "common.h" + #include "quotaio.h" ++#include "quotasys.h" + + #if defined(RPC) + +@@ -54,11 +56,11 @@ static inline void clinet2utildqblk(struct util_dqblk *u, struct rquota *n) + u->dqb_curspace = ((qsize_t)n->rq_curblocks) * n->rq_bsize; + time(&now); + if (n->rq_btimeleft) +- u->dqb_btime = n->rq_btimeleft + now; ++ u->dqb_btime = (int32_t)n->rq_btimeleft + now; + else + u->dqb_btime = 0; + if (n->rq_ftimeleft) +- u->dqb_itime = n->rq_ftimeleft + now; ++ u->dqb_itime = (int32_t)n->rq_ftimeleft + now; + else + u->dqb_itime = 0; + } +@@ -76,11 +78,11 @@ static inline void cliutil2netdqblk(struct sq_dqblk *n, struct util_dqblk *u) + n->rq_curblocks = toqb(u->dqb_curspace); + n->rq_curfiles = u->dqb_curinodes; + if (u->dqb_btime) +- n->rq_btimeleft = u->dqb_btime - now; ++ n->rq_btimeleft = difftime2net(u->dqb_btime, now); + else + n->rq_btimeleft = 0; + if (u->dqb_itime) +- n->rq_ftimeleft = u->dqb_itime - now; ++ n->rq_ftimeleft = difftime2net(u->dqb_itime, now); + else + n->rq_ftimeleft = 0; + } +diff --git a/rquota_server.c b/rquota_server.c +index bf66e4d..09cf6ed 100644 +--- a/rquota_server.c ++++ b/rquota_server.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + + #include "mntopt.h" + #include "quotaops.h" +@@ -82,11 +83,11 @@ static inline void servnet2utildqblk(struct util_dqblk *u, sq_dqblk * n) + u->dqb_curspace = ((qsize_t)n->rq_curblocks) << RPC_DQBLK_SIZE_BITS; + u->dqb_curinodes = n->rq_curfiles; + if (n->rq_btimeleft) +- u->dqb_btime = n->rq_btimeleft + now; ++ u->dqb_btime = (int32_t)n->rq_btimeleft + now; + else + u->dqb_btime = 0; + if (n->rq_ftimeleft) +- u->dqb_itime = n->rq_ftimeleft + now; ++ u->dqb_itime = (int32_t)n->rq_ftimeleft + now; + else + u->dqb_itime = 0; + } +@@ -127,11 +128,11 @@ static inline void servutil2netdqblk(struct rquota *n, struct util_dqblk *u) + + time(&now); + if (u->dqb_btime) +- n->rq_btimeleft = u->dqb_btime - now; ++ n->rq_btimeleft = difftime2net(u->dqb_btime, now); + else + n->rq_btimeleft = 0; + if (u->dqb_itime) +- n->rq_ftimeleft = u->dqb_itime - now; ++ n->rq_ftimeleft = difftime2net(u->dqb_itime, now); + else + n->rq_ftimeleft = 0; + } +-- +2.5.0 + diff --git a/SOURCES/quota-4.02-Skip-NFS-mounts-without-rquotad-RPC-service-silently.patch b/SOURCES/quota-4.02-Skip-NFS-mounts-without-rquotad-RPC-service-silently.patch new file mode 100644 index 0000000..1a512e2 --- /dev/null +++ b/SOURCES/quota-4.02-Skip-NFS-mounts-without-rquotad-RPC-service-silently.patch @@ -0,0 +1,125 @@ +From bffaeb028ee716ed46e5b74a45162f2ef45b2963 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Thu, 23 Oct 2014 14:12:01 +0200 +Subject: [PATCH] Skip NFS mounts without rquotad RPC service silently +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If NFS server does uses quotas, then it's high chance the RCP rquotad +service is not running at all. Then listing quotas for such NFS mount +point results into a warning about "connection refused". + +This warning can be obtrusive if a host has mounted various mixture of +NFS exports with and without quotas. + +This patch recognizes this special error state (after performing +a query to a client without running rquotad) and considers such +server as having quotas disabled. This silents the warning +effectively. + +JK: Some coding style fixes, treat also rpc_set_quota() this way. + +Signed-off-by: Petr Písař +Signed-off-by: Jan Kara +--- + rquota_client.c | 38 ++++++++++++++++++++++++++++++++++---- + 1 file changed, 34 insertions(+), 4 deletions(-) + +diff --git a/rquota_client.c b/rquota_client.c +index 9d4055e..a3a4ae3 100644 +--- a/rquota_client.c ++++ b/rquota_client.c +@@ -148,6 +148,8 @@ int rpc_rquota_get(struct dquot *dquot) + } args; + char *fsname_tmp, *host, *pathname; + struct timeval timeout = { 2, 0 }; ++ int rquotaprog_not_registered = 0; ++ int ret; + + /* + * Initialize with NULL. +@@ -206,8 +208,11 @@ int rpc_rquota_get(struct dquot *dquot) + auth_destroy(clnt->cl_auth); + clnt_destroy(clnt); + } +- else ++ else { + result = NULL; ++ if (rpc_createerr.cf_stat == RPC_PROGNOTREGISTERED) ++ rquotaprog_not_registered = 1; ++ } + + if (result == NULL || !result->status) { + if (dquot->dq_h->qh_type == USRQUOTA) { +@@ -244,11 +249,21 @@ int rpc_rquota_get(struct dquot *dquot) + */ + auth_destroy(clnt->cl_auth); + clnt_destroy(clnt); ++ } else { ++ result = NULL; ++ if (rpc_createerr.cf_stat == RPC_PROGNOTREGISTERED) ++ rquotaprog_not_registered = 1; + } + } + } + free(fsname_tmp); +- return rquota_err(result?result->status:-1); ++ if (result) ++ ret = result->status; ++ else if (rquotaprog_not_registered) ++ ret = Q_NOQUOTA; ++ else ++ ret = -1; ++ return rquota_err(ret); + } + + /* +@@ -265,6 +280,8 @@ int rpc_rquota_set(int qcmd, struct dquot *dquot) + } args; + char *fsname_tmp, *host, *pathname; + struct timeval timeout = { 2, 0 }; ++ int rquotaprog_not_registered = 0; ++ int ret; + + /* RPC limits values to 32b variables. Prevent value wrapping. */ + if (check_dquot_range(dquot) < 0) +@@ -321,8 +338,11 @@ int rpc_rquota_set(int qcmd, struct dquot *dquot) + auth_destroy(clnt->cl_auth); + clnt_destroy(clnt); + } +- else ++ else { + result = NULL; ++ if (rpc_createerr.cf_stat == RPC_PROGNOTREGISTERED) ++ rquotaprog_not_registered = 1; ++ } + + if (result == NULL || !result->status) { + if (dquot->dq_h->qh_type == USRQUOTA) { +@@ -361,11 +381,21 @@ int rpc_rquota_set(int qcmd, struct dquot *dquot) + */ + auth_destroy(clnt->cl_auth); + clnt_destroy(clnt); ++ } else { ++ result = NULL; ++ if (rpc_createerr.cf_stat == RPC_PROGNOTREGISTERED) ++ rquotaprog_not_registered = 1; + } + } + } + free(fsname_tmp); +- return rquota_err(result?result->status:-1); ++ if (result) ++ ret = result->status; ++ else if (rquotaprog_not_registered) ++ ret = Q_NOQUOTA; ++ else ++ ret = -1; ++ return rquota_err(ret); + #endif + return -1; + } +-- +1.9.3 + diff --git a/SOURCES/quota-4.03-Add-support-for-scanning-using-Q_XGETNEXTQUOTA.patch b/SOURCES/quota-4.03-Add-support-for-scanning-using-Q_XGETNEXTQUOTA.patch new file mode 100644 index 0000000..1eb0d17 --- /dev/null +++ b/SOURCES/quota-4.03-Add-support-for-scanning-using-Q_XGETNEXTQUOTA.patch @@ -0,0 +1,92 @@ +From 7367f5d511ec4555fbb7a87c1c1853fd4fd01712 Mon Sep 17 00:00:00 2001 +From: Jan Kara +Date: Tue, 26 Jan 2016 14:06:59 +0100 +Subject: [PATCH 2/2] Add support for scanning using Q_XGETNEXTQUOTA +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add support for scanning of all available quota structures using +Q_XGETNEXTQUOTA quotactl. + +Signed-off-by: Jan Kara +Signed-off-by: Petr Písař +--- + quotaio_xfs.c | 42 +++++++++++++++++++++++++++++++++++++++--- + quotaio_xfs.h | 1 + + 2 files changed, 40 insertions(+), 3 deletions(-) + +diff --git a/quotaio_xfs.c b/quotaio_xfs.c +index 903c03e..9d90a3e 100644 +--- a/quotaio_xfs.c ++++ b/quotaio_xfs.c +@@ -191,15 +191,51 @@ static int xfs_get_dquot(struct dquot *dq) + return 0; + } + ++static int xfs_kernel_scan_dquots(struct quota_handle *h, ++ int (*process_dquot)(struct dquot *dquot, char *dqname)) ++{ ++ struct dquot *dquot = get_empty_dquot(); ++ qid_t id = 0; ++ struct xfs_kern_dqblk xdqblk; ++ int ret; ++ ++ dquot->dq_h = h; ++ while (1) { ++ ret = quotactl(QCMD(Q_XGETNEXTQUOTA, h->qh_type), ++ h->qh_quotadev, id, (void *)&xdqblk); ++ if (ret < 0) ++ break; ++ ++ xfs_kern2utildqblk(&dquot->dq_dqb, &xdqblk); ++ dquot->dq_id = xdqblk.d_id; ++ ret = process_dquot(dquot, NULL); ++ if (ret < 0) ++ break; ++ id = xdqblk.d_id + 1; ++ } ++ free(dquot); ++ ++ if (errno == ENOENT) ++ return 0; ++ return ret; ++} ++ + /* + * Scan all known dquots and call callback on each + */ + static int xfs_scan_dquots(struct quota_handle *h, int (*process_dquot) (struct dquot *dquot, char *dqname)) + { +- if (!XFS_USRQUOTA(h) && !XFS_GRPQUOTA(h)) +- return 0; ++ int ret; ++ struct xfs_kern_dqblk xdqblk; + +- return generic_scan_dquots(h, process_dquot, xfs_get_dquot); ++ ret = quotactl(QCMD(Q_XGETNEXTQUOTA, h->qh_type), h->qh_quotadev, 0, ++ (void *)&xdqblk); ++ if (ret < 0 && (errno == ENOSYS || errno == EINVAL)) { ++ if (!XFS_USRQUOTA(h) && !XFS_GRPQUOTA(h)) ++ return 0; ++ return generic_scan_dquots(h, process_dquot, xfs_get_dquot); ++ } ++ return xfs_kernel_scan_dquots(h, process_dquot); + } + + /* +diff --git a/quotaio_xfs.h b/quotaio_xfs.h +index 54725b0..2236da4 100644 +--- a/quotaio_xfs.h ++++ b/quotaio_xfs.h +@@ -46,6 +46,7 @@ + #define Q_XSETQLIM XQM_CMD(0x4) /* set disk limits only */ + #define Q_XGETQSTAT XQM_CMD(0x5) /* returns fs_quota_stat_t struct */ + #define Q_XQUOTARM XQM_CMD(0x6) /* free quota files' space */ ++#define Q_XGETNEXTQUOTA XQM_CMD(0x9) /* get disk limits and usage >= ID */ + + /* + * fs_disk_quota structure: +-- +2.5.0 + diff --git a/SOURCES/quota-4.03-Scan-dquots-using-Q_GETNEXTQUOTA.patch b/SOURCES/quota-4.03-Scan-dquots-using-Q_GETNEXTQUOTA.patch new file mode 100644 index 0000000..38707ed --- /dev/null +++ b/SOURCES/quota-4.03-Scan-dquots-using-Q_GETNEXTQUOTA.patch @@ -0,0 +1,142 @@ +From 85687833434d50e3f5fd4b849e543eb505bf5a20 Mon Sep 17 00:00:00 2001 +From: Jan Kara +Date: Tue, 26 Jan 2016 13:10:59 +0100 +Subject: [PATCH 1/2] Scan dquots using Q_GETNEXTQUOTA +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Check for new kernel quotactl Q_GETNEXTQUOTA and if available use it for +scanning all dquot structures. + +Signed-off-by: Jan Kara +Signed-off-by: Petr Písař +--- + quota.h | 14 ++++++++++++++ + quotaio_generic.c | 34 ++++++++++++++++++++++++++++++++++ + quotaio_generic.h | 4 ++++ + quotaio_meta.c | 14 +++++++++++++- + 4 files changed, 65 insertions(+), 1 deletion(-) + +diff --git a/quota.h b/quota.h +index 0c38427..0607e04 100644 +--- a/quota.h ++++ b/quota.h +@@ -63,6 +63,7 @@ typedef int64_t qsize_t; /* Type in which we store size limitations */ + #define Q_SETINFO 0x800006 /* set information about quota files */ + #define Q_GETQUOTA 0x800007 /* get user quota structure */ + #define Q_SETQUOTA 0x800008 /* set user quota structure */ ++#define Q_GETNEXTQUOTA 0x800009 /* get disk limits and usage >= ID */ + + /* + * Quota structure used for communication with userspace via quotactl +@@ -91,6 +92,19 @@ struct if_dqblk { + u_int32_t dqb_valid; + }; + ++struct if_nextdqblk { ++ u_int64_t dqb_bhardlimit; ++ u_int64_t dqb_bsoftlimit; ++ u_int64_t dqb_curspace; ++ u_int64_t dqb_ihardlimit; ++ u_int64_t dqb_isoftlimit; ++ u_int64_t dqb_curinodes; ++ u_int64_t dqb_btime; ++ u_int64_t dqb_itime; ++ u_int32_t dqb_valid; ++ u_int32_t dqb_id; ++}; ++ + /* + * Structure used for setting quota information about file via quotactl + * Following flags are used to specify which fields are valid +diff --git a/quotaio_generic.c b/quotaio_generic.c +index 5001a56..4bdf380 100644 +--- a/quotaio_generic.c ++++ b/quotaio_generic.c +@@ -161,3 +161,37 @@ int generic_scan_dquots(struct quota_handle *h, + free(dquot); + return ret; + } ++ ++int vfs_scan_dquots(struct quota_handle *h, ++ int (*process_dquot)(struct dquot *dquot, char *dqname)) ++{ ++ struct dquot *dquot = get_empty_dquot(); ++ qid_t id = 0; ++ struct if_nextdqblk kdqblk; ++ int ret; ++ ++ dquot->dq_h = h; ++ while (1) { ++ ret = quotactl(QCMD(Q_GETNEXTQUOTA, h->qh_type), ++ h->qh_quotadev, id, (void *)&kdqblk); ++ if (ret < 0) ++ break; ++ ++ /* ++ * This is a slight hack but we know struct if_dqblk is a ++ * subset of struct if_nextdqblk ++ */ ++ generic_kern2utildqblk(&dquot->dq_dqb, ++ (struct if_dqblk *)&kdqblk); ++ dquot->dq_id = kdqblk.dqb_id; ++ ret = process_dquot(dquot, NULL); ++ if (ret < 0) ++ break; ++ id = kdqblk.dqb_id + 1; ++ } ++ free(dquot); ++ ++ if (errno == ENOENT) ++ return 0; ++ return ret; ++} +diff --git a/quotaio_generic.h b/quotaio_generic.h +index 5edc11c..a7930f0 100644 +--- a/quotaio_generic.h ++++ b/quotaio_generic.h +@@ -27,4 +27,8 @@ int generic_scan_dquots(struct quota_handle *h, + int (*process_dquot)(struct dquot *dquot, char *dqname), + int (*get_dquot)(struct dquot *dquot)); + ++/* Scan all dquots using kernel quotactl to get existing ids */ ++int vfs_scan_dquots(struct quota_handle *h, ++ int (*process_dquot)(struct dquot *dquot, char *dqname)); ++ + #endif +diff --git a/quotaio_meta.c b/quotaio_meta.c +index e52b4f4..ad6ff7a 100644 +--- a/quotaio_meta.c ++++ b/quotaio_meta.c +@@ -8,6 +8,7 @@ + + #include + #include ++#include + + #include + +@@ -55,7 +56,18 @@ static int meta_commit_dquot(struct dquot *dquot, int flags) + + static int meta_scan_dquots(struct quota_handle *h, int (*process_dquot)(struct dquot *dquot, char *dqname)) + { +- return generic_scan_dquots(h, process_dquot, vfs_get_dquot); ++ struct if_nextdqblk kdqblk; ++ int ret; ++ ++ ret = quotactl(QCMD(Q_GETNEXTQUOTA, h->qh_type), h->qh_quotadev, 0, ++ (void *)&kdqblk); ++ /* ++ * Fall back to scanning using passwd if Q_GETNEXTQUOTA is not ++ * supported ++ */ ++ if (ret < 0 && (errno == ENOSYS || errno == EINVAL)) ++ return generic_scan_dquots(h, process_dquot, vfs_get_dquot); ++ return vfs_scan_dquots(h, process_dquot); + } + + struct quotafile_ops quotafile_ops_meta = { +-- +2.5.0 + diff --git a/SPECS/quota.spec b/SPECS/quota.spec index 8c2a7b8..3494379 100644 --- a/SPECS/quota.spec +++ b/SPECS/quota.spec @@ -5,7 +5,7 @@ Name: quota Summary: System administration tools for monitoring users' disk usage Epoch: 1 Version: 4.01 -Release: 11%{?dist}.1 +Release: 14%{?dist} # quota_nld.c, quotaio_xfs.h: GPLv2 # bylabel.c copied from util-linux: GPLv2+ # svc_socket.c copied from glibc: LGPLv2+ @@ -18,7 +18,7 @@ Requires: tcp_wrappers Requires: quota-nls = %{epoch}:%{version}-%{release} Requires: rpcbind Conflicts: kernel < 2.4 -# nfs-utils used to provide nfs-rquotad.service, bug #1316440 +# nfs-utils used to provide nfs-rquotad.service, bug #1207239 Conflicts: nfs-utils < 1:1.3.0-0.4.el7 BuildRequires: e2fsprogs-devel gettext tcp_wrappers-devel BuildRequires: openldap-devel dbus-devel libnl-devel @@ -74,6 +74,17 @@ Patch20: quota-4.01-Add-quotatab-5-manual-page.patch Patch21: quota-4.01-Add-warnquota.conf-5-manual-page.patch # Submitted to upstream, Patch22: quota-4.01-Improve-rcp.rquota-8-manual-page.patch +# Do not warn if rquotad RPC service is not registered, bug #1155584, +# in upstream 4.02 +Patch23: quota-4.02-Skip-NFS-mounts-without-rquotad-RPC-service-silently.patch +# Query kernel for next quota on file system with hiden quota files, +# bug #1305968, in upstream after 4.03 +Patch24: quota-4.03-Scan-dquots-using-Q_GETNEXTQUOTA.patch +# Query kernel for next XFS quota, bug #1305968, in upstream after 4.03 +Patch25: quota-4.03-Add-support-for-scanning-using-Q_XGETNEXTQUOTA.patch +# Prevent from grace period overflow in RPC transport, bug #1072858, +# in upstream 4.02 +Patch26: quota-4.01-Prevent-from-grace-period-overflow-in-RPC-transport.patch %description The quota package contains system administration tools for monitoring @@ -167,6 +178,10 @@ Linux/UNIX environment. %patch20 -p1 -b .doc_quotatab %patch21 -p1 -b .doc_warnquota %patch22 -p1 -b .doc_rquota +%patch23 -p1 -b .silent_no_rquotad +%patch24 -p1 -b .getnextquota +%patch25 -p1 -b .xgetnextquota +%patch26 -p1 -b .rpc_time #fix typos/mistakes in localized documentation for pofile in $(find ./po/*.p*) @@ -212,7 +227,7 @@ install -p -m644 -D %{SOURCE2} \ install -p -m644 -D %{SOURCE3} $RPM_BUILD_ROOT%{_unitdir}/rpc-rquotad.service install -p -m644 -D %{SOURCE4} \ $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/rpc-rquotad -# For backward compatibilty, bug #1316440 +# For backward compatibilty, bug #1207239 ln -s rpc-rquotad.service $RPM_BUILD_ROOT%{_unitdir}/nfs-rquotad.service %find_lang %{name} @@ -291,11 +306,19 @@ echo ' systemd-sysv-convert --apply quota_nld' %changelog -* Thu Mar 10 2016 Petr Pisar - 1:4.01-11.1 +* Thu Mar 10 2016 Petr Pisar - 1:4.01-14 +- Add nfs-rquotad.service alias for backward compatibility (bug #1207239) +- Start rpc-rquotad.service when starting nfs-server.service (bug #1207239) + +* Fri Mar 04 2016 Petr Pisar - 1:4.01-13 +- Prevent from grace period overflow in RPC transport (bug #1072858) + +* Thu Mar 03 2016 Petr Pisar - 1:4.01-12 +- Do not warn if rquotad RPC service is not registered (bug #1155584) +- Query kernel for next quota on XFS or file system with hidden quota files + (bug #1305968) - Add rpc-rquotad.service file which was known as nfs-rquotad.service - in nfs-utils (bug #1316440) -- Add nfs-rquotad.service alias for backward compatibility (bug #1316440) -- Start rpc-rquotad.service when starting nfs-server.service (bug #1316440) + in nfs-utils (bug #1207239) * Fri Jan 24 2014 Daniel Mach - 1:4.01-11 - Mass rebuild 2014-01-24