xfs
[Top] [All Lists]

[PATCH 3/3 v2] xfs: implement quota warnings via netlink

To: xfs@xxxxxxxxxxx
Subject: [PATCH 3/3 v2] xfs: implement quota warnings via netlink
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Date: Sun, 17 Jan 2010 17:36:19 -0500
In-reply-to: <20100113220603.251930871@xxxxxxxxxxxxxxxxxxxxxx>
References: <20100113220547.846700560@xxxxxxxxxxxxxxxxxxxxxx> <20100113220603.251930871@xxxxxxxxxxxxxxxxxxxxxx>
User-agent: Mutt/1.5.19 (2009-01-05)
Wire up quota_send_warning to send quota warnings over netlink.  This is
used by various desktops to show user quota warnings.

Tested by running the quota_nld daemon while running the xfstest quota
tests and observing the warnings.  I'll see how I can get a more formal
testcase for it written.

Signed-off-by: Christoph Hellwig <hch@xxxxxx>

Index: xfs/fs/xfs/quota/xfs_trans_dquot.c
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c     2010-01-17 11:02:29.340004208 
+0100
+++ xfs/fs/xfs/quota/xfs_trans_dquot.c  2010-01-17 13:41:34.142005475 +0100
@@ -589,6 +589,20 @@ xfs_trans_unreserve_and_mod_dquots(
        }
 }
 
+STATIC void
+xfs_quota_warn(
+       struct xfs_mount        *mp,
+       struct xfs_dquot        *dqp,
+       int                     type)
+{
+       /* no warnings for project quotas - we just return ENOSPC later */
+       if (dqp->dq_flags & XFS_DQ_PROJ)
+               return;
+       quota_send_warning((dqp->dq_flags & XFS_DQ_USER) ? USRQUOTA : GRPQUOTA,
+                          be32_to_cpu(dqp->q_core.d_id), mp->m_super->s_dev,
+                          type);
+}
+
 /*
  * This reserves disk blocks and inodes against a dquot.
  * Flags indicate if the dquot is to be locked here and also
@@ -657,13 +671,21 @@ xfs_trans_dqresv(
                         * nblks.
                         */
                        if (hardlimit > 0ULL &&
-                           hardlimit <= nblks + *resbcountp)
+                           hardlimit <= nblks + *resbcountp) {
+                               xfs_quota_warn(mp, dqp, QUOTA_NL_BHARDWARN);
                                goto error_return;
+                       }
                        if (softlimit > 0ULL &&
-                           softlimit <= nblks + *resbcountp &&
-                           ((timer != 0 && get_seconds() > timer) ||
-                            (warns != 0 && warns >= warnlimit)))
-                               goto error_return;
+                           softlimit <= nblks + *resbcountp) {
+                               if ((timer != 0 && get_seconds() > timer) ||
+                                   (warns != 0 && warns >= warnlimit)) {
+                                       xfs_quota_warn(mp, dqp,
+                                                      QUOTA_NL_BSOFTLONGWARN);
+                                       goto error_return;
+                               }
+
+                               xfs_quota_warn(mp, dqp, QUOTA_NL_BSOFTWARN);
+                       }
                }
                if (ninos > 0) {
                        count = be64_to_cpu(dqp->q_core.d_icount);
@@ -677,12 +699,19 @@ xfs_trans_dqresv(
                        if (!softlimit)
                                softlimit = q->qi_isoftlimit;
 
-                       if (hardlimit > 0ULL && count >= hardlimit)
-                               goto error_return;
-                       if (softlimit > 0ULL && count >= softlimit &&
-                           ((timer != 0 && get_seconds() > timer) ||
-                            (warns != 0 && warns >= warnlimit)))
+                       if (hardlimit > 0ULL && count >= hardlimit) {
+                               xfs_quota_warn(mp, dqp, QUOTA_NL_IHARDWARN);
                                goto error_return;
+                       }
+                       if (softlimit > 0ULL && count >= softlimit) {
+                               if  ((timer != 0 && get_seconds() > timer) ||
+                                    (warns != 0 && warns >= warnlimit)) {
+                                       xfs_quota_warn(mp, dqp,
+                                                      QUOTA_NL_ISOFTLONGWARN);
+                                       goto error_return;
+                               }
+                               xfs_quota_warn(mp, dqp, QUOTA_NL_ISOFTWARN);
+                       }
                }
        }
 

<Prev in Thread] Current Thread [Next in Thread>