|
@@ -1709,10 +1709,19 @@ int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *d
|
|
}
|
|
}
|
|
|
|
|
|
/* Generic routine for setting common part of quota structure */
|
|
/* Generic routine for setting common part of quota structure */
|
|
-static void do_set_dqblk(struct dquot *dquot, struct if_dqblk *di)
|
|
|
|
|
|
+static int do_set_dqblk(struct dquot *dquot, struct if_dqblk *di)
|
|
{
|
|
{
|
|
struct mem_dqblk *dm = &dquot->dq_dqb;
|
|
struct mem_dqblk *dm = &dquot->dq_dqb;
|
|
int check_blim = 0, check_ilim = 0;
|
|
int check_blim = 0, check_ilim = 0;
|
|
|
|
+ struct mem_dqinfo *dqi = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_type];
|
|
|
|
+
|
|
|
|
+ if ((di->dqb_valid & QIF_BLIMITS &&
|
|
|
|
+ (di->dqb_bhardlimit > dqi->dqi_maxblimit ||
|
|
|
|
+ di->dqb_bsoftlimit > dqi->dqi_maxblimit)) ||
|
|
|
|
+ (di->dqb_valid & QIF_ILIMITS &&
|
|
|
|
+ (di->dqb_ihardlimit > dqi->dqi_maxilimit ||
|
|
|
|
+ di->dqb_isoftlimit > dqi->dqi_maxilimit)))
|
|
|
|
+ return -ERANGE;
|
|
|
|
|
|
spin_lock(&dq_data_lock);
|
|
spin_lock(&dq_data_lock);
|
|
if (di->dqb_valid & QIF_SPACE) {
|
|
if (di->dqb_valid & QIF_SPACE) {
|
|
@@ -1744,7 +1753,7 @@ static void do_set_dqblk(struct dquot *dquot, struct if_dqblk *di)
|
|
clear_bit(DQ_BLKS_B, &dquot->dq_flags);
|
|
clear_bit(DQ_BLKS_B, &dquot->dq_flags);
|
|
}
|
|
}
|
|
else if (!(di->dqb_valid & QIF_BTIME)) /* Set grace only if user hasn't provided his own... */
|
|
else if (!(di->dqb_valid & QIF_BTIME)) /* Set grace only if user hasn't provided his own... */
|
|
- dm->dqb_btime = get_seconds() + sb_dqopt(dquot->dq_sb)->info[dquot->dq_type].dqi_bgrace;
|
|
|
|
|
|
+ dm->dqb_btime = get_seconds() + dqi->dqi_bgrace;
|
|
}
|
|
}
|
|
if (check_ilim) {
|
|
if (check_ilim) {
|
|
if (!dm->dqb_isoftlimit || dm->dqb_curinodes < dm->dqb_isoftlimit) {
|
|
if (!dm->dqb_isoftlimit || dm->dqb_curinodes < dm->dqb_isoftlimit) {
|
|
@@ -1752,7 +1761,7 @@ static void do_set_dqblk(struct dquot *dquot, struct if_dqblk *di)
|
|
clear_bit(DQ_INODES_B, &dquot->dq_flags);
|
|
clear_bit(DQ_INODES_B, &dquot->dq_flags);
|
|
}
|
|
}
|
|
else if (!(di->dqb_valid & QIF_ITIME)) /* Set grace only if user hasn't provided his own... */
|
|
else if (!(di->dqb_valid & QIF_ITIME)) /* Set grace only if user hasn't provided his own... */
|
|
- dm->dqb_itime = get_seconds() + sb_dqopt(dquot->dq_sb)->info[dquot->dq_type].dqi_igrace;
|
|
|
|
|
|
+ dm->dqb_itime = get_seconds() + dqi->dqi_igrace;
|
|
}
|
|
}
|
|
if (dm->dqb_bhardlimit || dm->dqb_bsoftlimit || dm->dqb_ihardlimit || dm->dqb_isoftlimit)
|
|
if (dm->dqb_bhardlimit || dm->dqb_bsoftlimit || dm->dqb_ihardlimit || dm->dqb_isoftlimit)
|
|
clear_bit(DQ_FAKE_B, &dquot->dq_flags);
|
|
clear_bit(DQ_FAKE_B, &dquot->dq_flags);
|
|
@@ -1760,21 +1769,24 @@ static void do_set_dqblk(struct dquot *dquot, struct if_dqblk *di)
|
|
set_bit(DQ_FAKE_B, &dquot->dq_flags);
|
|
set_bit(DQ_FAKE_B, &dquot->dq_flags);
|
|
spin_unlock(&dq_data_lock);
|
|
spin_unlock(&dq_data_lock);
|
|
mark_dquot_dirty(dquot);
|
|
mark_dquot_dirty(dquot);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di)
|
|
int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di)
|
|
{
|
|
{
|
|
struct dquot *dquot;
|
|
struct dquot *dquot;
|
|
|
|
+ int rc;
|
|
|
|
|
|
mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
|
|
mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
|
|
if (!(dquot = dqget(sb, id, type))) {
|
|
if (!(dquot = dqget(sb, id, type))) {
|
|
mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
|
|
mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
|
|
return -ESRCH;
|
|
return -ESRCH;
|
|
}
|
|
}
|
|
- do_set_dqblk(dquot, di);
|
|
|
|
|
|
+ rc = do_set_dqblk(dquot, di);
|
|
dqput(dquot);
|
|
dqput(dquot);
|
|
mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
|
|
mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
|
|
- return 0;
|
|
|
|
|
|
+ return rc;
|
|
}
|
|
}
|
|
|
|
|
|
/* Generic routine for getting common part of quota file information */
|
|
/* Generic routine for getting common part of quota file information */
|