aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_log.c
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2010-05-06 21:04:17 -0400
committerAlex Elder <aelder@sgi.com>2010-05-24 11:33:17 -0400
commit3383ca5780f88bb2c119174045ed77d5ece08072 (patch)
tree582aaa878f90af0e48941c3fcadbafe4c1a695f4 /fs/xfs/xfs_log.c
parent524ee36fa4661d745a467c3bba0e1034fd1f4b77 (diff)
xfs: allow log ticket allocation to take allocation flags
Delayed logging currently requires ticket allocation to succeed, so we need to be able to sleep on allocation. It also should not allow memory allocation to recurse into the filesystem. hence we need to pass allocation flags directing the type of allocation the caller requires. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Alex Elder <aelder@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_log.c')
-rw-r--r--fs/xfs/xfs_log.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 687b220c6af3..83be6a6aa0dc 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -88,11 +88,9 @@ STATIC void xlog_ungrant_log_space(xlog_t *log,
88 88
89 89
90/* local ticket functions */ 90/* local ticket functions */
91STATIC xlog_ticket_t *xlog_ticket_alloc(xlog_t *log, 91STATIC xlog_ticket_t *xlog_ticket_alloc(xlog_t *log, int unit_bytes, int count,
92 int unit_bytes, 92 char clientid, uint flags,
93 int count, 93 int alloc_flags);
94 char clientid,
95 uint flags);
96 94
97#if defined(DEBUG) 95#if defined(DEBUG)
98STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); 96STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr);
@@ -376,7 +374,8 @@ xfs_log_reserve(
376 } else { 374 } else {
377 /* may sleep if need to allocate more tickets */ 375 /* may sleep if need to allocate more tickets */
378 internal_ticket = xlog_ticket_alloc(log, unit_bytes, cnt, 376 internal_ticket = xlog_ticket_alloc(log, unit_bytes, cnt,
379 client, flags); 377 client, flags,
378 KM_SLEEP|KM_MAYFAIL);
380 if (!internal_ticket) 379 if (!internal_ticket)
381 return XFS_ERROR(ENOMEM); 380 return XFS_ERROR(ENOMEM);
382 internal_ticket->t_trans_type = t_type; 381 internal_ticket->t_trans_type = t_type;
@@ -3331,13 +3330,14 @@ xlog_ticket_alloc(
3331 int unit_bytes, 3330 int unit_bytes,
3332 int cnt, 3331 int cnt,
3333 char client, 3332 char client,
3334 uint xflags) 3333 uint xflags,
3334 int alloc_flags)
3335{ 3335{
3336 struct xlog_ticket *tic; 3336 struct xlog_ticket *tic;
3337 uint num_headers; 3337 uint num_headers;
3338 int iclog_space; 3338 int iclog_space;
3339 3339
3340 tic = kmem_zone_zalloc(xfs_log_ticket_zone, KM_SLEEP|KM_MAYFAIL); 3340 tic = kmem_zone_zalloc(xfs_log_ticket_zone, alloc_flags);
3341 if (!tic) 3341 if (!tic)
3342 return NULL; 3342 return NULL;
3343 3343