提交 9cde2898 编写于 作者: A Abhi Das 提交者: Bob Peterson

gfs2: limit quota log messages

This patch makes the quota subsystem only report once that a
particular user/group has exceeded their allotted quota.

Previously, it was possible for a program to continuously try
exceeding quota (despite receiving EDQUOT) and in turn trigger
gfs2 to issue a kernel log message about quota exceed. In theory,
this could get out of hand and flood the log and the filesystem
hosting the log files.
Signed-off-by: NAbhi Das <adas@redhat.com>
Signed-off-by: NBob Peterson <rpeterso@redhat.com>
上级 39a72580
...@@ -432,6 +432,7 @@ enum { ...@@ -432,6 +432,7 @@ enum {
QDF_CHANGE = 1, QDF_CHANGE = 1,
QDF_LOCKED = 2, QDF_LOCKED = 2,
QDF_REFRESH = 3, QDF_REFRESH = 3,
QDF_QMSG_QUIET = 4,
}; };
struct gfs2_quota_data { struct gfs2_quota_data {
......
...@@ -649,6 +649,8 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change) ...@@ -649,6 +649,8 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change)
slot_hold(qd); slot_hold(qd);
} }
if (change < 0) /* Reset quiet flag if we freed some blocks */
clear_bit(QDF_QMSG_QUIET, &qd->qd_flags);
mutex_unlock(&sdp->sd_quota_mutex); mutex_unlock(&sdp->sd_quota_mutex);
} }
...@@ -1187,10 +1189,13 @@ int gfs2_quota_check(struct gfs2_inode *ip, kuid_t uid, kgid_t gid, ...@@ -1187,10 +1189,13 @@ int gfs2_quota_check(struct gfs2_inode *ip, kuid_t uid, kgid_t gid,
/* If no min_target specified or we don't meet /* If no min_target specified or we don't meet
* min_target, return -EDQUOT */ * min_target, return -EDQUOT */
if (!ap->min_target || ap->min_target > ap->allowed) { if (!ap->min_target || ap->min_target > ap->allowed) {
print_message(qd, "exceeded"); if (!test_and_set_bit(QDF_QMSG_QUIET,
quota_send_warning(qd->qd_id, &qd->qd_flags)) {
sdp->sd_vfs->s_dev, print_message(qd, "exceeded");
QUOTA_NL_BHARDWARN); quota_send_warning(qd->qd_id,
sdp->sd_vfs->s_dev,
QUOTA_NL_BHARDWARN);
}
error = -EDQUOT; error = -EDQUOT;
break; break;
} }
...@@ -1685,6 +1690,8 @@ static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid, ...@@ -1685,6 +1690,8 @@ static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid,
/* Apply changes */ /* Apply changes */
error = gfs2_adjust_quota(ip, offset, 0, qd, fdq); error = gfs2_adjust_quota(ip, offset, 0, qd, fdq);
if (!error)
clear_bit(QDF_QMSG_QUIET, &qd->qd_flags);
gfs2_trans_end(sdp); gfs2_trans_end(sdp);
out_release: out_release:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册