diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-25 11:17:01 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-25 11:17:01 -0400 |
| commit | 110b93842e36b17598cf24874e90d0401431cda2 (patch) | |
| tree | d95591d129ea8ed8d5b8e489e2d5ae68e79586c4 /fs/xfs/linux-2.6 | |
| parent | 4961ab934a1254b1ad9420cea0ded617b57f022b (diff) | |
| parent | 88e88374ee4958786397a57f684de6f1fc5e0242 (diff) | |
Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
* 'for-linus' of git://oss.sgi.com/xfs/xfs:
xfs: Ensure inode allocation buffers are fully replayed
xfs: enable background pushing of the CIL
xfs: forced unmounts need to push the CIL
xfs: Introduce delayed logging core code
xfs: Delayed logging design documentation
xfs: Improve scalability of busy extent tracking
xfs: make the log ticket ID available outside the log infrastructure
xfs: clean up log ticket overrun debug output
xfs: Clean up XFS_BLI_* flag namespace
xfs: modify buffer item reference counting
xfs: allow log ticket allocation to take allocation flags
xfs: Don't reuse the same transaction ID for duplicated transactions.
Diffstat (limited to 'fs/xfs/linux-2.6')
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 9 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_quotaops.c | 1 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 12 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_trace.h | 83 |
4 files changed, 77 insertions, 28 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index f01de3c55c43..649ade8ef598 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | 37 | ||
| 38 | #include "xfs_sb.h" | 38 | #include "xfs_sb.h" |
| 39 | #include "xfs_inum.h" | 39 | #include "xfs_inum.h" |
| 40 | #include "xfs_log.h" | ||
| 40 | #include "xfs_ag.h" | 41 | #include "xfs_ag.h" |
| 41 | #include "xfs_dmapi.h" | 42 | #include "xfs_dmapi.h" |
| 42 | #include "xfs_mount.h" | 43 | #include "xfs_mount.h" |
| @@ -850,6 +851,12 @@ xfs_buf_lock_value( | |||
| 850 | * Note that this in no way locks the underlying pages, so it is only | 851 | * Note that this in no way locks the underlying pages, so it is only |
| 851 | * useful for synchronizing concurrent use of buffer objects, not for | 852 | * useful for synchronizing concurrent use of buffer objects, not for |
| 852 | * synchronizing independent access to the underlying pages. | 853 | * synchronizing independent access to the underlying pages. |
| 854 | * | ||
| 855 | * If we come across a stale, pinned, locked buffer, we know that we | ||
| 856 | * are being asked to lock a buffer that has been reallocated. Because | ||
| 857 | * it is pinned, we know that the log has not been pushed to disk and | ||
| 858 | * hence it will still be locked. Rather than sleeping until someone | ||
| 859 | * else pushes the log, push it ourselves before trying to get the lock. | ||
| 853 | */ | 860 | */ |
| 854 | void | 861 | void |
| 855 | xfs_buf_lock( | 862 | xfs_buf_lock( |
| @@ -857,6 +864,8 @@ xfs_buf_lock( | |||
| 857 | { | 864 | { |
| 858 | trace_xfs_buf_lock(bp, _RET_IP_); | 865 | trace_xfs_buf_lock(bp, _RET_IP_); |
| 859 | 866 | ||
| 867 | if (atomic_read(&bp->b_pin_count) && (bp->b_flags & XBF_STALE)) | ||
| 868 | xfs_log_force(bp->b_mount, 0); | ||
| 860 | if (atomic_read(&bp->b_io_remaining)) | 869 | if (atomic_read(&bp->b_io_remaining)) |
| 861 | blk_run_address_space(bp->b_target->bt_mapping); | 870 | blk_run_address_space(bp->b_target->bt_mapping); |
| 862 | down(&bp->b_sema); | 871 | down(&bp->b_sema); |
diff --git a/fs/xfs/linux-2.6/xfs_quotaops.c b/fs/xfs/linux-2.6/xfs_quotaops.c index e31bf21fe5d3..9ac8aea91529 100644 --- a/fs/xfs/linux-2.6/xfs_quotaops.c +++ b/fs/xfs/linux-2.6/xfs_quotaops.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include "xfs_dmapi.h" | 19 | #include "xfs_dmapi.h" |
| 20 | #include "xfs_sb.h" | 20 | #include "xfs_sb.h" |
| 21 | #include "xfs_inum.h" | 21 | #include "xfs_inum.h" |
| 22 | #include "xfs_log.h" | ||
| 22 | #include "xfs_ag.h" | 23 | #include "xfs_ag.h" |
| 23 | #include "xfs_mount.h" | 24 | #include "xfs_mount.h" |
| 24 | #include "xfs_quota.h" | 25 | #include "xfs_quota.h" |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index f24dbe5efde3..f2d1718c9165 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
| @@ -119,6 +119,8 @@ mempool_t *xfs_ioend_pool; | |||
| 119 | #define MNTOPT_DMAPI "dmapi" /* DMI enabled (DMAPI / XDSM) */ | 119 | #define MNTOPT_DMAPI "dmapi" /* DMI enabled (DMAPI / XDSM) */ |
| 120 | #define MNTOPT_XDSM "xdsm" /* DMI enabled (DMAPI / XDSM) */ | 120 | #define MNTOPT_XDSM "xdsm" /* DMI enabled (DMAPI / XDSM) */ |
| 121 | #define MNTOPT_DMI "dmi" /* DMI enabled (DMAPI / XDSM) */ | 121 | #define MNTOPT_DMI "dmi" /* DMI enabled (DMAPI / XDSM) */ |
| 122 | #define MNTOPT_DELAYLOG "delaylog" /* Delayed loging enabled */ | ||
| 123 | #define MNTOPT_NODELAYLOG "nodelaylog" /* Delayed loging disabled */ | ||
| 122 | 124 | ||
| 123 | /* | 125 | /* |
| 124 | * Table driven mount option parser. | 126 | * Table driven mount option parser. |
| @@ -374,6 +376,13 @@ xfs_parseargs( | |||
| 374 | mp->m_flags |= XFS_MOUNT_DMAPI; | 376 | mp->m_flags |= XFS_MOUNT_DMAPI; |
| 375 | } else if (!strcmp(this_char, MNTOPT_DMI)) { | 377 | } else if (!strcmp(this_char, MNTOPT_DMI)) { |
| 376 | mp->m_flags |= XFS_MOUNT_DMAPI; | 378 | mp->m_flags |= XFS_MOUNT_DMAPI; |
| 379 | } else if (!strcmp(this_char, MNTOPT_DELAYLOG)) { | ||
| 380 | mp->m_flags |= XFS_MOUNT_DELAYLOG; | ||
| 381 | cmn_err(CE_WARN, | ||
| 382 | "Enabling EXPERIMENTAL delayed logging feature " | ||
| 383 | "- use at your own risk.\n"); | ||
| 384 | } else if (!strcmp(this_char, MNTOPT_NODELAYLOG)) { | ||
| 385 | mp->m_flags &= ~XFS_MOUNT_DELAYLOG; | ||
| 377 | } else if (!strcmp(this_char, "ihashsize")) { | 386 | } else if (!strcmp(this_char, "ihashsize")) { |
| 378 | cmn_err(CE_WARN, | 387 | cmn_err(CE_WARN, |
| 379 | "XFS: ihashsize no longer used, option is deprecated."); | 388 | "XFS: ihashsize no longer used, option is deprecated."); |
| @@ -535,6 +544,7 @@ xfs_showargs( | |||
| 535 | { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, | 544 | { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, |
| 536 | { XFS_MOUNT_DMAPI, "," MNTOPT_DMAPI }, | 545 | { XFS_MOUNT_DMAPI, "," MNTOPT_DMAPI }, |
| 537 | { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, | 546 | { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, |
| 547 | { XFS_MOUNT_DELAYLOG, "," MNTOPT_DELAYLOG }, | ||
| 538 | { 0, NULL } | 548 | { 0, NULL } |
| 539 | }; | 549 | }; |
| 540 | static struct proc_xfs_info xfs_info_unset[] = { | 550 | static struct proc_xfs_info xfs_info_unset[] = { |
| @@ -1755,7 +1765,7 @@ xfs_init_zones(void) | |||
| 1755 | * but it is much faster. | 1765 | * but it is much faster. |
| 1756 | */ | 1766 | */ |
| 1757 | xfs_buf_item_zone = kmem_zone_init((sizeof(xfs_buf_log_item_t) + | 1767 | xfs_buf_item_zone = kmem_zone_init((sizeof(xfs_buf_log_item_t) + |
| 1758 | (((XFS_MAX_BLOCKSIZE / XFS_BLI_CHUNK) / | 1768 | (((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / |
| 1759 | NBWORD) * sizeof(int))), "xfs_buf_item"); | 1769 | NBWORD) * sizeof(int))), "xfs_buf_item"); |
| 1760 | if (!xfs_buf_item_zone) | 1770 | if (!xfs_buf_item_zone) |
| 1761 | goto out_destroy_trans_zone; | 1771 | goto out_destroy_trans_zone; |
diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 8a319cfd2901..ff6bc797baf2 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h | |||
| @@ -1059,83 +1059,112 @@ TRACE_EVENT(xfs_bunmap, | |||
| 1059 | 1059 | ||
| 1060 | ); | 1060 | ); |
| 1061 | 1061 | ||
| 1062 | #define XFS_BUSY_SYNC \ | ||
| 1063 | { 0, "async" }, \ | ||
| 1064 | { 1, "sync" } | ||
| 1065 | |||
| 1062 | TRACE_EVENT(xfs_alloc_busy, | 1066 | TRACE_EVENT(xfs_alloc_busy, |
| 1063 | TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, | 1067 | TP_PROTO(struct xfs_trans *trans, xfs_agnumber_t agno, |
| 1064 | xfs_extlen_t len, int slot), | 1068 | xfs_agblock_t agbno, xfs_extlen_t len, int sync), |
| 1065 | TP_ARGS(mp, agno, agbno, len, slot), | 1069 | TP_ARGS(trans, agno, agbno, len, sync), |
| 1066 | TP_STRUCT__entry( | 1070 | TP_STRUCT__entry( |
| 1067 | __field(dev_t, dev) | 1071 | __field(dev_t, dev) |
| 1072 | __field(struct xfs_trans *, tp) | ||
| 1073 | __field(int, tid) | ||
| 1068 | __field(xfs_agnumber_t, agno) | 1074 | __field(xfs_agnumber_t, agno) |
| 1069 | __field(xfs_agblock_t, agbno) | 1075 | __field(xfs_agblock_t, agbno) |
| 1070 | __field(xfs_extlen_t, len) | 1076 | __field(xfs_extlen_t, len) |
| 1071 | __field(int, slot) | 1077 | __field(int, sync) |
| 1072 | ), | 1078 | ), |
| 1073 | TP_fast_assign( | 1079 | TP_fast_assign( |
| 1074 | __entry->dev = mp->m_super->s_dev; | 1080 | __entry->dev = trans->t_mountp->m_super->s_dev; |
| 1081 | __entry->tp = trans; | ||
| 1082 | __entry->tid = trans->t_ticket->t_tid; | ||
| 1075 | __entry->agno = agno; | 1083 | __entry->agno = agno; |
| 1076 | __entry->agbno = agbno; | 1084 | __entry->agbno = agbno; |
| 1077 | __entry->len = len; | 1085 | __entry->len = len; |
| 1078 | __entry->slot = slot; | 1086 | __entry->sync = sync; |
| 1079 | ), | 1087 | ), |
| 1080 | TP_printk("dev %d:%d agno %u agbno %u len %u slot %d", | 1088 | TP_printk("dev %d:%d trans 0x%p tid 0x%x agno %u agbno %u len %u %s", |
| 1081 | MAJOR(__entry->dev), MINOR(__entry->dev), | 1089 | MAJOR(__entry->dev), MINOR(__entry->dev), |
| 1090 | __entry->tp, | ||
| 1091 | __entry->tid, | ||
| 1082 | __entry->agno, | 1092 | __entry->agno, |
| 1083 | __entry->agbno, | 1093 | __entry->agbno, |
| 1084 | __entry->len, | 1094 | __entry->len, |
| 1085 | __entry->slot) | 1095 | __print_symbolic(__entry->sync, XFS_BUSY_SYNC)) |
| 1086 | 1096 | ||
| 1087 | ); | 1097 | ); |
| 1088 | 1098 | ||
| 1089 | #define XFS_BUSY_STATES \ | ||
| 1090 | { 0, "found" }, \ | ||
| 1091 | { 1, "missing" } | ||
| 1092 | |||
| 1093 | TRACE_EVENT(xfs_alloc_unbusy, | 1099 | TRACE_EVENT(xfs_alloc_unbusy, |
| 1094 | TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, | 1100 | TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, |
| 1095 | int slot, int found), | 1101 | xfs_agblock_t agbno, xfs_extlen_t len), |
| 1096 | TP_ARGS(mp, agno, slot, found), | 1102 | TP_ARGS(mp, agno, agbno, len), |
| 1097 | TP_STRUCT__entry( | 1103 | TP_STRUCT__entry( |
| 1098 | __field(dev_t, dev) | 1104 | __field(dev_t, dev) |
| 1099 | __field(xfs_agnumber_t, agno) | 1105 | __field(xfs_agnumber_t, agno) |
| 1100 | __field(int, slot) | 1106 | __field(xfs_agblock_t, agbno) |
| 1101 | __field(int, found) | 1107 | __field(xfs_extlen_t, len) |
| 1102 | ), | 1108 | ), |
| 1103 | TP_fast_assign( | 1109 | TP_fast_assign( |
| 1104 | __entry->dev = mp->m_super->s_dev; | 1110 | __entry->dev = mp->m_super->s_dev; |
| 1105 | __entry->agno = agno; | 1111 | __entry->agno = agno; |
| 1106 | __entry->slot = slot; | 1112 | __entry->agbno = agbno; |
| 1107 | __entry->found = found; | 1113 | __entry->len = len; |
| 1108 | ), | 1114 | ), |
| 1109 | TP_printk("dev %d:%d agno %u slot %d %s", | 1115 | TP_printk("dev %d:%d agno %u agbno %u len %u", |
| 1110 | MAJOR(__entry->dev), MINOR(__entry->dev), | 1116 | MAJOR(__entry->dev), MINOR(__entry->dev), |
| 1111 | __entry->agno, | 1117 | __entry->agno, |
| 1112 | __entry->slot, | 1118 | __entry->agbno, |
| 1113 | __print_symbolic(__entry->found, XFS_BUSY_STATES)) | 1119 | __entry->len) |
| 1114 | ); | 1120 | ); |
| 1115 | 1121 | ||
| 1122 | #define XFS_BUSY_STATES \ | ||
| 1123 | { 0, "missing" }, \ | ||
| 1124 | { 1, "found" } | ||
| 1125 | |||
| 1116 | TRACE_EVENT(xfs_alloc_busysearch, | 1126 | TRACE_EVENT(xfs_alloc_busysearch, |
| 1117 | TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, | 1127 | TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, |
| 1118 | xfs_extlen_t len, xfs_lsn_t lsn), | 1128 | xfs_agblock_t agbno, xfs_extlen_t len, int found), |
| 1119 | TP_ARGS(mp, agno, agbno, len, lsn), | 1129 | TP_ARGS(mp, agno, agbno, len, found), |
| 1120 | TP_STRUCT__entry( | 1130 | TP_STRUCT__entry( |
| 1121 | __field(dev_t, dev) | 1131 | __field(dev_t, dev) |
| 1122 | __field(xfs_agnumber_t, agno) | 1132 | __field(xfs_agnumber_t, agno) |
| 1123 | __field(xfs_agblock_t, agbno) | 1133 | __field(xfs_agblock_t, agbno) |
| 1124 | __field(xfs_extlen_t, len) | 1134 | __field(xfs_extlen_t, len) |
| 1125 | __field(xfs_lsn_t, lsn) | 1135 | __field(int, found) |
| 1126 | ), | 1136 | ), |
| 1127 | TP_fast_assign( | 1137 | TP_fast_assign( |
| 1128 | __entry->dev = mp->m_super->s_dev; | 1138 | __entry->dev = mp->m_super->s_dev; |
| 1129 | __entry->agno = agno; | 1139 | __entry->agno = agno; |
| 1130 | __entry->agbno = agbno; | 1140 | __entry->agbno = agbno; |
| 1131 | __entry->len = len; | 1141 | __entry->len = len; |
| 1132 | __entry->lsn = lsn; | 1142 | __entry->found = found; |
| 1133 | ), | 1143 | ), |
| 1134 | TP_printk("dev %d:%d agno %u agbno %u len %u force lsn 0x%llx", | 1144 | TP_printk("dev %d:%d agno %u agbno %u len %u %s", |
| 1135 | MAJOR(__entry->dev), MINOR(__entry->dev), | 1145 | MAJOR(__entry->dev), MINOR(__entry->dev), |
| 1136 | __entry->agno, | 1146 | __entry->agno, |
| 1137 | __entry->agbno, | 1147 | __entry->agbno, |
| 1138 | __entry->len, | 1148 | __entry->len, |
| 1149 | __print_symbolic(__entry->found, XFS_BUSY_STATES)) | ||
| 1150 | ); | ||
| 1151 | |||
| 1152 | TRACE_EVENT(xfs_trans_commit_lsn, | ||
| 1153 | TP_PROTO(struct xfs_trans *trans), | ||
| 1154 | TP_ARGS(trans), | ||
| 1155 | TP_STRUCT__entry( | ||
| 1156 | __field(dev_t, dev) | ||
| 1157 | __field(struct xfs_trans *, tp) | ||
| 1158 | __field(xfs_lsn_t, lsn) | ||
| 1159 | ), | ||
| 1160 | TP_fast_assign( | ||
| 1161 | __entry->dev = trans->t_mountp->m_super->s_dev; | ||
| 1162 | __entry->tp = trans; | ||
| 1163 | __entry->lsn = trans->t_commit_lsn; | ||
| 1164 | ), | ||
| 1165 | TP_printk("dev %d:%d trans 0x%p commit_lsn 0x%llx", | ||
| 1166 | MAJOR(__entry->dev), MINOR(__entry->dev), | ||
| 1167 | __entry->tp, | ||
| 1139 | __entry->lsn) | 1168 | __entry->lsn) |
| 1140 | ); | 1169 | ); |
| 1141 | 1170 | ||
