xfs: Add support for Q_SETINFO
authorJan Kara <jack@suse.cz>
Tue, 16 Dec 2014 12:07:45 +0000 (13:07 +0100)
committerJan Kara <jack@suse.cz>
Wed, 4 Mar 2015 15:06:38 +0000 (16:06 +0100)
Add support to XFS so that time limits can be set through Q_SETINFO
quotactl.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/xfs/xfs_quotaops.c

index 5775acb0589b7f59e2bc6d3c4016fdfe95b328d9..7795e0d01382a60798b4e83f35ba6db725fe8779 100644 (file)
@@ -111,6 +111,42 @@ xfs_quota_type(int type)
        }
 }
 
+#define XFS_QC_SETINFO_MASK (QC_TIMER_MASK | QC_WARNS_MASK)
+
+/*
+ * Adjust quota timers & warnings
+ */
+static int
+xfs_fs_set_info(
+       struct super_block      *sb,
+       int                     type,
+       struct qc_info          *info)
+{
+       struct xfs_mount *mp = XFS_M(sb);
+       struct qc_dqblk newlim;
+
+       if (sb->s_flags & MS_RDONLY)
+               return -EROFS;
+       if (!XFS_IS_QUOTA_RUNNING(mp))
+               return -ENOSYS;
+       if (!XFS_IS_QUOTA_ON(mp))
+               return -ESRCH;
+       if (info->i_fieldmask & ~XFS_QC_SETINFO_MASK)
+               return -EINVAL;
+       if ((info->i_fieldmask & XFS_QC_SETINFO_MASK) == 0)
+               return 0;
+
+       newlim.d_fieldmask = info->i_fieldmask;
+       newlim.d_spc_timer = info->i_spc_timelimit;
+       newlim.d_ino_timer = info->i_ino_timelimit;
+       newlim.d_rt_spc_timer = info->i_rt_spc_timelimit;
+       newlim.d_ino_warns = info->i_ino_warnlimit;
+       newlim.d_spc_warns = info->i_spc_warnlimit;
+       newlim.d_rt_spc_warns = info->i_rt_spc_warnlimit;
+
+       return xfs_qm_scall_setqlim(mp, 0, xfs_quota_type(type), &newlim);
+}
+
 static unsigned int
 xfs_quota_flags(unsigned int uflags)
 {
@@ -226,6 +262,7 @@ xfs_fs_set_dqblk(
 
 const struct quotactl_ops xfs_quotactl_operations = {
        .get_state              = xfs_fs_get_quota_state,
+       .set_info               = xfs_fs_set_info,
        .quota_enable           = xfs_quota_enable,
        .quota_disable          = xfs_quota_disable,
        .rm_xquota              = xfs_fs_rm_xquota,