diff options
Diffstat (limited to 'fs/xfs/xfs_trans.c')
-rw-r--r-- | fs/xfs/xfs_trans.c | 760 |
1 files changed, 359 insertions, 401 deletions
diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index f73e358bae8d..be578ecb4af2 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c | |||
@@ -45,23 +45,12 @@ | |||
45 | #include "xfs_trans_space.h" | 45 | #include "xfs_trans_space.h" |
46 | #include "xfs_inode_item.h" | 46 | #include "xfs_inode_item.h" |
47 | 47 | ||
48 | |||
49 | STATIC void xfs_trans_apply_sb_deltas(xfs_trans_t *); | ||
50 | STATIC uint xfs_trans_count_vecs(xfs_trans_t *); | ||
51 | STATIC void xfs_trans_fill_vecs(xfs_trans_t *, xfs_log_iovec_t *); | ||
52 | STATIC void xfs_trans_uncommit(xfs_trans_t *, uint); | ||
53 | STATIC void xfs_trans_committed(xfs_trans_t *, int); | ||
54 | STATIC void xfs_trans_chunk_committed(xfs_log_item_chunk_t *, xfs_lsn_t, int); | ||
55 | STATIC void xfs_trans_free(xfs_trans_t *); | ||
56 | |||
57 | kmem_zone_t *xfs_trans_zone; | 48 | kmem_zone_t *xfs_trans_zone; |
58 | 49 | ||
59 | |||
60 | /* | 50 | /* |
61 | * Reservation functions here avoid a huge stack in xfs_trans_init | 51 | * Reservation functions here avoid a huge stack in xfs_trans_init |
62 | * due to register overflow from temporaries in the calculations. | 52 | * due to register overflow from temporaries in the calculations. |
63 | */ | 53 | */ |
64 | |||
65 | STATIC uint | 54 | STATIC uint |
66 | xfs_calc_write_reservation(xfs_mount_t *mp) | 55 | xfs_calc_write_reservation(xfs_mount_t *mp) |
67 | { | 56 | { |
@@ -261,6 +250,19 @@ _xfs_trans_alloc( | |||
261 | } | 250 | } |
262 | 251 | ||
263 | /* | 252 | /* |
253 | * Free the transaction structure. If there is more clean up | ||
254 | * to do when the structure is freed, add it here. | ||
255 | */ | ||
256 | STATIC void | ||
257 | xfs_trans_free( | ||
258 | xfs_trans_t *tp) | ||
259 | { | ||
260 | atomic_dec(&tp->t_mountp->m_active_trans); | ||
261 | xfs_trans_free_dqinfo(tp); | ||
262 | kmem_zone_free(xfs_trans_zone, tp); | ||
263 | } | ||
264 | |||
265 | /* | ||
264 | * This is called to create a new transaction which will share the | 266 | * This is called to create a new transaction which will share the |
265 | * permanent log reservation of the given transaction. The remaining | 267 | * permanent log reservation of the given transaction. The remaining |
266 | * unused block and rt extent reservations are also inherited. This | 268 | * unused block and rt extent reservations are also inherited. This |
@@ -764,94 +766,278 @@ xfs_trans_unreserve_and_mod_sb( | |||
764 | } | 766 | } |
765 | } | 767 | } |
766 | 768 | ||
769 | /* | ||
770 | * Total up the number of log iovecs needed to commit this | ||
771 | * transaction. The transaction itself needs one for the | ||
772 | * transaction header. Ask each dirty item in turn how many | ||
773 | * it needs to get the total. | ||
774 | */ | ||
775 | static uint | ||
776 | xfs_trans_count_vecs( | ||
777 | struct xfs_trans *tp) | ||
778 | { | ||
779 | int nvecs; | ||
780 | xfs_log_item_desc_t *lidp; | ||
781 | |||
782 | nvecs = 1; | ||
783 | lidp = xfs_trans_first_item(tp); | ||
784 | ASSERT(lidp != NULL); | ||
785 | |||
786 | /* In the non-debug case we need to start bailing out if we | ||
787 | * didn't find a log_item here, return zero and let trans_commit | ||
788 | * deal with it. | ||
789 | */ | ||
790 | if (lidp == NULL) | ||
791 | return 0; | ||
792 | |||
793 | while (lidp != NULL) { | ||
794 | /* | ||
795 | * Skip items which aren't dirty in this transaction. | ||
796 | */ | ||
797 | if (!(lidp->lid_flags & XFS_LID_DIRTY)) { | ||
798 | lidp = xfs_trans_next_item(tp, lidp); | ||
799 | continue; | ||
800 | } | ||
801 | lidp->lid_size = IOP_SIZE(lidp->lid_item); | ||
802 | nvecs += lidp->lid_size; | ||
803 | lidp = xfs_trans_next_item(tp, lidp); | ||
804 | } | ||
805 | |||
806 | return nvecs; | ||
807 | } | ||
767 | 808 | ||
768 | /* | 809 | /* |
769 | * xfs_trans_commit | 810 | * Fill in the vector with pointers to data to be logged |
811 | * by this transaction. The transaction header takes | ||
812 | * the first vector, and then each dirty item takes the | ||
813 | * number of vectors it indicated it needed in xfs_trans_count_vecs(). | ||
770 | * | 814 | * |
771 | * Commit the given transaction to the log a/synchronously. | 815 | * As each item fills in the entries it needs, also pin the item |
816 | * so that it cannot be flushed out until the log write completes. | ||
817 | */ | ||
818 | static void | ||
819 | xfs_trans_fill_vecs( | ||
820 | struct xfs_trans *tp, | ||
821 | struct xfs_log_iovec *log_vector) | ||
822 | { | ||
823 | xfs_log_item_desc_t *lidp; | ||
824 | struct xfs_log_iovec *vecp; | ||
825 | uint nitems; | ||
826 | |||
827 | /* | ||
828 | * Skip over the entry for the transaction header, we'll | ||
829 | * fill that in at the end. | ||
830 | */ | ||
831 | vecp = log_vector + 1; | ||
832 | |||
833 | nitems = 0; | ||
834 | lidp = xfs_trans_first_item(tp); | ||
835 | ASSERT(lidp); | ||
836 | while (lidp) { | ||
837 | /* Skip items which aren't dirty in this transaction. */ | ||
838 | if (!(lidp->lid_flags & XFS_LID_DIRTY)) { | ||
839 | lidp = xfs_trans_next_item(tp, lidp); | ||
840 | continue; | ||
841 | } | ||
842 | |||
843 | /* | ||
844 | * The item may be marked dirty but not log anything. This can | ||
845 | * be used to get called when a transaction is committed. | ||
846 | */ | ||
847 | if (lidp->lid_size) | ||
848 | nitems++; | ||
849 | IOP_FORMAT(lidp->lid_item, vecp); | ||
850 | vecp += lidp->lid_size; | ||
851 | IOP_PIN(lidp->lid_item); | ||
852 | lidp = xfs_trans_next_item(tp, lidp); | ||
853 | } | ||
854 | |||
855 | /* | ||
856 | * Now that we've counted the number of items in this transaction, fill | ||
857 | * in the transaction header. Note that the transaction header does not | ||
858 | * have a log item. | ||
859 | */ | ||
860 | tp->t_header.th_magic = XFS_TRANS_HEADER_MAGIC; | ||
861 | tp->t_header.th_type = tp->t_type; | ||
862 | tp->t_header.th_num_items = nitems; | ||
863 | log_vector->i_addr = (xfs_caddr_t)&tp->t_header; | ||
864 | log_vector->i_len = sizeof(xfs_trans_header_t); | ||
865 | log_vector->i_type = XLOG_REG_TYPE_TRANSHDR; | ||
866 | } | ||
867 | |||
868 | /* | ||
869 | * The committed item processing consists of calling the committed routine of | ||
870 | * each logged item, updating the item's position in the AIL if necessary, and | ||
871 | * unpinning each item. If the committed routine returns -1, then do nothing | ||
872 | * further with the item because it may have been freed. | ||
772 | * | 873 | * |
773 | * XFS disk error handling mechanism is not based on a typical | 874 | * Since items are unlocked when they are copied to the incore log, it is |
774 | * transaction abort mechanism. Logically after the filesystem | 875 | * possible for two transactions to be completing and manipulating the same |
775 | * gets marked 'SHUTDOWN', we can't let any new transactions | 876 | * item simultaneously. The AIL lock will protect the lsn field of each item. |
776 | * be durable - ie. committed to disk - because some metadata might | 877 | * The value of this field can never go backwards. |
777 | * be inconsistent. In such cases, this returns an error, and the | 878 | * |
778 | * caller may assume that all locked objects joined to the transaction | 879 | * We unpin the items after repositioning them in the AIL, because otherwise |
779 | * have already been unlocked as if the commit had succeeded. | 880 | * they could be immediately flushed and we'd have to race with the flusher |
780 | * Do not reference the transaction structure after this call. | 881 | * trying to pull the item from the AIL as we add it. |
781 | */ | 882 | */ |
782 | /*ARGSUSED*/ | 883 | static void |
783 | int | 884 | xfs_trans_item_committed( |
784 | _xfs_trans_commit( | 885 | struct xfs_log_item *lip, |
785 | xfs_trans_t *tp, | 886 | xfs_lsn_t commit_lsn, |
786 | uint flags, | 887 | int aborted) |
787 | int *log_flushed) | ||
788 | { | 888 | { |
789 | xfs_log_iovec_t *log_vector; | 889 | xfs_lsn_t item_lsn; |
790 | int nvec; | 890 | struct xfs_ail *ailp; |
791 | xfs_mount_t *mp; | ||
792 | xfs_lsn_t commit_lsn; | ||
793 | /* REFERENCED */ | ||
794 | int error; | ||
795 | int log_flags; | ||
796 | int sync; | ||
797 | #define XFS_TRANS_LOGVEC_COUNT 16 | ||
798 | xfs_log_iovec_t log_vector_fast[XFS_TRANS_LOGVEC_COUNT]; | ||
799 | struct xlog_in_core *commit_iclog; | ||
800 | int shutdown; | ||
801 | 891 | ||
802 | commit_lsn = -1; | 892 | if (aborted) |
893 | lip->li_flags |= XFS_LI_ABORTED; | ||
894 | item_lsn = IOP_COMMITTED(lip, commit_lsn); | ||
895 | |||
896 | /* If the committed routine returns -1, item has been freed. */ | ||
897 | if (XFS_LSN_CMP(item_lsn, (xfs_lsn_t)-1) == 0) | ||
898 | return; | ||
803 | 899 | ||
804 | /* | 900 | /* |
805 | * Determine whether this commit is releasing a permanent | 901 | * If the returned lsn is greater than what it contained before, update |
806 | * log reservation or not. | 902 | * the location of the item in the AIL. If it is not, then do nothing. |
903 | * Items can never move backwards in the AIL. | ||
904 | * | ||
905 | * While the new lsn should usually be greater, it is possible that a | ||
906 | * later transaction completing simultaneously with an earlier one | ||
907 | * using the same item could complete first with a higher lsn. This | ||
908 | * would cause the earlier transaction to fail the test below. | ||
807 | */ | 909 | */ |
808 | if (flags & XFS_TRANS_RELEASE_LOG_RES) { | 910 | ailp = lip->li_ailp; |
809 | ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); | 911 | spin_lock(&ailp->xa_lock); |
810 | log_flags = XFS_LOG_REL_PERM_RESERV; | 912 | if (XFS_LSN_CMP(item_lsn, lip->li_lsn) > 0) { |
913 | /* | ||
914 | * This will set the item's lsn to item_lsn and update the | ||
915 | * position of the item in the AIL. | ||
916 | * | ||
917 | * xfs_trans_ail_update() drops the AIL lock. | ||
918 | */ | ||
919 | xfs_trans_ail_update(ailp, lip, item_lsn); | ||
811 | } else { | 920 | } else { |
812 | log_flags = 0; | 921 | spin_unlock(&ailp->xa_lock); |
813 | } | 922 | } |
814 | mp = tp->t_mountp; | ||
815 | 923 | ||
816 | /* | 924 | /* |
817 | * If there is nothing to be logged by the transaction, | 925 | * Now that we've repositioned the item in the AIL, unpin it so it can |
818 | * then unlock all of the items associated with the | 926 | * be flushed. Pass information about buffer stale state down from the |
819 | * transaction and free the transaction structure. | 927 | * log item flags, if anyone else stales the buffer we do not want to |
820 | * Also make sure to return any reserved blocks to | 928 | * pay any attention to it. |
821 | * the free pool. | ||
822 | */ | 929 | */ |
823 | shut_us_down: | 930 | IOP_UNPIN(lip); |
824 | shutdown = XFS_FORCED_SHUTDOWN(mp) ? EIO : 0; | 931 | } |
825 | if (!(tp->t_flags & XFS_TRANS_DIRTY) || shutdown) { | 932 | |
826 | xfs_trans_unreserve_and_mod_sb(tp); | 933 | /* Clear all the per-AG busy list items listed in this transaction */ |
934 | static void | ||
935 | xfs_trans_clear_busy_extents( | ||
936 | struct xfs_trans *tp) | ||
937 | { | ||
938 | xfs_log_busy_chunk_t *lbcp; | ||
939 | xfs_log_busy_slot_t *lbsp; | ||
940 | int i; | ||
941 | |||
942 | for (lbcp = &tp->t_busy; lbcp != NULL; lbcp = lbcp->lbc_next) { | ||
943 | i = 0; | ||
944 | for (lbsp = lbcp->lbc_busy; i < lbcp->lbc_unused; i++, lbsp++) { | ||
945 | if (XFS_LBC_ISFREE(lbcp, i)) | ||
946 | continue; | ||
947 | xfs_alloc_clear_busy(tp, lbsp->lbc_ag, lbsp->lbc_idx); | ||
948 | } | ||
949 | } | ||
950 | xfs_trans_free_busy(tp); | ||
951 | } | ||
952 | |||
953 | /* | ||
954 | * This is typically called by the LM when a transaction has been fully | ||
955 | * committed to disk. It needs to unpin the items which have | ||
956 | * been logged by the transaction and update their positions | ||
957 | * in the AIL if necessary. | ||
958 | * | ||
959 | * This also gets called when the transactions didn't get written out | ||
960 | * because of an I/O error. Abortflag & XFS_LI_ABORTED is set then. | ||
961 | */ | ||
962 | STATIC void | ||
963 | xfs_trans_committed( | ||
964 | struct xfs_trans *tp, | ||
965 | int abortflag) | ||
966 | { | ||
967 | xfs_log_item_desc_t *lidp; | ||
968 | xfs_log_item_chunk_t *licp; | ||
969 | xfs_log_item_chunk_t *next_licp; | ||
970 | |||
971 | /* Call the transaction's completion callback if there is one. */ | ||
972 | if (tp->t_callback != NULL) | ||
973 | tp->t_callback(tp, tp->t_callarg); | ||
974 | |||
975 | for (lidp = xfs_trans_first_item(tp); | ||
976 | lidp != NULL; | ||
977 | lidp = xfs_trans_next_item(tp, lidp)) { | ||
978 | xfs_trans_item_committed(lidp->lid_item, tp->t_lsn, abortflag); | ||
979 | } | ||
980 | |||
981 | /* free the item chunks, ignoring the embedded chunk */ | ||
982 | for (licp = tp->t_items.lic_next; licp != NULL; licp = next_licp) { | ||
983 | next_licp = licp->lic_next; | ||
984 | kmem_free(licp); | ||
985 | } | ||
986 | |||
987 | xfs_trans_clear_busy_extents(tp); | ||
988 | xfs_trans_free(tp); | ||
989 | } | ||
990 | |||
991 | /* | ||
992 | * Called from the trans_commit code when we notice that | ||
993 | * the filesystem is in the middle of a forced shutdown. | ||
994 | */ | ||
995 | STATIC void | ||
996 | xfs_trans_uncommit( | ||
997 | struct xfs_trans *tp, | ||
998 | uint flags) | ||
999 | { | ||
1000 | xfs_log_item_desc_t *lidp; | ||
1001 | |||
1002 | for (lidp = xfs_trans_first_item(tp); | ||
1003 | lidp != NULL; | ||
1004 | lidp = xfs_trans_next_item(tp, lidp)) { | ||
827 | /* | 1005 | /* |
828 | * It is indeed possible for the transaction to be | 1006 | * Unpin all but those that aren't dirty. |
829 | * not dirty but the dqinfo portion to be. All that | ||
830 | * means is that we have some (non-persistent) quota | ||
831 | * reservations that need to be unreserved. | ||
832 | */ | 1007 | */ |
833 | xfs_trans_unreserve_and_mod_dquots(tp); | 1008 | if (lidp->lid_flags & XFS_LID_DIRTY) |
834 | if (tp->t_ticket) { | 1009 | IOP_UNPIN_REMOVE(lidp->lid_item, tp); |
835 | commit_lsn = xfs_log_done(mp, tp->t_ticket, | ||
836 | NULL, log_flags); | ||
837 | if (commit_lsn == -1 && !shutdown) | ||
838 | shutdown = XFS_ERROR(EIO); | ||
839 | } | ||
840 | current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); | ||
841 | xfs_trans_free_items(tp, shutdown? XFS_TRANS_ABORT : 0); | ||
842 | xfs_trans_free_busy(tp); | ||
843 | xfs_trans_free(tp); | ||
844 | XFS_STATS_INC(xs_trans_empty); | ||
845 | return (shutdown); | ||
846 | } | 1010 | } |
847 | ASSERT(tp->t_ticket != NULL); | ||
848 | 1011 | ||
849 | /* | 1012 | xfs_trans_unreserve_and_mod_sb(tp); |
850 | * If we need to update the superblock, then do it now. | 1013 | xfs_trans_unreserve_and_mod_dquots(tp); |
851 | */ | 1014 | |
852 | if (tp->t_flags & XFS_TRANS_SB_DIRTY) | 1015 | xfs_trans_free_items(tp, flags); |
853 | xfs_trans_apply_sb_deltas(tp); | 1016 | xfs_trans_free_busy(tp); |
854 | xfs_trans_apply_dquot_deltas(tp); | 1017 | xfs_trans_free(tp); |
1018 | } | ||
1019 | |||
1020 | /* | ||
1021 | * Format the transaction direct to the iclog. This isolates the physical | ||
1022 | * transaction commit operation from the logical operation and hence allows | ||
1023 | * other methods to be introduced without affecting the existing commit path. | ||
1024 | */ | ||
1025 | static int | ||
1026 | xfs_trans_commit_iclog( | ||
1027 | struct xfs_mount *mp, | ||
1028 | struct xfs_trans *tp, | ||
1029 | xfs_lsn_t *commit_lsn, | ||
1030 | int flags) | ||
1031 | { | ||
1032 | int shutdown; | ||
1033 | int error; | ||
1034 | int log_flags = 0; | ||
1035 | struct xlog_in_core *commit_iclog; | ||
1036 | #define XFS_TRANS_LOGVEC_COUNT 16 | ||
1037 | struct xfs_log_iovec log_vector_fast[XFS_TRANS_LOGVEC_COUNT]; | ||
1038 | struct xfs_log_iovec *log_vector; | ||
1039 | uint nvec; | ||
1040 | |||
855 | 1041 | ||
856 | /* | 1042 | /* |
857 | * Ask each log item how many log_vector entries it will | 1043 | * Ask each log item how many log_vector entries it will |
@@ -861,8 +1047,7 @@ shut_us_down: | |||
861 | */ | 1047 | */ |
862 | nvec = xfs_trans_count_vecs(tp); | 1048 | nvec = xfs_trans_count_vecs(tp); |
863 | if (nvec == 0) { | 1049 | if (nvec == 0) { |
864 | xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); | 1050 | return ENOMEM; /* triggers a shutdown! */ |
865 | goto shut_us_down; | ||
866 | } else if (nvec <= XFS_TRANS_LOGVEC_COUNT) { | 1051 | } else if (nvec <= XFS_TRANS_LOGVEC_COUNT) { |
867 | log_vector = log_vector_fast; | 1052 | log_vector = log_vector_fast; |
868 | } else { | 1053 | } else { |
@@ -877,6 +1062,9 @@ shut_us_down: | |||
877 | */ | 1062 | */ |
878 | xfs_trans_fill_vecs(tp, log_vector); | 1063 | xfs_trans_fill_vecs(tp, log_vector); |
879 | 1064 | ||
1065 | if (flags & XFS_TRANS_RELEASE_LOG_RES) | ||
1066 | log_flags = XFS_LOG_REL_PERM_RESERV; | ||
1067 | |||
880 | error = xfs_log_write(mp, log_vector, nvec, tp->t_ticket, &(tp->t_lsn)); | 1068 | error = xfs_log_write(mp, log_vector, nvec, tp->t_ticket, &(tp->t_lsn)); |
881 | 1069 | ||
882 | /* | 1070 | /* |
@@ -884,18 +1072,17 @@ shut_us_down: | |||
884 | * at any time after this call. However, all the items associated | 1072 | * at any time after this call. However, all the items associated |
885 | * with the transaction are still locked and pinned in memory. | 1073 | * with the transaction are still locked and pinned in memory. |
886 | */ | 1074 | */ |
887 | commit_lsn = xfs_log_done(mp, tp->t_ticket, &commit_iclog, log_flags); | 1075 | *commit_lsn = xfs_log_done(mp, tp->t_ticket, &commit_iclog, log_flags); |
888 | 1076 | ||
889 | tp->t_commit_lsn = commit_lsn; | 1077 | tp->t_commit_lsn = *commit_lsn; |
890 | if (nvec > XFS_TRANS_LOGVEC_COUNT) { | 1078 | if (nvec > XFS_TRANS_LOGVEC_COUNT) |
891 | kmem_free(log_vector); | 1079 | kmem_free(log_vector); |
892 | } | ||
893 | 1080 | ||
894 | /* | 1081 | /* |
895 | * If we got a log write error. Unpin the logitems that we | 1082 | * If we got a log write error. Unpin the logitems that we |
896 | * had pinned, clean up, free trans structure, and return error. | 1083 | * had pinned, clean up, free trans structure, and return error. |
897 | */ | 1084 | */ |
898 | if (error || commit_lsn == -1) { | 1085 | if (error || *commit_lsn == -1) { |
899 | current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); | 1086 | current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); |
900 | xfs_trans_uncommit(tp, flags|XFS_TRANS_ABORT); | 1087 | xfs_trans_uncommit(tp, flags|XFS_TRANS_ABORT); |
901 | return XFS_ERROR(EIO); | 1088 | return XFS_ERROR(EIO); |
@@ -909,8 +1096,6 @@ shut_us_down: | |||
909 | */ | 1096 | */ |
910 | xfs_trans_unreserve_and_mod_sb(tp); | 1097 | xfs_trans_unreserve_and_mod_sb(tp); |
911 | 1098 | ||
912 | sync = tp->t_flags & XFS_TRANS_SYNC; | ||
913 | |||
914 | /* | 1099 | /* |
915 | * Tell the LM to call the transaction completion routine | 1100 | * Tell the LM to call the transaction completion routine |
916 | * when the log write with LSN commit_lsn completes (e.g. | 1101 | * when the log write with LSN commit_lsn completes (e.g. |
@@ -953,7 +1138,7 @@ shut_us_down: | |||
953 | * the commit lsn of this transaction for dependency tracking | 1138 | * the commit lsn of this transaction for dependency tracking |
954 | * purposes. | 1139 | * purposes. |
955 | */ | 1140 | */ |
956 | xfs_trans_unlock_items(tp, commit_lsn); | 1141 | xfs_trans_unlock_items(tp, *commit_lsn); |
957 | 1142 | ||
958 | /* | 1143 | /* |
959 | * If we detected a log error earlier, finish committing | 1144 | * If we detected a log error earlier, finish committing |
@@ -973,156 +1158,114 @@ shut_us_down: | |||
973 | * and the items are released we can finally allow the iclog to | 1158 | * and the items are released we can finally allow the iclog to |
974 | * go to disk. | 1159 | * go to disk. |
975 | */ | 1160 | */ |
976 | error = xfs_log_release_iclog(mp, commit_iclog); | 1161 | return xfs_log_release_iclog(mp, commit_iclog); |
977 | |||
978 | /* | ||
979 | * If the transaction needs to be synchronous, then force the | ||
980 | * log out now and wait for it. | ||
981 | */ | ||
982 | if (sync) { | ||
983 | if (!error) { | ||
984 | error = _xfs_log_force_lsn(mp, commit_lsn, | ||
985 | XFS_LOG_SYNC, log_flushed); | ||
986 | } | ||
987 | XFS_STATS_INC(xs_trans_sync); | ||
988 | } else { | ||
989 | XFS_STATS_INC(xs_trans_async); | ||
990 | } | ||
991 | |||
992 | return (error); | ||
993 | } | 1162 | } |
994 | 1163 | ||
995 | 1164 | ||
996 | /* | 1165 | /* |
997 | * Total up the number of log iovecs needed to commit this | 1166 | * xfs_trans_commit |
998 | * transaction. The transaction itself needs one for the | 1167 | * |
999 | * transaction header. Ask each dirty item in turn how many | 1168 | * Commit the given transaction to the log a/synchronously. |
1000 | * it needs to get the total. | 1169 | * |
1170 | * XFS disk error handling mechanism is not based on a typical | ||
1171 | * transaction abort mechanism. Logically after the filesystem | ||
1172 | * gets marked 'SHUTDOWN', we can't let any new transactions | ||
1173 | * be durable - ie. committed to disk - because some metadata might | ||
1174 | * be inconsistent. In such cases, this returns an error, and the | ||
1175 | * caller may assume that all locked objects joined to the transaction | ||
1176 | * have already been unlocked as if the commit had succeeded. | ||
1177 | * Do not reference the transaction structure after this call. | ||
1001 | */ | 1178 | */ |
1002 | STATIC uint | 1179 | int |
1003 | xfs_trans_count_vecs( | 1180 | _xfs_trans_commit( |
1004 | xfs_trans_t *tp) | 1181 | struct xfs_trans *tp, |
1182 | uint flags, | ||
1183 | int *log_flushed) | ||
1005 | { | 1184 | { |
1006 | int nvecs; | 1185 | struct xfs_mount *mp = tp->t_mountp; |
1007 | xfs_log_item_desc_t *lidp; | 1186 | xfs_lsn_t commit_lsn = -1; |
1187 | int error = 0; | ||
1188 | int log_flags = 0; | ||
1189 | int sync = tp->t_flags & XFS_TRANS_SYNC; | ||
1008 | 1190 | ||
1009 | nvecs = 1; | 1191 | /* |
1010 | lidp = xfs_trans_first_item(tp); | 1192 | * Determine whether this commit is releasing a permanent |
1011 | ASSERT(lidp != NULL); | 1193 | * log reservation or not. |
1012 | |||
1013 | /* In the non-debug case we need to start bailing out if we | ||
1014 | * didn't find a log_item here, return zero and let trans_commit | ||
1015 | * deal with it. | ||
1016 | */ | 1194 | */ |
1017 | if (lidp == NULL) | 1195 | if (flags & XFS_TRANS_RELEASE_LOG_RES) { |
1018 | return 0; | 1196 | ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); |
1019 | 1197 | log_flags = XFS_LOG_REL_PERM_RESERV; | |
1020 | while (lidp != NULL) { | ||
1021 | /* | ||
1022 | * Skip items which aren't dirty in this transaction. | ||
1023 | */ | ||
1024 | if (!(lidp->lid_flags & XFS_LID_DIRTY)) { | ||
1025 | lidp = xfs_trans_next_item(tp, lidp); | ||
1026 | continue; | ||
1027 | } | ||
1028 | lidp->lid_size = IOP_SIZE(lidp->lid_item); | ||
1029 | nvecs += lidp->lid_size; | ||
1030 | lidp = xfs_trans_next_item(tp, lidp); | ||
1031 | } | 1198 | } |
1032 | 1199 | ||
1033 | return nvecs; | 1200 | /* |
1034 | } | 1201 | * If there is nothing to be logged by the transaction, |
1035 | 1202 | * then unlock all of the items associated with the | |
1036 | /* | 1203 | * transaction and free the transaction structure. |
1037 | * Called from the trans_commit code when we notice that | 1204 | * Also make sure to return any reserved blocks to |
1038 | * the filesystem is in the middle of a forced shutdown. | 1205 | * the free pool. |
1039 | */ | 1206 | */ |
1040 | STATIC void | 1207 | if (!(tp->t_flags & XFS_TRANS_DIRTY)) |
1041 | xfs_trans_uncommit( | 1208 | goto out_unreserve; |
1042 | xfs_trans_t *tp, | ||
1043 | uint flags) | ||
1044 | { | ||
1045 | xfs_log_item_desc_t *lidp; | ||
1046 | 1209 | ||
1047 | for (lidp = xfs_trans_first_item(tp); | 1210 | if (XFS_FORCED_SHUTDOWN(mp)) { |
1048 | lidp != NULL; | 1211 | error = XFS_ERROR(EIO); |
1049 | lidp = xfs_trans_next_item(tp, lidp)) { | 1212 | goto out_unreserve; |
1050 | /* | ||
1051 | * Unpin all but those that aren't dirty. | ||
1052 | */ | ||
1053 | if (lidp->lid_flags & XFS_LID_DIRTY) | ||
1054 | IOP_UNPIN_REMOVE(lidp->lid_item, tp); | ||
1055 | } | 1213 | } |
1056 | 1214 | ||
1057 | xfs_trans_unreserve_and_mod_sb(tp); | 1215 | ASSERT(tp->t_ticket != NULL); |
1058 | xfs_trans_unreserve_and_mod_dquots(tp); | ||
1059 | 1216 | ||
1060 | xfs_trans_free_items(tp, flags); | 1217 | /* |
1061 | xfs_trans_free_busy(tp); | 1218 | * If we need to update the superblock, then do it now. |
1062 | xfs_trans_free(tp); | 1219 | */ |
1063 | } | 1220 | if (tp->t_flags & XFS_TRANS_SB_DIRTY) |
1221 | xfs_trans_apply_sb_deltas(tp); | ||
1222 | xfs_trans_apply_dquot_deltas(tp); | ||
1064 | 1223 | ||
1065 | /* | 1224 | error = xfs_trans_commit_iclog(mp, tp, &commit_lsn, flags); |
1066 | * Fill in the vector with pointers to data to be logged | 1225 | if (error == ENOMEM) { |
1067 | * by this transaction. The transaction header takes | 1226 | xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); |
1068 | * the first vector, and then each dirty item takes the | 1227 | error = XFS_ERROR(EIO); |
1069 | * number of vectors it indicated it needed in xfs_trans_count_vecs(). | 1228 | goto out_unreserve; |
1070 | * | 1229 | } |
1071 | * As each item fills in the entries it needs, also pin the item | ||
1072 | * so that it cannot be flushed out until the log write completes. | ||
1073 | */ | ||
1074 | STATIC void | ||
1075 | xfs_trans_fill_vecs( | ||
1076 | xfs_trans_t *tp, | ||
1077 | xfs_log_iovec_t *log_vector) | ||
1078 | { | ||
1079 | xfs_log_item_desc_t *lidp; | ||
1080 | xfs_log_iovec_t *vecp; | ||
1081 | uint nitems; | ||
1082 | 1230 | ||
1083 | /* | 1231 | /* |
1084 | * Skip over the entry for the transaction header, we'll | 1232 | * If the transaction needs to be synchronous, then force the |
1085 | * fill that in at the end. | 1233 | * log out now and wait for it. |
1086 | */ | 1234 | */ |
1087 | vecp = log_vector + 1; /* pointer arithmetic */ | 1235 | if (sync) { |
1088 | 1236 | if (!error) { | |
1089 | nitems = 0; | 1237 | error = _xfs_log_force_lsn(mp, commit_lsn, |
1090 | lidp = xfs_trans_first_item(tp); | 1238 | XFS_LOG_SYNC, log_flushed); |
1091 | ASSERT(lidp != NULL); | ||
1092 | while (lidp != NULL) { | ||
1093 | /* | ||
1094 | * Skip items which aren't dirty in this transaction. | ||
1095 | */ | ||
1096 | if (!(lidp->lid_flags & XFS_LID_DIRTY)) { | ||
1097 | lidp = xfs_trans_next_item(tp, lidp); | ||
1098 | continue; | ||
1099 | } | ||
1100 | /* | ||
1101 | * The item may be marked dirty but not log anything. | ||
1102 | * This can be used to get called when a transaction | ||
1103 | * is committed. | ||
1104 | */ | ||
1105 | if (lidp->lid_size) { | ||
1106 | nitems++; | ||
1107 | } | 1239 | } |
1108 | IOP_FORMAT(lidp->lid_item, vecp); | 1240 | XFS_STATS_INC(xs_trans_sync); |
1109 | vecp += lidp->lid_size; /* pointer arithmetic */ | 1241 | } else { |
1110 | IOP_PIN(lidp->lid_item); | 1242 | XFS_STATS_INC(xs_trans_async); |
1111 | lidp = xfs_trans_next_item(tp, lidp); | ||
1112 | } | 1243 | } |
1113 | 1244 | ||
1245 | return error; | ||
1246 | |||
1247 | out_unreserve: | ||
1248 | xfs_trans_unreserve_and_mod_sb(tp); | ||
1249 | |||
1114 | /* | 1250 | /* |
1115 | * Now that we've counted the number of items in this | 1251 | * It is indeed possible for the transaction to be not dirty but |
1116 | * transaction, fill in the transaction header. | 1252 | * the dqinfo portion to be. All that means is that we have some |
1253 | * (non-persistent) quota reservations that need to be unreserved. | ||
1117 | */ | 1254 | */ |
1118 | tp->t_header.th_magic = XFS_TRANS_HEADER_MAGIC; | 1255 | xfs_trans_unreserve_and_mod_dquots(tp); |
1119 | tp->t_header.th_type = tp->t_type; | 1256 | if (tp->t_ticket) { |
1120 | tp->t_header.th_num_items = nitems; | 1257 | commit_lsn = xfs_log_done(mp, tp->t_ticket, NULL, log_flags); |
1121 | log_vector->i_addr = (xfs_caddr_t)&tp->t_header; | 1258 | if (commit_lsn == -1 && !error) |
1122 | log_vector->i_len = sizeof(xfs_trans_header_t); | 1259 | error = XFS_ERROR(EIO); |
1123 | log_vector->i_type = XLOG_REG_TYPE_TRANSHDR; | 1260 | } |
1124 | } | 1261 | current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); |
1262 | xfs_trans_free_items(tp, error ? XFS_TRANS_ABORT : 0); | ||
1263 | xfs_trans_free_busy(tp); | ||
1264 | xfs_trans_free(tp); | ||
1125 | 1265 | ||
1266 | XFS_STATS_INC(xs_trans_empty); | ||
1267 | return error; | ||
1268 | } | ||
1126 | 1269 | ||
1127 | /* | 1270 | /* |
1128 | * Unlock all of the transaction's items and free the transaction. | 1271 | * Unlock all of the transaction's items and free the transaction. |
@@ -1200,20 +1343,6 @@ xfs_trans_cancel( | |||
1200 | xfs_trans_free(tp); | 1343 | xfs_trans_free(tp); |
1201 | } | 1344 | } |
1202 | 1345 | ||
1203 | |||
1204 | /* | ||
1205 | * Free the transaction structure. If there is more clean up | ||
1206 | * to do when the structure is freed, add it here. | ||
1207 | */ | ||
1208 | STATIC void | ||
1209 | xfs_trans_free( | ||
1210 | xfs_trans_t *tp) | ||
1211 | { | ||
1212 | atomic_dec(&tp->t_mountp->m_active_trans); | ||
1213 | xfs_trans_free_dqinfo(tp); | ||
1214 | kmem_zone_free(xfs_trans_zone, tp); | ||
1215 | } | ||
1216 | |||
1217 | /* | 1346 | /* |
1218 | * Roll from one trans in the sequence of PERMANENT transactions to | 1347 | * Roll from one trans in the sequence of PERMANENT transactions to |
1219 | * the next: permanent transactions are only flushed out when | 1348 | * the next: permanent transactions are only flushed out when |
@@ -1283,174 +1412,3 @@ xfs_trans_roll( | |||
1283 | xfs_trans_ihold(trans, dp); | 1412 | xfs_trans_ihold(trans, dp); |
1284 | return 0; | 1413 | return 0; |
1285 | } | 1414 | } |
1286 | |||
1287 | /* | ||
1288 | * THIS SHOULD BE REWRITTEN TO USE xfs_trans_next_item(). | ||
1289 | * | ||
1290 | * This is typically called by the LM when a transaction has been fully | ||
1291 | * committed to disk. It needs to unpin the items which have | ||
1292 | * been logged by the transaction and update their positions | ||
1293 | * in the AIL if necessary. | ||
1294 | * This also gets called when the transactions didn't get written out | ||
1295 | * because of an I/O error. Abortflag & XFS_LI_ABORTED is set then. | ||
1296 | * | ||
1297 | * Call xfs_trans_chunk_committed() to process the items in | ||
1298 | * each chunk. | ||
1299 | */ | ||
1300 | STATIC void | ||
1301 | xfs_trans_committed( | ||
1302 | xfs_trans_t *tp, | ||
1303 | int abortflag) | ||
1304 | { | ||
1305 | xfs_log_item_chunk_t *licp; | ||
1306 | xfs_log_item_chunk_t *next_licp; | ||
1307 | xfs_log_busy_chunk_t *lbcp; | ||
1308 | xfs_log_busy_slot_t *lbsp; | ||
1309 | int i; | ||
1310 | |||
1311 | /* | ||
1312 | * Call the transaction's completion callback if there | ||
1313 | * is one. | ||
1314 | */ | ||
1315 | if (tp->t_callback != NULL) { | ||
1316 | tp->t_callback(tp, tp->t_callarg); | ||
1317 | } | ||
1318 | |||
1319 | /* | ||
1320 | * Special case the chunk embedded in the transaction. | ||
1321 | */ | ||
1322 | licp = &(tp->t_items); | ||
1323 | if (!(xfs_lic_are_all_free(licp))) { | ||
1324 | xfs_trans_chunk_committed(licp, tp->t_lsn, abortflag); | ||
1325 | } | ||
1326 | |||
1327 | /* | ||
1328 | * Process the items in each chunk in turn. | ||
1329 | */ | ||
1330 | licp = licp->lic_next; | ||
1331 | while (licp != NULL) { | ||
1332 | ASSERT(!xfs_lic_are_all_free(licp)); | ||
1333 | xfs_trans_chunk_committed(licp, tp->t_lsn, abortflag); | ||
1334 | next_licp = licp->lic_next; | ||
1335 | kmem_free(licp); | ||
1336 | licp = next_licp; | ||
1337 | } | ||
1338 | |||
1339 | /* | ||
1340 | * Clear all the per-AG busy list items listed in this transaction | ||
1341 | */ | ||
1342 | lbcp = &tp->t_busy; | ||
1343 | while (lbcp != NULL) { | ||
1344 | for (i = 0, lbsp = lbcp->lbc_busy; i < lbcp->lbc_unused; i++, lbsp++) { | ||
1345 | if (!XFS_LBC_ISFREE(lbcp, i)) { | ||
1346 | xfs_alloc_clear_busy(tp, lbsp->lbc_ag, | ||
1347 | lbsp->lbc_idx); | ||
1348 | } | ||
1349 | } | ||
1350 | lbcp = lbcp->lbc_next; | ||
1351 | } | ||
1352 | xfs_trans_free_busy(tp); | ||
1353 | |||
1354 | /* | ||
1355 | * That's it for the transaction structure. Free it. | ||
1356 | */ | ||
1357 | xfs_trans_free(tp); | ||
1358 | } | ||
1359 | |||
1360 | /* | ||
1361 | * This is called to perform the commit processing for each | ||
1362 | * item described by the given chunk. | ||
1363 | * | ||
1364 | * The commit processing consists of unlocking items which were | ||
1365 | * held locked with the SYNC_UNLOCK attribute, calling the committed | ||
1366 | * routine of each logged item, updating the item's position in the AIL | ||
1367 | * if necessary, and unpinning each item. If the committed routine | ||
1368 | * returns -1, then do nothing further with the item because it | ||
1369 | * may have been freed. | ||
1370 | * | ||
1371 | * Since items are unlocked when they are copied to the incore | ||
1372 | * log, it is possible for two transactions to be completing | ||
1373 | * and manipulating the same item simultaneously. The AIL lock | ||
1374 | * will protect the lsn field of each item. The value of this | ||
1375 | * field can never go backwards. | ||
1376 | * | ||
1377 | * We unpin the items after repositioning them in the AIL, because | ||
1378 | * otherwise they could be immediately flushed and we'd have to race | ||
1379 | * with the flusher trying to pull the item from the AIL as we add it. | ||
1380 | */ | ||
1381 | STATIC void | ||
1382 | xfs_trans_chunk_committed( | ||
1383 | xfs_log_item_chunk_t *licp, | ||
1384 | xfs_lsn_t lsn, | ||
1385 | int aborted) | ||
1386 | { | ||
1387 | xfs_log_item_desc_t *lidp; | ||
1388 | xfs_log_item_t *lip; | ||
1389 | xfs_lsn_t item_lsn; | ||
1390 | int i; | ||
1391 | |||
1392 | lidp = licp->lic_descs; | ||
1393 | for (i = 0; i < licp->lic_unused; i++, lidp++) { | ||
1394 | struct xfs_ail *ailp; | ||
1395 | |||
1396 | if (xfs_lic_isfree(licp, i)) { | ||
1397 | continue; | ||
1398 | } | ||
1399 | |||
1400 | lip = lidp->lid_item; | ||
1401 | if (aborted) | ||
1402 | lip->li_flags |= XFS_LI_ABORTED; | ||
1403 | |||
1404 | /* | ||
1405 | * Send in the ABORTED flag to the COMMITTED routine | ||
1406 | * so that it knows whether the transaction was aborted | ||
1407 | * or not. | ||
1408 | */ | ||
1409 | item_lsn = IOP_COMMITTED(lip, lsn); | ||
1410 | |||
1411 | /* | ||
1412 | * If the committed routine returns -1, make | ||
1413 | * no more references to the item. | ||
1414 | */ | ||
1415 | if (XFS_LSN_CMP(item_lsn, (xfs_lsn_t)-1) == 0) { | ||
1416 | continue; | ||
1417 | } | ||
1418 | |||
1419 | /* | ||
1420 | * If the returned lsn is greater than what it | ||
1421 | * contained before, update the location of the | ||
1422 | * item in the AIL. If it is not, then do nothing. | ||
1423 | * Items can never move backwards in the AIL. | ||
1424 | * | ||
1425 | * While the new lsn should usually be greater, it | ||
1426 | * is possible that a later transaction completing | ||
1427 | * simultaneously with an earlier one using the | ||
1428 | * same item could complete first with a higher lsn. | ||
1429 | * This would cause the earlier transaction to fail | ||
1430 | * the test below. | ||
1431 | */ | ||
1432 | ailp = lip->li_ailp; | ||
1433 | spin_lock(&ailp->xa_lock); | ||
1434 | if (XFS_LSN_CMP(item_lsn, lip->li_lsn) > 0) { | ||
1435 | /* | ||
1436 | * This will set the item's lsn to item_lsn | ||
1437 | * and update the position of the item in | ||
1438 | * the AIL. | ||
1439 | * | ||
1440 | * xfs_trans_ail_update() drops the AIL lock. | ||
1441 | */ | ||
1442 | xfs_trans_ail_update(ailp, lip, item_lsn); | ||
1443 | } else { | ||
1444 | spin_unlock(&ailp->xa_lock); | ||
1445 | } | ||
1446 | |||
1447 | /* | ||
1448 | * Now that we've repositioned the item in the AIL, | ||
1449 | * unpin it so it can be flushed. Pass information | ||
1450 | * about buffer stale state down from the log item | ||
1451 | * flags, if anyone else stales the buffer we do not | ||
1452 | * want to pay any attention to it. | ||
1453 | */ | ||
1454 | IOP_UNPIN(lip, lidp->lid_flags & XFS_LID_BUF_STALE); | ||
1455 | } | ||
1456 | } | ||