diff options
Diffstat (limited to 'fs/gfs2/quota.c')
-rw-r--r-- | fs/gfs2/quota.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 4021deca61e..40c4b0d42fa 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c | |||
@@ -1071,8 +1071,10 @@ int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid) | |||
1071 | 1071 | ||
1072 | if (be64_to_cpu(qd->qd_qb.qb_limit) && (s64)be64_to_cpu(qd->qd_qb.qb_limit) < value) { | 1072 | if (be64_to_cpu(qd->qd_qb.qb_limit) && (s64)be64_to_cpu(qd->qd_qb.qb_limit) < value) { |
1073 | print_message(qd, "exceeded"); | 1073 | print_message(qd, "exceeded"); |
1074 | quota_send_warning(test_bit(QDF_USER, &qd->qd_flags) ? | 1074 | quota_send_warning(make_kqid(&init_user_ns, |
1075 | USRQUOTA : GRPQUOTA, qd->qd_id, | 1075 | test_bit(QDF_USER, &qd->qd_flags) ? |
1076 | USRQUOTA : GRPQUOTA, | ||
1077 | qd->qd_id), | ||
1076 | sdp->sd_vfs->s_dev, QUOTA_NL_BHARDWARN); | 1078 | sdp->sd_vfs->s_dev, QUOTA_NL_BHARDWARN); |
1077 | 1079 | ||
1078 | error = -EDQUOT; | 1080 | error = -EDQUOT; |
@@ -1082,8 +1084,10 @@ int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid) | |||
1082 | time_after_eq(jiffies, qd->qd_last_warn + | 1084 | time_after_eq(jiffies, qd->qd_last_warn + |
1083 | gfs2_tune_get(sdp, | 1085 | gfs2_tune_get(sdp, |
1084 | gt_quota_warn_period) * HZ)) { | 1086 | gt_quota_warn_period) * HZ)) { |
1085 | quota_send_warning(test_bit(QDF_USER, &qd->qd_flags) ? | 1087 | quota_send_warning(make_kqid(&init_user_ns, |
1086 | USRQUOTA : GRPQUOTA, qd->qd_id, | 1088 | test_bit(QDF_USER, &qd->qd_flags) ? |
1089 | USRQUOTA : GRPQUOTA, | ||
1090 | qd->qd_id), | ||
1087 | sdp->sd_vfs->s_dev, QUOTA_NL_BSOFTWARN); | 1091 | sdp->sd_vfs->s_dev, QUOTA_NL_BSOFTWARN); |
1088 | error = print_message(qd, "warning"); | 1092 | error = print_message(qd, "warning"); |
1089 | qd->qd_last_warn = jiffies; | 1093 | qd->qd_last_warn = jiffies; |
@@ -1470,7 +1474,7 @@ static int gfs2_quota_get_xstate(struct super_block *sb, | |||
1470 | return 0; | 1474 | return 0; |
1471 | } | 1475 | } |
1472 | 1476 | ||
1473 | static int gfs2_get_dqblk(struct super_block *sb, int type, qid_t id, | 1477 | static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid, |
1474 | struct fs_disk_quota *fdq) | 1478 | struct fs_disk_quota *fdq) |
1475 | { | 1479 | { |
1476 | struct gfs2_sbd *sdp = sb->s_fs_info; | 1480 | struct gfs2_sbd *sdp = sb->s_fs_info; |
@@ -1478,20 +1482,21 @@ static int gfs2_get_dqblk(struct super_block *sb, int type, qid_t id, | |||
1478 | struct gfs2_quota_data *qd; | 1482 | struct gfs2_quota_data *qd; |
1479 | struct gfs2_holder q_gh; | 1483 | struct gfs2_holder q_gh; |
1480 | int error; | 1484 | int error; |
1485 | int type; | ||
1481 | 1486 | ||
1482 | memset(fdq, 0, sizeof(struct fs_disk_quota)); | 1487 | memset(fdq, 0, sizeof(struct fs_disk_quota)); |
1483 | 1488 | ||
1484 | if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF) | 1489 | if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF) |
1485 | return -ESRCH; /* Crazy XFS error code */ | 1490 | return -ESRCH; /* Crazy XFS error code */ |
1486 | 1491 | ||
1487 | if (type == USRQUOTA) | 1492 | if (qid.type == USRQUOTA) |
1488 | type = QUOTA_USER; | 1493 | type = QUOTA_USER; |
1489 | else if (type == GRPQUOTA) | 1494 | else if (qid.type == GRPQUOTA) |
1490 | type = QUOTA_GROUP; | 1495 | type = QUOTA_GROUP; |
1491 | else | 1496 | else |
1492 | return -EINVAL; | 1497 | return -EINVAL; |
1493 | 1498 | ||
1494 | error = qd_get(sdp, type, id, &qd); | 1499 | error = qd_get(sdp, type, from_kqid(&init_user_ns, qid), &qd); |
1495 | if (error) | 1500 | if (error) |
1496 | return error; | 1501 | return error; |
1497 | error = do_glock(qd, FORCE, &q_gh); | 1502 | error = do_glock(qd, FORCE, &q_gh); |
@@ -1501,7 +1506,7 @@ static int gfs2_get_dqblk(struct super_block *sb, int type, qid_t id, | |||
1501 | qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lvb; | 1506 | qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lvb; |
1502 | fdq->d_version = FS_DQUOT_VERSION; | 1507 | fdq->d_version = FS_DQUOT_VERSION; |
1503 | fdq->d_flags = (type == QUOTA_USER) ? FS_USER_QUOTA : FS_GROUP_QUOTA; | 1508 | fdq->d_flags = (type == QUOTA_USER) ? FS_USER_QUOTA : FS_GROUP_QUOTA; |
1504 | fdq->d_id = id; | 1509 | fdq->d_id = from_kqid(&init_user_ns, qid); |
1505 | fdq->d_blk_hardlimit = be64_to_cpu(qlvb->qb_limit) << sdp->sd_fsb2bb_shift; | 1510 | fdq->d_blk_hardlimit = be64_to_cpu(qlvb->qb_limit) << sdp->sd_fsb2bb_shift; |
1506 | fdq->d_blk_softlimit = be64_to_cpu(qlvb->qb_warn) << sdp->sd_fsb2bb_shift; | 1511 | fdq->d_blk_softlimit = be64_to_cpu(qlvb->qb_warn) << sdp->sd_fsb2bb_shift; |
1507 | fdq->d_bcount = be64_to_cpu(qlvb->qb_value) << sdp->sd_fsb2bb_shift; | 1512 | fdq->d_bcount = be64_to_cpu(qlvb->qb_value) << sdp->sd_fsb2bb_shift; |
@@ -1515,7 +1520,7 @@ out: | |||
1515 | /* GFS2 only supports a subset of the XFS fields */ | 1520 | /* GFS2 only supports a subset of the XFS fields */ |
1516 | #define GFS2_FIELDMASK (FS_DQ_BSOFT|FS_DQ_BHARD|FS_DQ_BCOUNT) | 1521 | #define GFS2_FIELDMASK (FS_DQ_BSOFT|FS_DQ_BHARD|FS_DQ_BCOUNT) |
1517 | 1522 | ||
1518 | static int gfs2_set_dqblk(struct super_block *sb, int type, qid_t id, | 1523 | static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid, |
1519 | struct fs_disk_quota *fdq) | 1524 | struct fs_disk_quota *fdq) |
1520 | { | 1525 | { |
1521 | struct gfs2_sbd *sdp = sb->s_fs_info; | 1526 | struct gfs2_sbd *sdp = sb->s_fs_info; |
@@ -1527,11 +1532,12 @@ static int gfs2_set_dqblk(struct super_block *sb, int type, qid_t id, | |||
1527 | int alloc_required; | 1532 | int alloc_required; |
1528 | loff_t offset; | 1533 | loff_t offset; |
1529 | int error; | 1534 | int error; |
1535 | int type; | ||
1530 | 1536 | ||
1531 | if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF) | 1537 | if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF) |
1532 | return -ESRCH; /* Crazy XFS error code */ | 1538 | return -ESRCH; /* Crazy XFS error code */ |
1533 | 1539 | ||
1534 | switch(type) { | 1540 | switch(qid.type) { |
1535 | case USRQUOTA: | 1541 | case USRQUOTA: |
1536 | type = QUOTA_USER; | 1542 | type = QUOTA_USER; |
1537 | if (fdq->d_flags != FS_USER_QUOTA) | 1543 | if (fdq->d_flags != FS_USER_QUOTA) |
@@ -1548,10 +1554,10 @@ static int gfs2_set_dqblk(struct super_block *sb, int type, qid_t id, | |||
1548 | 1554 | ||
1549 | if (fdq->d_fieldmask & ~GFS2_FIELDMASK) | 1555 | if (fdq->d_fieldmask & ~GFS2_FIELDMASK) |
1550 | return -EINVAL; | 1556 | return -EINVAL; |
1551 | if (fdq->d_id != id) | 1557 | if (fdq->d_id != from_kqid(&init_user_ns, qid)) |
1552 | return -EINVAL; | 1558 | return -EINVAL; |
1553 | 1559 | ||
1554 | error = qd_get(sdp, type, id, &qd); | 1560 | error = qd_get(sdp, type, from_kqid(&init_user_ns, qid), &qd); |
1555 | if (error) | 1561 | if (error) |
1556 | return error; | 1562 | return error; |
1557 | 1563 | ||