diff options
Diffstat (limited to 'fs/gfs2/quota.c')
-rw-r--r-- | fs/gfs2/quota.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 5fb5a5305e0e..69e8f4e92e57 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c | |||
@@ -56,6 +56,7 @@ | |||
56 | #include "rgrp.h" | 56 | #include "rgrp.h" |
57 | #include "super.h" | 57 | #include "super.h" |
58 | #include "trans.h" | 58 | #include "trans.h" |
59 | #include "ops_file.h" | ||
59 | 60 | ||
60 | #define QUOTA_USER 1 | 61 | #define QUOTA_USER 1 |
61 | #define QUOTA_GROUP 0 | 62 | #define QUOTA_GROUP 0 |
@@ -241,7 +242,7 @@ static void slot_put(struct gfs2_quota_data *qd) | |||
241 | static int bh_get(struct gfs2_quota_data *qd) | 242 | static int bh_get(struct gfs2_quota_data *qd) |
242 | { | 243 | { |
243 | struct gfs2_sbd *sdp = qd->qd_gl->gl_sbd; | 244 | struct gfs2_sbd *sdp = qd->qd_gl->gl_sbd; |
244 | struct gfs2_inode *ip = sdp->sd_qc_inode; | 245 | struct gfs2_inode *ip = get_v2ip(sdp->sd_qc_inode); |
245 | unsigned int block, offset; | 246 | unsigned int block, offset; |
246 | uint64_t dblock; | 247 | uint64_t dblock; |
247 | int new = 0; | 248 | int new = 0; |
@@ -522,7 +523,7 @@ static int sort_qd(const void *a, const void *b) | |||
522 | static void do_qc(struct gfs2_quota_data *qd, int64_t change) | 523 | static void do_qc(struct gfs2_quota_data *qd, int64_t change) |
523 | { | 524 | { |
524 | struct gfs2_sbd *sdp = qd->qd_gl->gl_sbd; | 525 | struct gfs2_sbd *sdp = qd->qd_gl->gl_sbd; |
525 | struct gfs2_inode *ip = sdp->sd_qc_inode; | 526 | struct gfs2_inode *ip = get_v2ip(sdp->sd_qc_inode); |
526 | struct gfs2_quota_change *qc = qd->qd_bh_qc; | 527 | struct gfs2_quota_change *qc = qd->qd_bh_qc; |
527 | int64_t x; | 528 | int64_t x; |
528 | 529 | ||
@@ -563,12 +564,13 @@ static void do_qc(struct gfs2_quota_data *qd, int64_t change) | |||
563 | static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda) | 564 | static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda) |
564 | { | 565 | { |
565 | struct gfs2_sbd *sdp = (*qda)->qd_gl->gl_sbd; | 566 | struct gfs2_sbd *sdp = (*qda)->qd_gl->gl_sbd; |
566 | struct gfs2_inode *ip = sdp->sd_quota_inode; | 567 | struct gfs2_inode *ip = get_v2ip(sdp->sd_quota_inode); |
567 | unsigned int data_blocks, ind_blocks; | 568 | unsigned int data_blocks, ind_blocks; |
569 | struct file_ra_state ra_state; | ||
568 | struct gfs2_holder *ghs, i_gh; | 570 | struct gfs2_holder *ghs, i_gh; |
569 | unsigned int qx, x; | 571 | unsigned int qx, x; |
570 | struct gfs2_quota_data *qd; | 572 | struct gfs2_quota_data *qd; |
571 | uint64_t offset; | 573 | loff_t offset; |
572 | unsigned int nalloc = 0; | 574 | unsigned int nalloc = 0; |
573 | struct gfs2_alloc *al = NULL; | 575 | struct gfs2_alloc *al = NULL; |
574 | int error; | 576 | int error; |
@@ -631,6 +633,7 @@ static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda) | |||
631 | goto out_gunlock; | 633 | goto out_gunlock; |
632 | } | 634 | } |
633 | 635 | ||
636 | file_ra_state_init(&ra_state, ip->i_vnode->i_mapping); | ||
634 | for (x = 0; x < num_qd; x++) { | 637 | for (x = 0; x < num_qd; x++) { |
635 | char buf[sizeof(struct gfs2_quota)]; | 638 | char buf[sizeof(struct gfs2_quota)]; |
636 | struct gfs2_quota q; | 639 | struct gfs2_quota q; |
@@ -642,7 +645,7 @@ static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda) | |||
642 | sizeof(struct gfs2_quota) bytes. */ | 645 | sizeof(struct gfs2_quota) bytes. */ |
643 | memset(buf, 0, sizeof(struct gfs2_quota)); | 646 | memset(buf, 0, sizeof(struct gfs2_quota)); |
644 | 647 | ||
645 | error = gfs2_jdata_read_mem(ip, buf, offset, | 648 | error = gfs2_internal_read(ip, &ra_state, buf, &offset, |
646 | sizeof(struct gfs2_quota)); | 649 | sizeof(struct gfs2_quota)); |
647 | if (error < 0) | 650 | if (error < 0) |
648 | goto out_end_trans; | 651 | goto out_end_trans; |
@@ -703,8 +706,10 @@ static int do_glock(struct gfs2_quota_data *qd, int force_refresh, | |||
703 | struct gfs2_holder i_gh; | 706 | struct gfs2_holder i_gh; |
704 | struct gfs2_quota q; | 707 | struct gfs2_quota q; |
705 | char buf[sizeof(struct gfs2_quota)]; | 708 | char buf[sizeof(struct gfs2_quota)]; |
709 | struct file_ra_state ra_state; | ||
706 | int error; | 710 | int error; |
707 | 711 | ||
712 | file_ra_state_init(&ra_state, sdp->sd_quota_inode->i_mapping); | ||
708 | restart: | 713 | restart: |
709 | error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_SHARED, 0, q_gh); | 714 | error = gfs2_glock_nq_init(qd->qd_gl, LM_ST_SHARED, 0, q_gh); |
710 | if (error) | 715 | if (error) |
@@ -713,6 +718,7 @@ static int do_glock(struct gfs2_quota_data *qd, int force_refresh, | |||
713 | gfs2_quota_lvb_in(&qd->qd_qb, qd->qd_gl->gl_lvb); | 718 | gfs2_quota_lvb_in(&qd->qd_qb, qd->qd_gl->gl_lvb); |
714 | 719 | ||
715 | if (force_refresh || qd->qd_qb.qb_magic != GFS2_MAGIC) { | 720 | if (force_refresh || qd->qd_qb.qb_magic != GFS2_MAGIC) { |
721 | loff_t pos; | ||
716 | gfs2_glock_dq_uninit(q_gh); | 722 | gfs2_glock_dq_uninit(q_gh); |
717 | error = gfs2_glock_nq_init(qd->qd_gl, | 723 | error = gfs2_glock_nq_init(qd->qd_gl, |
718 | LM_ST_EXCLUSIVE, GL_NOCACHE, | 724 | LM_ST_EXCLUSIVE, GL_NOCACHE, |
@@ -720,16 +726,17 @@ static int do_glock(struct gfs2_quota_data *qd, int force_refresh, | |||
720 | if (error) | 726 | if (error) |
721 | return error; | 727 | return error; |
722 | 728 | ||
723 | error = gfs2_glock_nq_init(sdp->sd_quota_inode->i_gl, | 729 | error = gfs2_glock_nq_init(get_v2ip(sdp->sd_quota_inode)->i_gl, |
724 | LM_ST_SHARED, 0, | 730 | LM_ST_SHARED, 0, |
725 | &i_gh); | 731 | &i_gh); |
726 | if (error) | 732 | if (error) |
727 | goto fail; | 733 | goto fail; |
728 | 734 | ||
729 | memset(buf, 0, sizeof(struct gfs2_quota)); | 735 | memset(buf, 0, sizeof(struct gfs2_quota)); |
730 | 736 | pos = qd2offset(qd); | |
731 | error = gfs2_jdata_read_mem(sdp->sd_quota_inode, buf, | 737 | error = gfs2_internal_read(get_v2ip(sdp->sd_quota_inode), |
732 | qd2offset(qd), | 738 | &ra_state, buf, |
739 | &pos, | ||
733 | sizeof(struct gfs2_quota)); | 740 | sizeof(struct gfs2_quota)); |
734 | if (error < 0) | 741 | if (error < 0) |
735 | goto fail_gunlock; | 742 | goto fail_gunlock; |
@@ -1059,7 +1066,7 @@ int gfs2_quota_read(struct gfs2_sbd *sdp, int user, uint32_t id, | |||
1059 | 1066 | ||
1060 | int gfs2_quota_init(struct gfs2_sbd *sdp) | 1067 | int gfs2_quota_init(struct gfs2_sbd *sdp) |
1061 | { | 1068 | { |
1062 | struct gfs2_inode *ip = sdp->sd_qc_inode; | 1069 | struct gfs2_inode *ip = get_v2ip(sdp->sd_qc_inode); |
1063 | unsigned int blocks = ip->i_di.di_size >> sdp->sd_sb.sb_bsize_shift; | 1070 | unsigned int blocks = ip->i_di.di_size >> sdp->sd_sb.sb_bsize_shift; |
1064 | unsigned int x, slot = 0; | 1071 | unsigned int x, slot = 0; |
1065 | unsigned int found = 0; | 1072 | unsigned int found = 0; |