aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2010-09-24 06:07:47 -0400
committerAlex Elder <aelder@sgi.com>2010-10-18 16:07:46 -0400
commit686865f76e35b28ba7aa6afa19209426f0da6201 (patch)
tree49f0ea4c6cb6ec4c71d1bce041ab21bbcd4920c8 /fs/xfs
parentdcd79a1423f64ee0184629874805c3ac40f3a2c5 (diff)
xfs: rename xfs_buf_get_nodaddr to be more appropriate
xfs_buf_get_nodaddr() is really used to allocate a buffer that is uncached. While it is not directly assigned a disk address, the fact that they are not cached is a more important distinction. With the upcoming uncached buffer read primitive, we should be consistent with this disctinction. While there, make page allocation in xfs_buf_get_nodaddr() safe against memory reclaim re-entrancy into the filesystem by allowing a flags parameter to be passed. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Alex Elder <aelder@sgi.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/linux-2.6/xfs_buf.c9
-rw-r--r--fs/xfs/linux-2.6/xfs_buf.h2
-rw-r--r--fs/xfs/linux-2.6/xfs_trace.h2
-rw-r--r--fs/xfs/xfs_log.c3
-rw-r--r--fs/xfs/xfs_log_recover.c3
-rw-r--r--fs/xfs/xfs_vnodeops.c6
6 files changed, 14 insertions, 11 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
index 286e36e21da..eca945b0f88 100644
--- a/fs/xfs/linux-2.6/xfs_buf.c
+++ b/fs/xfs/linux-2.6/xfs_buf.c
@@ -707,9 +707,10 @@ xfs_buf_associate_memory(
707} 707}
708 708
709xfs_buf_t * 709xfs_buf_t *
710xfs_buf_get_noaddr( 710xfs_buf_get_uncached(
711 struct xfs_buftarg *target,
711 size_t len, 712 size_t len,
712 xfs_buftarg_t *target) 713 int flags)
713{ 714{
714 unsigned long page_count = PAGE_ALIGN(len) >> PAGE_SHIFT; 715 unsigned long page_count = PAGE_ALIGN(len) >> PAGE_SHIFT;
715 int error, i; 716 int error, i;
@@ -725,7 +726,7 @@ xfs_buf_get_noaddr(
725 goto fail_free_buf; 726 goto fail_free_buf;
726 727
727 for (i = 0; i < page_count; i++) { 728 for (i = 0; i < page_count; i++) {
728 bp->b_pages[i] = alloc_page(GFP_KERNEL); 729 bp->b_pages[i] = alloc_page(xb_to_gfp(flags));
729 if (!bp->b_pages[i]) 730 if (!bp->b_pages[i])
730 goto fail_free_mem; 731 goto fail_free_mem;
731 } 732 }
@@ -740,7 +741,7 @@ xfs_buf_get_noaddr(
740 741
741 xfs_buf_unlock(bp); 742 xfs_buf_unlock(bp);
742 743
743 trace_xfs_buf_get_noaddr(bp, _RET_IP_); 744 trace_xfs_buf_get_uncached(bp, _RET_IP_);
744 return bp; 745 return bp;
745 746
746 fail_free_mem: 747 fail_free_mem:
diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h
index 2a05614f0b9..fb30447091d 100644
--- a/fs/xfs/linux-2.6/xfs_buf.h
+++ b/fs/xfs/linux-2.6/xfs_buf.h
@@ -213,7 +213,7 @@ extern xfs_buf_t *xfs_buf_read(xfs_buftarg_t *, xfs_off_t, size_t,
213 xfs_buf_flags_t); 213 xfs_buf_flags_t);
214 214
215extern xfs_buf_t *xfs_buf_get_empty(size_t, xfs_buftarg_t *); 215extern xfs_buf_t *xfs_buf_get_empty(size_t, xfs_buftarg_t *);
216extern xfs_buf_t *xfs_buf_get_noaddr(size_t, xfs_buftarg_t *); 216extern xfs_buf_t *xfs_buf_get_uncached(struct xfs_buftarg *, size_t, int);
217extern int xfs_buf_associate_memory(xfs_buf_t *, void *, size_t); 217extern int xfs_buf_associate_memory(xfs_buf_t *, void *, size_t);
218extern void xfs_buf_hold(xfs_buf_t *); 218extern void xfs_buf_hold(xfs_buf_t *);
219extern void xfs_buf_readahead(xfs_buftarg_t *, xfs_off_t, size_t, 219extern void xfs_buf_readahead(xfs_buftarg_t *, xfs_off_t, size_t,
diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h
index be5dffd282a..2a1d4fbd9ed 100644
--- a/fs/xfs/linux-2.6/xfs_trace.h
+++ b/fs/xfs/linux-2.6/xfs_trace.h
@@ -331,7 +331,7 @@ DEFINE_BUF_EVENT(xfs_buf_iowait_done);
331DEFINE_BUF_EVENT(xfs_buf_delwri_queue); 331DEFINE_BUF_EVENT(xfs_buf_delwri_queue);
332DEFINE_BUF_EVENT(xfs_buf_delwri_dequeue); 332DEFINE_BUF_EVENT(xfs_buf_delwri_dequeue);
333DEFINE_BUF_EVENT(xfs_buf_delwri_split); 333DEFINE_BUF_EVENT(xfs_buf_delwri_split);
334DEFINE_BUF_EVENT(xfs_buf_get_noaddr); 334DEFINE_BUF_EVENT(xfs_buf_get_uncached);
335DEFINE_BUF_EVENT(xfs_bdstrat_shut); 335DEFINE_BUF_EVENT(xfs_bdstrat_shut);
336DEFINE_BUF_EVENT(xfs_buf_item_relse); 336DEFINE_BUF_EVENT(xfs_buf_item_relse);
337DEFINE_BUF_EVENT(xfs_buf_item_iodone); 337DEFINE_BUF_EVENT(xfs_buf_item_iodone);
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 33f718f92a4..c8a30942430 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -1131,7 +1131,8 @@ xlog_alloc_log(xfs_mount_t *mp,
1131 iclog->ic_prev = prev_iclog; 1131 iclog->ic_prev = prev_iclog;
1132 prev_iclog = iclog; 1132 prev_iclog = iclog;
1133 1133
1134 bp = xfs_buf_get_noaddr(log->l_iclog_size, mp->m_logdev_targp); 1134 bp = xfs_buf_get_uncached(mp->m_logdev_targp,
1135 log->l_iclog_size, 0);
1135 if (!bp) 1136 if (!bp)
1136 goto out_free_iclog; 1137 goto out_free_iclog;
1137 if (!XFS_BUF_CPSEMA(bp)) 1138 if (!XFS_BUF_CPSEMA(bp))
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 6f3f5fa37ac..3d887542b03 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -107,7 +107,8 @@ xlog_get_bp(
107 nbblks += log->l_sectBBsize; 107 nbblks += log->l_sectBBsize;
108 nbblks = round_up(nbblks, log->l_sectBBsize); 108 nbblks = round_up(nbblks, log->l_sectBBsize);
109 109
110 return xfs_buf_get_noaddr(BBTOB(nbblks), log->l_mp->m_logdev_targp); 110 return xfs_buf_get_uncached(log->l_mp->m_logdev_targp,
111 BBTOB(nbblks), 0);
111} 112}
112 113
113STATIC void 114STATIC void
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c
index a230cd4d077..b7bdc43308e 100644
--- a/fs/xfs/xfs_vnodeops.c
+++ b/fs/xfs/xfs_vnodeops.c
@@ -2434,9 +2434,9 @@ xfs_zero_remaining_bytes(
2434 if (endoff > ip->i_size) 2434 if (endoff > ip->i_size)
2435 endoff = ip->i_size; 2435 endoff = ip->i_size;
2436 2436
2437 bp = xfs_buf_get_noaddr(mp->m_sb.sb_blocksize, 2437 bp = xfs_buf_get_uncached(XFS_IS_REALTIME_INODE(ip) ?
2438 XFS_IS_REALTIME_INODE(ip) ? 2438 mp->m_rtdev_targp : mp->m_ddev_targp,
2439 mp->m_rtdev_targp : mp->m_ddev_targp); 2439 mp->m_sb.sb_blocksize, XBF_DONT_BLOCK);
2440 if (!bp) 2440 if (!bp)
2441 return XFS_ERROR(ENOMEM); 2441 return XFS_ERROR(ENOMEM);
2442 2442