diff options
-rw-r--r-- | fs/xfs/quota/xfs_dquot.c | 91 | ||||
-rw-r--r-- | fs/xfs/xfs_buf_item.c | 13 | ||||
-rw-r--r-- | fs/xfs/xfs_buf_item.h | 2 | ||||
-rw-r--r-- | fs/xfs/xfs_inode.c | 10 | ||||
-rw-r--r-- | fs/xfs/xfs_inode_item.c | 23 | ||||
-rw-r--r-- | fs/xfs/xfs_inode_item.h | 4 | ||||
-rw-r--r-- | fs/xfs/xfs_trans_buf.c | 7 |
7 files changed, 68 insertions, 82 deletions
diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index f152af8cfab0..6526e87cade0 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c | |||
@@ -54,8 +54,6 @@ | |||
54 | flush lock - ditto. | 54 | flush lock - ditto. |
55 | */ | 55 | */ |
56 | 56 | ||
57 | STATIC void xfs_qm_dqflush_done(xfs_buf_t *, xfs_dq_logitem_t *); | ||
58 | |||
59 | #ifdef DEBUG | 57 | #ifdef DEBUG |
60 | xfs_buftarg_t *xfs_dqerror_target; | 58 | xfs_buftarg_t *xfs_dqerror_target; |
61 | int xfs_do_dqerror; | 59 | int xfs_do_dqerror; |
@@ -1131,6 +1129,46 @@ xfs_qm_dqrele( | |||
1131 | xfs_qm_dqput(dqp); | 1129 | xfs_qm_dqput(dqp); |
1132 | } | 1130 | } |
1133 | 1131 | ||
1132 | /* | ||
1133 | * This is the dquot flushing I/O completion routine. It is called | ||
1134 | * from interrupt level when the buffer containing the dquot is | ||
1135 | * flushed to disk. It is responsible for removing the dquot logitem | ||
1136 | * from the AIL if it has not been re-logged, and unlocking the dquot's | ||
1137 | * flush lock. This behavior is very similar to that of inodes.. | ||
1138 | */ | ||
1139 | STATIC void | ||
1140 | xfs_qm_dqflush_done( | ||
1141 | struct xfs_buf *bp, | ||
1142 | struct xfs_log_item *lip) | ||
1143 | { | ||
1144 | xfs_dq_logitem_t *qip = (struct xfs_dq_logitem *)lip; | ||
1145 | xfs_dquot_t *dqp = qip->qli_dquot; | ||
1146 | struct xfs_ail *ailp = lip->li_ailp; | ||
1147 | |||
1148 | /* | ||
1149 | * We only want to pull the item from the AIL if its | ||
1150 | * location in the log has not changed since we started the flush. | ||
1151 | * Thus, we only bother if the dquot's lsn has | ||
1152 | * not changed. First we check the lsn outside the lock | ||
1153 | * since it's cheaper, and then we recheck while | ||
1154 | * holding the lock before removing the dquot from the AIL. | ||
1155 | */ | ||
1156 | if ((lip->li_flags & XFS_LI_IN_AIL) && | ||
1157 | lip->li_lsn == qip->qli_flush_lsn) { | ||
1158 | |||
1159 | /* xfs_trans_ail_delete() drops the AIL lock. */ | ||
1160 | spin_lock(&ailp->xa_lock); | ||
1161 | if (lip->li_lsn == qip->qli_flush_lsn) | ||
1162 | xfs_trans_ail_delete(ailp, lip); | ||
1163 | else | ||
1164 | spin_unlock(&ailp->xa_lock); | ||
1165 | } | ||
1166 | |||
1167 | /* | ||
1168 | * Release the dq's flush lock since we're done with it. | ||
1169 | */ | ||
1170 | xfs_dqfunlock(dqp); | ||
1171 | } | ||
1134 | 1172 | ||
1135 | /* | 1173 | /* |
1136 | * Write a modified dquot to disk. | 1174 | * Write a modified dquot to disk. |
@@ -1212,8 +1250,9 @@ xfs_qm_dqflush( | |||
1212 | * Attach an iodone routine so that we can remove this dquot from the | 1250 | * Attach an iodone routine so that we can remove this dquot from the |
1213 | * AIL and release the flush lock once the dquot is synced to disk. | 1251 | * AIL and release the flush lock once the dquot is synced to disk. |
1214 | */ | 1252 | */ |
1215 | xfs_buf_attach_iodone(bp, (void(*)(xfs_buf_t *, xfs_log_item_t *)) | 1253 | xfs_buf_attach_iodone(bp, xfs_qm_dqflush_done, |
1216 | xfs_qm_dqflush_done, &(dqp->q_logitem.qli_item)); | 1254 | &dqp->q_logitem.qli_item); |
1255 | |||
1217 | /* | 1256 | /* |
1218 | * If the buffer is pinned then push on the log so we won't | 1257 | * If the buffer is pinned then push on the log so we won't |
1219 | * get stuck waiting in the write for too long. | 1258 | * get stuck waiting in the write for too long. |
@@ -1237,50 +1276,6 @@ xfs_qm_dqflush( | |||
1237 | 1276 | ||
1238 | } | 1277 | } |
1239 | 1278 | ||
1240 | /* | ||
1241 | * This is the dquot flushing I/O completion routine. It is called | ||
1242 | * from interrupt level when the buffer containing the dquot is | ||
1243 | * flushed to disk. It is responsible for removing the dquot logitem | ||
1244 | * from the AIL if it has not been re-logged, and unlocking the dquot's | ||
1245 | * flush lock. This behavior is very similar to that of inodes.. | ||
1246 | */ | ||
1247 | /*ARGSUSED*/ | ||
1248 | STATIC void | ||
1249 | xfs_qm_dqflush_done( | ||
1250 | xfs_buf_t *bp, | ||
1251 | xfs_dq_logitem_t *qip) | ||
1252 | { | ||
1253 | xfs_dquot_t *dqp; | ||
1254 | struct xfs_ail *ailp; | ||
1255 | |||
1256 | dqp = qip->qli_dquot; | ||
1257 | ailp = qip->qli_item.li_ailp; | ||
1258 | |||
1259 | /* | ||
1260 | * We only want to pull the item from the AIL if its | ||
1261 | * location in the log has not changed since we started the flush. | ||
1262 | * Thus, we only bother if the dquot's lsn has | ||
1263 | * not changed. First we check the lsn outside the lock | ||
1264 | * since it's cheaper, and then we recheck while | ||
1265 | * holding the lock before removing the dquot from the AIL. | ||
1266 | */ | ||
1267 | if ((qip->qli_item.li_flags & XFS_LI_IN_AIL) && | ||
1268 | qip->qli_item.li_lsn == qip->qli_flush_lsn) { | ||
1269 | |||
1270 | /* xfs_trans_ail_delete() drops the AIL lock. */ | ||
1271 | spin_lock(&ailp->xa_lock); | ||
1272 | if (qip->qli_item.li_lsn == qip->qli_flush_lsn) | ||
1273 | xfs_trans_ail_delete(ailp, (xfs_log_item_t*)qip); | ||
1274 | else | ||
1275 | spin_unlock(&ailp->xa_lock); | ||
1276 | } | ||
1277 | |||
1278 | /* | ||
1279 | * Release the dq's flush lock since we're done with it. | ||
1280 | */ | ||
1281 | xfs_dqfunlock(dqp); | ||
1282 | } | ||
1283 | |||
1284 | int | 1279 | int |
1285 | xfs_qm_dqlock_nowait( | 1280 | xfs_qm_dqlock_nowait( |
1286 | xfs_dquot_t *dqp) | 1281 | xfs_dquot_t *dqp) |
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 992d6be101cb..60e063d96f8d 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c | |||
@@ -1079,15 +1079,14 @@ xfs_buf_error_relse( | |||
1079 | * It is called by xfs_buf_iodone_callbacks() above which will take | 1079 | * It is called by xfs_buf_iodone_callbacks() above which will take |
1080 | * care of cleaning up the buffer itself. | 1080 | * care of cleaning up the buffer itself. |
1081 | */ | 1081 | */ |
1082 | /* ARGSUSED */ | ||
1083 | void | 1082 | void |
1084 | xfs_buf_iodone( | 1083 | xfs_buf_iodone( |
1085 | xfs_buf_t *bp, | 1084 | struct xfs_buf *bp, |
1086 | xfs_buf_log_item_t *bip) | 1085 | struct xfs_log_item *lip) |
1087 | { | 1086 | { |
1088 | struct xfs_ail *ailp = bip->bli_item.li_ailp; | 1087 | struct xfs_ail *ailp = lip->li_ailp; |
1089 | 1088 | ||
1090 | ASSERT(bip->bli_buf == bp); | 1089 | ASSERT(BUF_ITEM(lip)->bli_buf == bp); |
1091 | 1090 | ||
1092 | xfs_buf_rele(bp); | 1091 | xfs_buf_rele(bp); |
1093 | 1092 | ||
@@ -1101,6 +1100,6 @@ xfs_buf_iodone( | |||
1101 | * Either way, AIL is useless if we're forcing a shutdown. | 1100 | * Either way, AIL is useless if we're forcing a shutdown. |
1102 | */ | 1101 | */ |
1103 | spin_lock(&ailp->xa_lock); | 1102 | spin_lock(&ailp->xa_lock); |
1104 | xfs_trans_ail_delete(ailp, (xfs_log_item_t *)bip); | 1103 | xfs_trans_ail_delete(ailp, lip); |
1105 | xfs_buf_item_free(bip); | 1104 | xfs_buf_item_free(BUF_ITEM(lip)); |
1106 | } | 1105 | } |
diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index f20bb472d582..0e2ed43f16c7 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h | |||
@@ -124,7 +124,7 @@ void xfs_buf_attach_iodone(struct xfs_buf *, | |||
124 | void(*)(struct xfs_buf *, xfs_log_item_t *), | 124 | void(*)(struct xfs_buf *, xfs_log_item_t *), |
125 | xfs_log_item_t *); | 125 | xfs_log_item_t *); |
126 | void xfs_buf_iodone_callbacks(struct xfs_buf *); | 126 | void xfs_buf_iodone_callbacks(struct xfs_buf *); |
127 | void xfs_buf_iodone(struct xfs_buf *, xfs_buf_log_item_t *); | 127 | void xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *); |
128 | 128 | ||
129 | #ifdef XFS_TRANS_DEBUG | 129 | #ifdef XFS_TRANS_DEBUG |
130 | void | 130 | void |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index dde2e5dc6c62..c7c48da97ad4 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
@@ -1981,7 +1981,7 @@ xfs_ifree_cluster( | |||
1981 | if (lip->li_type == XFS_LI_INODE) { | 1981 | if (lip->li_type == XFS_LI_INODE) { |
1982 | iip = (xfs_inode_log_item_t *)lip; | 1982 | iip = (xfs_inode_log_item_t *)lip; |
1983 | ASSERT(iip->ili_logged == 1); | 1983 | ASSERT(iip->ili_logged == 1); |
1984 | lip->li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) xfs_istale_done; | 1984 | lip->li_cb = xfs_istale_done; |
1985 | xfs_trans_ail_copy_lsn(mp->m_ail, | 1985 | xfs_trans_ail_copy_lsn(mp->m_ail, |
1986 | &iip->ili_flush_lsn, | 1986 | &iip->ili_flush_lsn, |
1987 | &iip->ili_item.li_lsn); | 1987 | &iip->ili_item.li_lsn); |
@@ -2051,9 +2051,8 @@ xfs_ifree_cluster( | |||
2051 | xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn, | 2051 | xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn, |
2052 | &iip->ili_item.li_lsn); | 2052 | &iip->ili_item.li_lsn); |
2053 | 2053 | ||
2054 | xfs_buf_attach_iodone(bp, | 2054 | xfs_buf_attach_iodone(bp, xfs_istale_done, |
2055 | (void(*)(xfs_buf_t*,xfs_log_item_t*)) | 2055 | &iip->ili_item); |
2056 | xfs_istale_done, (xfs_log_item_t *)iip); | ||
2057 | 2056 | ||
2058 | if (ip != free_ip) | 2057 | if (ip != free_ip) |
2059 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 2058 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
@@ -3065,8 +3064,7 @@ xfs_iflush_int( | |||
3065 | * and unlock the inode's flush lock when the inode is | 3064 | * and unlock the inode's flush lock when the inode is |
3066 | * completely written to disk. | 3065 | * completely written to disk. |
3067 | */ | 3066 | */ |
3068 | xfs_buf_attach_iodone(bp, (void(*)(xfs_buf_t*,xfs_log_item_t*)) | 3067 | xfs_buf_attach_iodone(bp, xfs_iflush_done, &iip->ili_item); |
3069 | xfs_iflush_done, (xfs_log_item_t *)iip); | ||
3070 | 3068 | ||
3071 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); | 3069 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); |
3072 | ASSERT(XFS_BUF_IODONE_FUNC(bp) != NULL); | 3070 | ASSERT(XFS_BUF_IODONE_FUNC(bp) != NULL); |
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 2626aaca42f2..c7e70d708345 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c | |||
@@ -867,14 +867,14 @@ xfs_inode_item_destroy( | |||
867 | * from the AIL if it has not been re-logged, and unlocking the inode's | 867 | * from the AIL if it has not been re-logged, and unlocking the inode's |
868 | * flush lock. | 868 | * flush lock. |
869 | */ | 869 | */ |
870 | /*ARGSUSED*/ | ||
871 | void | 870 | void |
872 | xfs_iflush_done( | 871 | xfs_iflush_done( |
873 | xfs_buf_t *bp, | 872 | struct xfs_buf *bp, |
874 | xfs_inode_log_item_t *iip) | 873 | struct xfs_log_item *lip) |
875 | { | 874 | { |
875 | struct xfs_inode_log_item *iip = INODE_ITEM(lip); | ||
876 | xfs_inode_t *ip = iip->ili_inode; | 876 | xfs_inode_t *ip = iip->ili_inode; |
877 | struct xfs_ail *ailp = iip->ili_item.li_ailp; | 877 | struct xfs_ail *ailp = lip->li_ailp; |
878 | 878 | ||
879 | /* | 879 | /* |
880 | * We only want to pull the item from the AIL if it is | 880 | * We only want to pull the item from the AIL if it is |
@@ -885,12 +885,11 @@ xfs_iflush_done( | |||
885 | * the lock since it's cheaper, and then we recheck while | 885 | * the lock since it's cheaper, and then we recheck while |
886 | * holding the lock before removing the inode from the AIL. | 886 | * holding the lock before removing the inode from the AIL. |
887 | */ | 887 | */ |
888 | if (iip->ili_logged && | 888 | if (iip->ili_logged && lip->li_lsn == iip->ili_flush_lsn) { |
889 | (iip->ili_item.li_lsn == iip->ili_flush_lsn)) { | ||
890 | spin_lock(&ailp->xa_lock); | 889 | spin_lock(&ailp->xa_lock); |
891 | if (iip->ili_item.li_lsn == iip->ili_flush_lsn) { | 890 | if (lip->li_lsn == iip->ili_flush_lsn) { |
892 | /* xfs_trans_ail_delete() drops the AIL lock. */ | 891 | /* xfs_trans_ail_delete() drops the AIL lock. */ |
893 | xfs_trans_ail_delete(ailp, (xfs_log_item_t*)iip); | 892 | xfs_trans_ail_delete(ailp, lip); |
894 | } else { | 893 | } else { |
895 | spin_unlock(&ailp->xa_lock); | 894 | spin_unlock(&ailp->xa_lock); |
896 | } | 895 | } |
@@ -908,8 +907,6 @@ xfs_iflush_done( | |||
908 | * Release the inode's flush lock since we're done with it. | 907 | * Release the inode's flush lock since we're done with it. |
909 | */ | 908 | */ |
910 | xfs_ifunlock(ip); | 909 | xfs_ifunlock(ip); |
911 | |||
912 | return; | ||
913 | } | 910 | } |
914 | 911 | ||
915 | /* | 912 | /* |
@@ -959,10 +956,10 @@ xfs_iflush_abort( | |||
959 | 956 | ||
960 | void | 957 | void |
961 | xfs_istale_done( | 958 | xfs_istale_done( |
962 | xfs_buf_t *bp, | 959 | struct xfs_buf *bp, |
963 | xfs_inode_log_item_t *iip) | 960 | struct xfs_log_item *lip) |
964 | { | 961 | { |
965 | xfs_iflush_abort(iip->ili_inode); | 962 | xfs_iflush_abort(INODE_ITEM(lip)->ili_inode); |
966 | } | 963 | } |
967 | 964 | ||
968 | /* | 965 | /* |
diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h index 9a467958ecdd..b6a97ff1c3ab 100644 --- a/fs/xfs/xfs_inode_item.h +++ b/fs/xfs/xfs_inode_item.h | |||
@@ -161,8 +161,8 @@ static inline int xfs_inode_clean(xfs_inode_t *ip) | |||
161 | 161 | ||
162 | extern void xfs_inode_item_init(struct xfs_inode *, struct xfs_mount *); | 162 | extern void xfs_inode_item_init(struct xfs_inode *, struct xfs_mount *); |
163 | extern void xfs_inode_item_destroy(struct xfs_inode *); | 163 | extern void xfs_inode_item_destroy(struct xfs_inode *); |
164 | extern void xfs_iflush_done(struct xfs_buf *, xfs_inode_log_item_t *); | 164 | extern void xfs_iflush_done(struct xfs_buf *, struct xfs_log_item *); |
165 | extern void xfs_istale_done(struct xfs_buf *, xfs_inode_log_item_t *); | 165 | extern void xfs_istale_done(struct xfs_buf *, struct xfs_log_item *); |
166 | extern void xfs_iflush_abort(struct xfs_inode *); | 166 | extern void xfs_iflush_abort(struct xfs_inode *); |
167 | extern int xfs_inode_item_format_convert(xfs_log_iovec_t *, | 167 | extern int xfs_inode_item_format_convert(xfs_log_iovec_t *, |
168 | xfs_inode_log_format_t *); | 168 | xfs_inode_log_format_t *); |
diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 74a1c33e4098..90af025e6839 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c | |||
@@ -658,7 +658,7 @@ xfs_trans_log_buf(xfs_trans_t *tp, | |||
658 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); | 658 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); |
659 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 659 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
660 | XFS_BUF_SET_IODONE_FUNC(bp, xfs_buf_iodone_callbacks); | 660 | XFS_BUF_SET_IODONE_FUNC(bp, xfs_buf_iodone_callbacks); |
661 | bip->bli_item.li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*))xfs_buf_iodone; | 661 | bip->bli_item.li_cb = xfs_buf_iodone; |
662 | 662 | ||
663 | trace_xfs_trans_log_buf(bip); | 663 | trace_xfs_trans_log_buf(bip); |
664 | 664 | ||
@@ -815,12 +815,9 @@ xfs_trans_stale_inode_buf( | |||
815 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 815 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
816 | 816 | ||
817 | bip->bli_flags |= XFS_BLI_STALE_INODE; | 817 | bip->bli_flags |= XFS_BLI_STALE_INODE; |
818 | bip->bli_item.li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) | 818 | bip->bli_item.li_cb = xfs_buf_iodone; |
819 | xfs_buf_iodone; | ||
820 | } | 819 | } |
821 | 820 | ||
822 | |||
823 | |||
824 | /* | 821 | /* |
825 | * Mark the buffer as being one which contains newly allocated | 822 | * Mark the buffer as being one which contains newly allocated |
826 | * inodes. We need to make sure that even if this buffer is | 823 | * inodes. We need to make sure that even if this buffer is |