|
@@ -494,11 +494,15 @@ static void qdsb_put(struct gfs2_quota_data *qd)
|
|
|
int gfs2_quota_hold(struct gfs2_inode *ip, u32 uid, u32 gid)
|
|
|
{
|
|
|
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
|
- struct gfs2_qadata *qa = ip->i_qadata;
|
|
|
- struct gfs2_quota_data **qd = qa->qa_qd;
|
|
|
+ struct gfs2_quota_data **qd;
|
|
|
int error;
|
|
|
|
|
|
- if (gfs2_assert_warn(sdp, !qa->qa_qd_num) ||
|
|
|
+ if (ip->i_res == NULL)
|
|
|
+ gfs2_rs_alloc(ip);
|
|
|
+
|
|
|
+ qd = ip->i_res->rs_qa_qd;
|
|
|
+
|
|
|
+ if (gfs2_assert_warn(sdp, !ip->i_res->rs_qa_qd_num) ||
|
|
|
gfs2_assert_warn(sdp, !test_bit(GIF_QD_LOCKED, &ip->i_flags)))
|
|
|
return -EIO;
|
|
|
|
|
@@ -508,20 +512,20 @@ int gfs2_quota_hold(struct gfs2_inode *ip, u32 uid, u32 gid)
|
|
|
error = qdsb_get(sdp, QUOTA_USER, ip->i_inode.i_uid, qd);
|
|
|
if (error)
|
|
|
goto out;
|
|
|
- qa->qa_qd_num++;
|
|
|
+ ip->i_res->rs_qa_qd_num++;
|
|
|
qd++;
|
|
|
|
|
|
error = qdsb_get(sdp, QUOTA_GROUP, ip->i_inode.i_gid, qd);
|
|
|
if (error)
|
|
|
goto out;
|
|
|
- qa->qa_qd_num++;
|
|
|
+ ip->i_res->rs_qa_qd_num++;
|
|
|
qd++;
|
|
|
|
|
|
if (uid != NO_QUOTA_CHANGE && uid != ip->i_inode.i_uid) {
|
|
|
error = qdsb_get(sdp, QUOTA_USER, uid, qd);
|
|
|
if (error)
|
|
|
goto out;
|
|
|
- qa->qa_qd_num++;
|
|
|
+ ip->i_res->rs_qa_qd_num++;
|
|
|
qd++;
|
|
|
}
|
|
|
|
|
@@ -529,7 +533,7 @@ int gfs2_quota_hold(struct gfs2_inode *ip, u32 uid, u32 gid)
|
|
|
error = qdsb_get(sdp, QUOTA_GROUP, gid, qd);
|
|
|
if (error)
|
|
|
goto out;
|
|
|
- qa->qa_qd_num++;
|
|
|
+ ip->i_res->rs_qa_qd_num++;
|
|
|
qd++;
|
|
|
}
|
|
|
|
|
@@ -542,16 +546,17 @@ out:
|
|
|
void gfs2_quota_unhold(struct gfs2_inode *ip)
|
|
|
{
|
|
|
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
|
- struct gfs2_qadata *qa = ip->i_qadata;
|
|
|
unsigned int x;
|
|
|
|
|
|
+ if (ip->i_res == NULL)
|
|
|
+ return;
|
|
|
gfs2_assert_warn(sdp, !test_bit(GIF_QD_LOCKED, &ip->i_flags));
|
|
|
|
|
|
- for (x = 0; x < qa->qa_qd_num; x++) {
|
|
|
- qdsb_put(qa->qa_qd[x]);
|
|
|
- qa->qa_qd[x] = NULL;
|
|
|
+ for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) {
|
|
|
+ qdsb_put(ip->i_res->rs_qa_qd[x]);
|
|
|
+ ip->i_res->rs_qa_qd[x] = NULL;
|
|
|
}
|
|
|
- qa->qa_qd_num = 0;
|
|
|
+ ip->i_res->rs_qa_qd_num = 0;
|
|
|
}
|
|
|
|
|
|
static int sort_qd(const void *a, const void *b)
|
|
@@ -764,6 +769,10 @@ static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda)
|
|
|
unsigned int nalloc = 0, blocks;
|
|
|
int error;
|
|
|
|
|
|
+ error = gfs2_rs_alloc(ip);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
+
|
|
|
gfs2_write_calc_reserv(ip, sizeof(struct gfs2_quota),
|
|
|
&data_blocks, &ind_blocks);
|
|
|
|
|
@@ -915,7 +924,6 @@ fail:
|
|
|
int gfs2_quota_lock(struct gfs2_inode *ip, u32 uid, u32 gid)
|
|
|
{
|
|
|
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
|
- struct gfs2_qadata *qa = ip->i_qadata;
|
|
|
struct gfs2_quota_data *qd;
|
|
|
unsigned int x;
|
|
|
int error = 0;
|
|
@@ -928,15 +936,15 @@ int gfs2_quota_lock(struct gfs2_inode *ip, u32 uid, u32 gid)
|
|
|
sdp->sd_args.ar_quota != GFS2_QUOTA_ON)
|
|
|
return 0;
|
|
|
|
|
|
- sort(qa->qa_qd, qa->qa_qd_num, sizeof(struct gfs2_quota_data *),
|
|
|
- sort_qd, NULL);
|
|
|
+ sort(ip->i_res->rs_qa_qd, ip->i_res->rs_qa_qd_num,
|
|
|
+ sizeof(struct gfs2_quota_data *), sort_qd, NULL);
|
|
|
|
|
|
- for (x = 0; x < qa->qa_qd_num; x++) {
|
|
|
+ for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) {
|
|
|
int force = NO_FORCE;
|
|
|
- qd = qa->qa_qd[x];
|
|
|
+ qd = ip->i_res->rs_qa_qd[x];
|
|
|
if (test_and_clear_bit(QDF_REFRESH, &qd->qd_flags))
|
|
|
force = FORCE;
|
|
|
- error = do_glock(qd, force, &qa->qa_qd_ghs[x]);
|
|
|
+ error = do_glock(qd, force, &ip->i_res->rs_qa_qd_ghs[x]);
|
|
|
if (error)
|
|
|
break;
|
|
|
}
|
|
@@ -945,7 +953,7 @@ int gfs2_quota_lock(struct gfs2_inode *ip, u32 uid, u32 gid)
|
|
|
set_bit(GIF_QD_LOCKED, &ip->i_flags);
|
|
|
else {
|
|
|
while (x--)
|
|
|
- gfs2_glock_dq_uninit(&qa->qa_qd_ghs[x]);
|
|
|
+ gfs2_glock_dq_uninit(&ip->i_res->rs_qa_qd_ghs[x]);
|
|
|
gfs2_quota_unhold(ip);
|
|
|
}
|
|
|
|
|
@@ -990,7 +998,6 @@ static int need_sync(struct gfs2_quota_data *qd)
|
|
|
|
|
|
void gfs2_quota_unlock(struct gfs2_inode *ip)
|
|
|
{
|
|
|
- struct gfs2_qadata *qa = ip->i_qadata;
|
|
|
struct gfs2_quota_data *qda[4];
|
|
|
unsigned int count = 0;
|
|
|
unsigned int x;
|
|
@@ -998,14 +1005,14 @@ void gfs2_quota_unlock(struct gfs2_inode *ip)
|
|
|
if (!test_and_clear_bit(GIF_QD_LOCKED, &ip->i_flags))
|
|
|
goto out;
|
|
|
|
|
|
- for (x = 0; x < qa->qa_qd_num; x++) {
|
|
|
+ for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) {
|
|
|
struct gfs2_quota_data *qd;
|
|
|
int sync;
|
|
|
|
|
|
- qd = qa->qa_qd[x];
|
|
|
+ qd = ip->i_res->rs_qa_qd[x];
|
|
|
sync = need_sync(qd);
|
|
|
|
|
|
- gfs2_glock_dq_uninit(&qa->qa_qd_ghs[x]);
|
|
|
+ gfs2_glock_dq_uninit(&ip->i_res->rs_qa_qd_ghs[x]);
|
|
|
|
|
|
if (sync && qd_trylock(qd))
|
|
|
qda[count++] = qd;
|
|
@@ -1038,7 +1045,6 @@ static int print_message(struct gfs2_quota_data *qd, char *type)
|
|
|
int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid)
|
|
|
{
|
|
|
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
|
- struct gfs2_qadata *qa = ip->i_qadata;
|
|
|
struct gfs2_quota_data *qd;
|
|
|
s64 value;
|
|
|
unsigned int x;
|
|
@@ -1050,8 +1056,8 @@ int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid)
|
|
|
if (sdp->sd_args.ar_quota != GFS2_QUOTA_ON)
|
|
|
return 0;
|
|
|
|
|
|
- for (x = 0; x < qa->qa_qd_num; x++) {
|
|
|
- qd = qa->qa_qd[x];
|
|
|
+ for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) {
|
|
|
+ qd = ip->i_res->rs_qa_qd[x];
|
|
|
|
|
|
if (!((qd->qd_id == uid && test_bit(QDF_USER, &qd->qd_flags)) ||
|
|
|
(qd->qd_id == gid && !test_bit(QDF_USER, &qd->qd_flags))))
|
|
@@ -1089,7 +1095,6 @@ int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid)
|
|
|
void gfs2_quota_change(struct gfs2_inode *ip, s64 change,
|
|
|
u32 uid, u32 gid)
|
|
|
{
|
|
|
- struct gfs2_qadata *qa = ip->i_qadata;
|
|
|
struct gfs2_quota_data *qd;
|
|
|
unsigned int x;
|
|
|
|
|
@@ -1098,8 +1103,8 @@ void gfs2_quota_change(struct gfs2_inode *ip, s64 change,
|
|
|
if (ip->i_diskflags & GFS2_DIF_SYSTEM)
|
|
|
return;
|
|
|
|
|
|
- for (x = 0; x < qa->qa_qd_num; x++) {
|
|
|
- qd = qa->qa_qd[x];
|
|
|
+ for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) {
|
|
|
+ qd = ip->i_res->rs_qa_qd[x];
|
|
|
|
|
|
if ((qd->qd_id == uid && test_bit(QDF_USER, &qd->qd_flags)) ||
|
|
|
(qd->qd_id == gid && !test_bit(QDF_USER, &qd->qd_flags))) {
|
|
@@ -1549,10 +1554,14 @@ static int gfs2_set_dqblk(struct super_block *sb, int type, qid_t id,
|
|
|
if (error)
|
|
|
return error;
|
|
|
|
|
|
+ error = gfs2_rs_alloc(ip);
|
|
|
+ if (error)
|
|
|
+ goto out_put;
|
|
|
+
|
|
|
mutex_lock(&ip->i_inode.i_mutex);
|
|
|
error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_EXCLUSIVE, 0, &q_gh);
|
|
|
if (error)
|
|
|
- goto out_put;
|
|
|
+ goto out_unlockput;
|
|
|
error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &i_gh);
|
|
|
if (error)
|
|
|
goto out_q;
|
|
@@ -1609,8 +1618,9 @@ out_i:
|
|
|
gfs2_glock_dq_uninit(&i_gh);
|
|
|
out_q:
|
|
|
gfs2_glock_dq_uninit(&q_gh);
|
|
|
-out_put:
|
|
|
+out_unlockput:
|
|
|
mutex_unlock(&ip->i_inode.i_mutex);
|
|
|
+out_put:
|
|
|
qd_put(qd);
|
|
|
return error;
|
|
|
}
|