|
@@ -3391,24 +3391,17 @@ xfs_log_ticket_get(
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Allocate and initialise a new log ticket.
|
|
|
+ * Figure out the total log space unit (in bytes) that would be
|
|
|
+ * required for a log ticket.
|
|
|
*/
|
|
|
-struct xlog_ticket *
|
|
|
-xlog_ticket_alloc(
|
|
|
- struct xlog *log,
|
|
|
- int unit_bytes,
|
|
|
- int cnt,
|
|
|
- char client,
|
|
|
- bool permanent,
|
|
|
- xfs_km_flags_t alloc_flags)
|
|
|
+int
|
|
|
+xfs_log_calc_unit_res(
|
|
|
+ struct xfs_mount *mp,
|
|
|
+ int unit_bytes)
|
|
|
{
|
|
|
- struct xlog_ticket *tic;
|
|
|
- uint num_headers;
|
|
|
- int iclog_space;
|
|
|
-
|
|
|
- tic = kmem_zone_zalloc(xfs_log_ticket_zone, alloc_flags);
|
|
|
- if (!tic)
|
|
|
- return NULL;
|
|
|
+ struct xlog *log = mp->m_log;
|
|
|
+ int iclog_space;
|
|
|
+ uint num_headers;
|
|
|
|
|
|
/*
|
|
|
* Permanent reservations have up to 'cnt'-1 active log operations
|
|
@@ -3483,20 +3476,43 @@ xlog_ticket_alloc(
|
|
|
unit_bytes += log->l_iclog_hsize;
|
|
|
|
|
|
/* for roundoff padding for transaction data and one for commit record */
|
|
|
- if (xfs_sb_version_haslogv2(&log->l_mp->m_sb) &&
|
|
|
- log->l_mp->m_sb.sb_logsunit > 1) {
|
|
|
+ if (xfs_sb_version_haslogv2(&mp->m_sb) && mp->m_sb.sb_logsunit > 1) {
|
|
|
/* log su roundoff */
|
|
|
- unit_bytes += 2*log->l_mp->m_sb.sb_logsunit;
|
|
|
+ unit_bytes += 2 * mp->m_sb.sb_logsunit;
|
|
|
} else {
|
|
|
/* BB roundoff */
|
|
|
- unit_bytes += 2*BBSIZE;
|
|
|
+ unit_bytes += 2 * BBSIZE;
|
|
|
}
|
|
|
|
|
|
+ return unit_bytes;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Allocate and initialise a new log ticket.
|
|
|
+ */
|
|
|
+struct xlog_ticket *
|
|
|
+xlog_ticket_alloc(
|
|
|
+ struct xlog *log,
|
|
|
+ int unit_bytes,
|
|
|
+ int cnt,
|
|
|
+ char client,
|
|
|
+ bool permanent,
|
|
|
+ xfs_km_flags_t alloc_flags)
|
|
|
+{
|
|
|
+ struct xlog_ticket *tic;
|
|
|
+ int unit_res;
|
|
|
+
|
|
|
+ tic = kmem_zone_zalloc(xfs_log_ticket_zone, alloc_flags);
|
|
|
+ if (!tic)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ unit_res = xfs_log_calc_unit_res(log->l_mp, unit_bytes);
|
|
|
+
|
|
|
atomic_set(&tic->t_ref, 1);
|
|
|
tic->t_task = current;
|
|
|
INIT_LIST_HEAD(&tic->t_queue);
|
|
|
- tic->t_unit_res = unit_bytes;
|
|
|
- tic->t_curr_res = unit_bytes;
|
|
|
+ tic->t_unit_res = unit_res;
|
|
|
+ tic->t_curr_res = unit_res;
|
|
|
tic->t_cnt = cnt;
|
|
|
tic->t_ocnt = cnt;
|
|
|
tic->t_tid = prandom_u32();
|