diff options
author | Christoph Hellwig <hch@lst.de> | 2009-06-08 09:35:27 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@brick.lst.de> | 2009-06-08 09:35:27 -0400 |
commit | fe588ed32867b42e0d906db558ca92fd9f8b128e (patch) | |
tree | 4d5c6a5e34ebf1a0c2a82d3d1c08c272d5823264 /fs/xfs/quota | |
parent | 75f3cb1393133682958db6f157e1b6473e5a366b (diff) |
xfs: use generic inode iterator in xfs_qm_dqrele_all_inodes
Use xfs_inode_ag_iterator instead of opencoding the inode walk in the
quota code. Mark xfs_inode_ag_iterator and xfs_sync_inode_valid non-static
to allow using them from the quota code.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
Reviewed-by: Eric Sandeen <sandeen@sandeen.net>
Diffstat (limited to 'fs/xfs/quota')
-rw-r--r-- | fs/xfs/quota/xfs_qm_syscalls.c | 112 |
1 files changed, 31 insertions, 81 deletions
diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index c7b66f6506ce..7126f855e14b 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c | |||
@@ -847,105 +847,55 @@ xfs_qm_export_flags( | |||
847 | } | 847 | } |
848 | 848 | ||
849 | 849 | ||
850 | /* | 850 | STATIC int |
851 | * Release all the dquots on the inodes in an AG. | 851 | xfs_dqrele_inode( |
852 | */ | 852 | struct xfs_inode *ip, |
853 | STATIC void | 853 | struct xfs_perag *pag, |
854 | xfs_qm_dqrele_inodes_ag( | 854 | int flags) |
855 | xfs_mount_t *mp, | ||
856 | int ag, | ||
857 | uint flags) | ||
858 | { | 855 | { |
859 | xfs_inode_t *ip = NULL; | 856 | int error; |
860 | xfs_perag_t *pag = &mp->m_perag[ag]; | ||
861 | int first_index = 0; | ||
862 | int nr_found; | ||
863 | |||
864 | do { | ||
865 | /* | ||
866 | * use a gang lookup to find the next inode in the tree | ||
867 | * as the tree is sparse and a gang lookup walks to find | ||
868 | * the number of objects requested. | ||
869 | */ | ||
870 | read_lock(&pag->pag_ici_lock); | ||
871 | nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, | ||
872 | (void**)&ip, first_index, 1); | ||
873 | |||
874 | if (!nr_found) { | ||
875 | read_unlock(&pag->pag_ici_lock); | ||
876 | break; | ||
877 | } | ||
878 | |||
879 | /* | ||
880 | * Update the index for the next lookup. Catch overflows | ||
881 | * into the next AG range which can occur if we have inodes | ||
882 | * in the last block of the AG and we are currently | ||
883 | * pointing to the last inode. | ||
884 | */ | ||
885 | first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); | ||
886 | if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) { | ||
887 | read_unlock(&pag->pag_ici_lock); | ||
888 | break; | ||
889 | } | ||
890 | |||
891 | /* skip quota inodes */ | ||
892 | if (ip == XFS_QI_UQIP(mp) || ip == XFS_QI_GQIP(mp)) { | ||
893 | ASSERT(ip->i_udquot == NULL); | ||
894 | ASSERT(ip->i_gdquot == NULL); | ||
895 | read_unlock(&pag->pag_ici_lock); | ||
896 | continue; | ||
897 | } | ||
898 | 857 | ||
899 | /* | 858 | /* skip quota inodes */ |
900 | * If we can't get a reference on the inode, it must be | 859 | if (ip == XFS_QI_UQIP(ip->i_mount) || ip == XFS_QI_GQIP(ip->i_mount)) { |
901 | * in reclaim. Leave it for the reclaim code to flush. | 860 | ASSERT(ip->i_udquot == NULL); |
902 | */ | 861 | ASSERT(ip->i_gdquot == NULL); |
903 | if (!igrab(VFS_I(ip))) { | ||
904 | read_unlock(&pag->pag_ici_lock); | ||
905 | continue; | ||
906 | } | ||
907 | read_unlock(&pag->pag_ici_lock); | 862 | read_unlock(&pag->pag_ici_lock); |
863 | return 0; | ||
864 | } | ||
908 | 865 | ||
909 | /* avoid new inodes though we shouldn't find any here */ | 866 | error = xfs_sync_inode_valid(ip, pag); |
910 | if (xfs_iflags_test(ip, XFS_INEW)) { | 867 | if (error) |
911 | IRELE(ip); | 868 | return error; |
912 | continue; | ||
913 | } | ||
914 | 869 | ||
915 | xfs_ilock(ip, XFS_ILOCK_EXCL); | 870 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
916 | if ((flags & XFS_UQUOTA_ACCT) && ip->i_udquot) { | 871 | if ((flags & XFS_UQUOTA_ACCT) && ip->i_udquot) { |
917 | xfs_qm_dqrele(ip->i_udquot); | 872 | xfs_qm_dqrele(ip->i_udquot); |
918 | ip->i_udquot = NULL; | 873 | ip->i_udquot = NULL; |
919 | } | 874 | } |
920 | if (flags & (XFS_PQUOTA_ACCT|XFS_GQUOTA_ACCT) && | 875 | if (flags & (XFS_PQUOTA_ACCT|XFS_GQUOTA_ACCT) && ip->i_gdquot) { |
921 | ip->i_gdquot) { | 876 | xfs_qm_dqrele(ip->i_gdquot); |
922 | xfs_qm_dqrele(ip->i_gdquot); | 877 | ip->i_gdquot = NULL; |
923 | ip->i_gdquot = NULL; | 878 | } |
924 | } | 879 | xfs_iput(ip, XFS_ILOCK_EXCL); |
925 | xfs_iput(ip, XFS_ILOCK_EXCL); | 880 | IRELE(ip); |
926 | 881 | ||
927 | } while (nr_found); | 882 | return 0; |
928 | } | 883 | } |
929 | 884 | ||
885 | |||
930 | /* | 886 | /* |
931 | * Go thru all the inodes in the file system, releasing their dquots. | 887 | * Go thru all the inodes in the file system, releasing their dquots. |
888 | * | ||
932 | * Note that the mount structure gets modified to indicate that quotas are off | 889 | * Note that the mount structure gets modified to indicate that quotas are off |
933 | * AFTER this, in the case of quotaoff. This also gets called from | 890 | * AFTER this, in the case of quotaoff. |
934 | * xfs_rootumount. | ||
935 | */ | 891 | */ |
936 | void | 892 | void |
937 | xfs_qm_dqrele_all_inodes( | 893 | xfs_qm_dqrele_all_inodes( |
938 | struct xfs_mount *mp, | 894 | struct xfs_mount *mp, |
939 | uint flags) | 895 | uint flags) |
940 | { | 896 | { |
941 | int i; | ||
942 | |||
943 | ASSERT(mp->m_quotainfo); | 897 | ASSERT(mp->m_quotainfo); |
944 | for (i = 0; i < mp->m_sb.sb_agcount; i++) { | 898 | xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG); |
945 | if (!mp->m_perag[i].pag_ici_init) | ||
946 | continue; | ||
947 | xfs_qm_dqrele_inodes_ag(mp, i, flags); | ||
948 | } | ||
949 | } | 899 | } |
950 | 900 | ||
951 | /*------------------------------------------------------------------------*/ | 901 | /*------------------------------------------------------------------------*/ |