|
@@ -1469,7 +1469,7 @@ static int gfs2_quota_get_xstate(struct super_block *sb,
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static int gfs2_get_dqblk(struct super_block *sb, int type, qid_t id,
|
|
|
|
|
|
|
+static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid,
|
|
|
struct fs_disk_quota *fdq)
|
|
struct fs_disk_quota *fdq)
|
|
|
{
|
|
{
|
|
|
struct gfs2_sbd *sdp = sb->s_fs_info;
|
|
struct gfs2_sbd *sdp = sb->s_fs_info;
|
|
@@ -1477,20 +1477,21 @@ static int gfs2_get_dqblk(struct super_block *sb, int type, qid_t id,
|
|
|
struct gfs2_quota_data *qd;
|
|
struct gfs2_quota_data *qd;
|
|
|
struct gfs2_holder q_gh;
|
|
struct gfs2_holder q_gh;
|
|
|
int error;
|
|
int error;
|
|
|
|
|
+ int type;
|
|
|
|
|
|
|
|
memset(fdq, 0, sizeof(struct fs_disk_quota));
|
|
memset(fdq, 0, sizeof(struct fs_disk_quota));
|
|
|
|
|
|
|
|
if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF)
|
|
if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF)
|
|
|
return -ESRCH; /* Crazy XFS error code */
|
|
return -ESRCH; /* Crazy XFS error code */
|
|
|
|
|
|
|
|
- if (type == USRQUOTA)
|
|
|
|
|
|
|
+ if (qid.type == USRQUOTA)
|
|
|
type = QUOTA_USER;
|
|
type = QUOTA_USER;
|
|
|
- else if (type == GRPQUOTA)
|
|
|
|
|
|
|
+ else if (qid.type == GRPQUOTA)
|
|
|
type = QUOTA_GROUP;
|
|
type = QUOTA_GROUP;
|
|
|
else
|
|
else
|
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
- error = qd_get(sdp, type, id, &qd);
|
|
|
|
|
|
|
+ error = qd_get(sdp, type, from_kqid(&init_user_ns, qid), &qd);
|
|
|
if (error)
|
|
if (error)
|
|
|
return error;
|
|
return error;
|
|
|
error = do_glock(qd, FORCE, &q_gh);
|
|
error = do_glock(qd, FORCE, &q_gh);
|
|
@@ -1500,7 +1501,7 @@ static int gfs2_get_dqblk(struct super_block *sb, int type, qid_t id,
|
|
|
qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lvb;
|
|
qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lvb;
|
|
|
fdq->d_version = FS_DQUOT_VERSION;
|
|
fdq->d_version = FS_DQUOT_VERSION;
|
|
|
fdq->d_flags = (type == QUOTA_USER) ? FS_USER_QUOTA : FS_GROUP_QUOTA;
|
|
fdq->d_flags = (type == QUOTA_USER) ? FS_USER_QUOTA : FS_GROUP_QUOTA;
|
|
|
- fdq->d_id = id;
|
|
|
|
|
|
|
+ fdq->d_id = from_kqid(&init_user_ns, qid);
|
|
|
fdq->d_blk_hardlimit = be64_to_cpu(qlvb->qb_limit) << sdp->sd_fsb2bb_shift;
|
|
fdq->d_blk_hardlimit = be64_to_cpu(qlvb->qb_limit) << sdp->sd_fsb2bb_shift;
|
|
|
fdq->d_blk_softlimit = be64_to_cpu(qlvb->qb_warn) << sdp->sd_fsb2bb_shift;
|
|
fdq->d_blk_softlimit = be64_to_cpu(qlvb->qb_warn) << sdp->sd_fsb2bb_shift;
|
|
|
fdq->d_bcount = be64_to_cpu(qlvb->qb_value) << sdp->sd_fsb2bb_shift;
|
|
fdq->d_bcount = be64_to_cpu(qlvb->qb_value) << sdp->sd_fsb2bb_shift;
|
|
@@ -1514,7 +1515,7 @@ static int gfs2_get_dqblk(struct super_block *sb, int type, qid_t id,
|
|
|
/* GFS2 only supports a subset of the XFS fields */
|
|
/* GFS2 only supports a subset of the XFS fields */
|
|
|
#define GFS2_FIELDMASK (FS_DQ_BSOFT|FS_DQ_BHARD|FS_DQ_BCOUNT)
|
|
#define GFS2_FIELDMASK (FS_DQ_BSOFT|FS_DQ_BHARD|FS_DQ_BCOUNT)
|
|
|
|
|
|
|
|
-static int gfs2_set_dqblk(struct super_block *sb, int type, qid_t id,
|
|
|
|
|
|
|
+static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid,
|
|
|
struct fs_disk_quota *fdq)
|
|
struct fs_disk_quota *fdq)
|
|
|
{
|
|
{
|
|
|
struct gfs2_sbd *sdp = sb->s_fs_info;
|
|
struct gfs2_sbd *sdp = sb->s_fs_info;
|
|
@@ -1526,11 +1527,12 @@ static int gfs2_set_dqblk(struct super_block *sb, int type, qid_t id,
|
|
|
int alloc_required;
|
|
int alloc_required;
|
|
|
loff_t offset;
|
|
loff_t offset;
|
|
|
int error;
|
|
int error;
|
|
|
|
|
+ int type;
|
|
|
|
|
|
|
|
if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF)
|
|
if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF)
|
|
|
return -ESRCH; /* Crazy XFS error code */
|
|
return -ESRCH; /* Crazy XFS error code */
|
|
|
|
|
|
|
|
- switch(type) {
|
|
|
|
|
|
|
+ switch(qid.type) {
|
|
|
case USRQUOTA:
|
|
case USRQUOTA:
|
|
|
type = QUOTA_USER;
|
|
type = QUOTA_USER;
|
|
|
if (fdq->d_flags != FS_USER_QUOTA)
|
|
if (fdq->d_flags != FS_USER_QUOTA)
|
|
@@ -1547,10 +1549,10 @@ static int gfs2_set_dqblk(struct super_block *sb, int type, qid_t id,
|
|
|
|
|
|
|
|
if (fdq->d_fieldmask & ~GFS2_FIELDMASK)
|
|
if (fdq->d_fieldmask & ~GFS2_FIELDMASK)
|
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
- if (fdq->d_id != id)
|
|
|
|
|
|
|
+ if (fdq->d_id != from_kqid(&init_user_ns, qid))
|
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
- error = qd_get(sdp, type, id, &qd);
|
|
|
|
|
|
|
+ error = qd_get(sdp, type, from_kqid(&init_user_ns, qid), &qd);
|
|
|
if (error)
|
|
if (error)
|
|
|
return error;
|
|
return error;
|
|
|
|
|
|