diff options
-rw-r--r-- | fs/xfs/xfs_qm_syscalls.c | 118 |
1 files changed, 49 insertions, 69 deletions
diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 711a86e39ff0..2b85641f33c8 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c | |||
@@ -47,9 +47,6 @@ STATIC int xfs_qm_log_quotaoff_end(xfs_mount_t *, xfs_qoff_logitem_t *, | |||
47 | uint); | 47 | uint); |
48 | STATIC uint xfs_qm_export_flags(uint); | 48 | STATIC uint xfs_qm_export_flags(uint); |
49 | STATIC uint xfs_qm_export_qtype_flags(uint); | 49 | STATIC uint xfs_qm_export_qtype_flags(uint); |
50 | STATIC void xfs_qm_export_dquot(xfs_mount_t *, xfs_disk_dquot_t *, | ||
51 | fs_disk_quota_t *); | ||
52 | |||
53 | 50 | ||
54 | /* | 51 | /* |
55 | * Turn off quota accounting and/or enforcement for all udquots and/or | 52 | * Turn off quota accounting and/or enforcement for all udquots and/or |
@@ -635,42 +632,6 @@ xfs_qm_scall_setqlim( | |||
635 | return error; | 632 | return error; |
636 | } | 633 | } |
637 | 634 | ||
638 | int | ||
639 | xfs_qm_scall_getquota( | ||
640 | xfs_mount_t *mp, | ||
641 | xfs_dqid_t id, | ||
642 | uint type, | ||
643 | fs_disk_quota_t *out) | ||
644 | { | ||
645 | xfs_dquot_t *dqp; | ||
646 | int error; | ||
647 | |||
648 | /* | ||
649 | * Try to get the dquot. We don't want it allocated on disk, so | ||
650 | * we aren't passing the XFS_QMOPT_DOALLOC flag. If it doesn't | ||
651 | * exist, we'll get ENOENT back. | ||
652 | */ | ||
653 | if ((error = xfs_qm_dqget(mp, NULL, id, type, 0, &dqp))) { | ||
654 | return (error); | ||
655 | } | ||
656 | |||
657 | /* | ||
658 | * If everything's NULL, this dquot doesn't quite exist as far as | ||
659 | * our utility programs are concerned. | ||
660 | */ | ||
661 | if (XFS_IS_DQUOT_UNINITIALIZED(dqp)) { | ||
662 | xfs_qm_dqput(dqp); | ||
663 | return XFS_ERROR(ENOENT); | ||
664 | } | ||
665 | /* | ||
666 | * Convert the disk dquot to the exportable format | ||
667 | */ | ||
668 | xfs_qm_export_dquot(mp, &dqp->q_core, out); | ||
669 | xfs_qm_dqput(dqp); | ||
670 | return (error ? XFS_ERROR(EFAULT) : 0); | ||
671 | } | ||
672 | |||
673 | |||
674 | STATIC int | 635 | STATIC int |
675 | xfs_qm_log_quotaoff_end( | 636 | xfs_qm_log_quotaoff_end( |
676 | xfs_mount_t *mp, | 637 | xfs_mount_t *mp, |
@@ -759,50 +720,66 @@ error0: | |||
759 | } | 720 | } |
760 | 721 | ||
761 | 722 | ||
762 | /* | 723 | int |
763 | * Translate an internal style on-disk-dquot to the exportable format. | 724 | xfs_qm_scall_getquota( |
764 | * The main differences are that the counters/limits are all in Basic | 725 | struct xfs_mount *mp, |
765 | * Blocks (BBs) instead of the internal FSBs, and all on-disk data has | 726 | xfs_dqid_t id, |
766 | * to be converted to the native endianness. | 727 | uint type, |
767 | */ | ||
768 | STATIC void | ||
769 | xfs_qm_export_dquot( | ||
770 | xfs_mount_t *mp, | ||
771 | xfs_disk_dquot_t *src, | ||
772 | struct fs_disk_quota *dst) | 728 | struct fs_disk_quota *dst) |
773 | { | 729 | { |
730 | struct xfs_dquot *dqp; | ||
731 | int error; | ||
732 | |||
733 | /* | ||
734 | * Try to get the dquot. We don't want it allocated on disk, so | ||
735 | * we aren't passing the XFS_QMOPT_DOALLOC flag. If it doesn't | ||
736 | * exist, we'll get ENOENT back. | ||
737 | */ | ||
738 | error = xfs_qm_dqget(mp, NULL, id, type, 0, &dqp); | ||
739 | if (error) | ||
740 | return error; | ||
741 | |||
742 | /* | ||
743 | * If everything's NULL, this dquot doesn't quite exist as far as | ||
744 | * our utility programs are concerned. | ||
745 | */ | ||
746 | if (XFS_IS_DQUOT_UNINITIALIZED(dqp)) { | ||
747 | error = XFS_ERROR(ENOENT); | ||
748 | goto out_put; | ||
749 | } | ||
750 | |||
774 | memset(dst, 0, sizeof(*dst)); | 751 | memset(dst, 0, sizeof(*dst)); |
775 | dst->d_version = FS_DQUOT_VERSION; /* different from src->d_version */ | 752 | dst->d_version = FS_DQUOT_VERSION; |
776 | dst->d_flags = xfs_qm_export_qtype_flags(src->d_flags); | 753 | dst->d_flags = xfs_qm_export_qtype_flags(dqp->q_core.d_flags); |
777 | dst->d_id = be32_to_cpu(src->d_id); | 754 | dst->d_id = be32_to_cpu(dqp->q_core.d_id); |
778 | dst->d_blk_hardlimit = | 755 | dst->d_blk_hardlimit = |
779 | XFS_FSB_TO_BB(mp, be64_to_cpu(src->d_blk_hardlimit)); | 756 | XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit)); |
780 | dst->d_blk_softlimit = | 757 | dst->d_blk_softlimit = |
781 | XFS_FSB_TO_BB(mp, be64_to_cpu(src->d_blk_softlimit)); | 758 | XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_blk_softlimit)); |
782 | dst->d_ino_hardlimit = be64_to_cpu(src->d_ino_hardlimit); | 759 | dst->d_ino_hardlimit = be64_to_cpu(dqp->q_core.d_ino_hardlimit); |
783 | dst->d_ino_softlimit = be64_to_cpu(src->d_ino_softlimit); | 760 | dst->d_ino_softlimit = be64_to_cpu(dqp->q_core.d_ino_softlimit); |
784 | dst->d_bcount = XFS_FSB_TO_BB(mp, be64_to_cpu(src->d_bcount)); | 761 | dst->d_bcount = XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_bcount)); |
785 | dst->d_icount = be64_to_cpu(src->d_icount); | 762 | dst->d_icount = be64_to_cpu(dqp->q_core.d_icount); |
786 | dst->d_btimer = be32_to_cpu(src->d_btimer); | 763 | dst->d_btimer = be32_to_cpu(dqp->q_core.d_btimer); |
787 | dst->d_itimer = be32_to_cpu(src->d_itimer); | 764 | dst->d_itimer = be32_to_cpu(dqp->q_core.d_itimer); |
788 | dst->d_iwarns = be16_to_cpu(src->d_iwarns); | 765 | dst->d_iwarns = be16_to_cpu(dqp->q_core.d_iwarns); |
789 | dst->d_bwarns = be16_to_cpu(src->d_bwarns); | 766 | dst->d_bwarns = be16_to_cpu(dqp->q_core.d_bwarns); |
790 | dst->d_rtb_hardlimit = | 767 | dst->d_rtb_hardlimit = |
791 | XFS_FSB_TO_BB(mp, be64_to_cpu(src->d_rtb_hardlimit)); | 768 | XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_rtb_hardlimit)); |
792 | dst->d_rtb_softlimit = | 769 | dst->d_rtb_softlimit = |
793 | XFS_FSB_TO_BB(mp, be64_to_cpu(src->d_rtb_softlimit)); | 770 | XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_rtb_softlimit)); |
794 | dst->d_rtbcount = XFS_FSB_TO_BB(mp, be64_to_cpu(src->d_rtbcount)); | 771 | dst->d_rtbcount = XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_rtbcount)); |
795 | dst->d_rtbtimer = be32_to_cpu(src->d_rtbtimer); | 772 | dst->d_rtbtimer = be32_to_cpu(dqp->q_core.d_rtbtimer); |
796 | dst->d_rtbwarns = be16_to_cpu(src->d_rtbwarns); | 773 | dst->d_rtbwarns = be16_to_cpu(dqp->q_core.d_rtbwarns); |
797 | 774 | ||
798 | /* | 775 | /* |
799 | * Internally, we don't reset all the timers when quota enforcement | 776 | * Internally, we don't reset all the timers when quota enforcement |
800 | * gets turned off. No need to confuse the user level code, | 777 | * gets turned off. No need to confuse the user level code, |
801 | * so return zeroes in that case. | 778 | * so return zeroes in that case. |
802 | */ | 779 | */ |
803 | if ((!XFS_IS_UQUOTA_ENFORCED(mp) && src->d_flags == XFS_DQ_USER) || | 780 | if ((!XFS_IS_UQUOTA_ENFORCED(mp) && dqp->q_core.d_flags == XFS_DQ_USER) || |
804 | (!XFS_IS_OQUOTA_ENFORCED(mp) && | 781 | (!XFS_IS_OQUOTA_ENFORCED(mp) && |
805 | (src->d_flags & (XFS_DQ_PROJ | XFS_DQ_GROUP)))) { | 782 | (dqp->q_core.d_flags & (XFS_DQ_PROJ | XFS_DQ_GROUP)))) { |
806 | dst->d_btimer = 0; | 783 | dst->d_btimer = 0; |
807 | dst->d_itimer = 0; | 784 | dst->d_itimer = 0; |
808 | dst->d_rtbtimer = 0; | 785 | dst->d_rtbtimer = 0; |
@@ -823,6 +800,9 @@ xfs_qm_export_dquot( | |||
823 | } | 800 | } |
824 | } | 801 | } |
825 | #endif | 802 | #endif |
803 | out_put: | ||
804 | xfs_qm_dqput(dqp); | ||
805 | return error; | ||
826 | } | 806 | } |
827 | 807 | ||
828 | STATIC uint | 808 | STATIC uint |