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>
This commit is contained in:
parent
dcd79a1423
commit
686865f76e
6 changed files with 14 additions and 11 deletions
|
@ -707,9 +707,10 @@ xfs_buf_associate_memory(
|
|||
}
|
||||
|
||||
xfs_buf_t *
|
||||
xfs_buf_get_noaddr(
|
||||
xfs_buf_get_uncached(
|
||||
struct xfs_buftarg *target,
|
||||
size_t len,
|
||||
xfs_buftarg_t *target)
|
||||
int flags)
|
||||
{
|
||||
unsigned long page_count = PAGE_ALIGN(len) >> PAGE_SHIFT;
|
||||
int error, i;
|
||||
|
@ -725,7 +726,7 @@ xfs_buf_get_noaddr(
|
|||
goto fail_free_buf;
|
||||
|
||||
for (i = 0; i < page_count; i++) {
|
||||
bp->b_pages[i] = alloc_page(GFP_KERNEL);
|
||||
bp->b_pages[i] = alloc_page(xb_to_gfp(flags));
|
||||
if (!bp->b_pages[i])
|
||||
goto fail_free_mem;
|
||||
}
|
||||
|
@ -740,7 +741,7 @@ xfs_buf_get_noaddr(
|
|||
|
||||
xfs_buf_unlock(bp);
|
||||
|
||||
trace_xfs_buf_get_noaddr(bp, _RET_IP_);
|
||||
trace_xfs_buf_get_uncached(bp, _RET_IP_);
|
||||
return bp;
|
||||
|
||||
fail_free_mem:
|
||||
|
|
|
@ -213,7 +213,7 @@ extern xfs_buf_t *xfs_buf_read(xfs_buftarg_t *, xfs_off_t, size_t,
|
|||
xfs_buf_flags_t);
|
||||
|
||||
extern xfs_buf_t *xfs_buf_get_empty(size_t, xfs_buftarg_t *);
|
||||
extern xfs_buf_t *xfs_buf_get_noaddr(size_t, xfs_buftarg_t *);
|
||||
extern xfs_buf_t *xfs_buf_get_uncached(struct xfs_buftarg *, size_t, int);
|
||||
extern int xfs_buf_associate_memory(xfs_buf_t *, void *, size_t);
|
||||
extern void xfs_buf_hold(xfs_buf_t *);
|
||||
extern void xfs_buf_readahead(xfs_buftarg_t *, xfs_off_t, size_t,
|
||||
|
|
|
@ -331,7 +331,7 @@ DEFINE_BUF_EVENT(xfs_buf_iowait_done);
|
|||
DEFINE_BUF_EVENT(xfs_buf_delwri_queue);
|
||||
DEFINE_BUF_EVENT(xfs_buf_delwri_dequeue);
|
||||
DEFINE_BUF_EVENT(xfs_buf_delwri_split);
|
||||
DEFINE_BUF_EVENT(xfs_buf_get_noaddr);
|
||||
DEFINE_BUF_EVENT(xfs_buf_get_uncached);
|
||||
DEFINE_BUF_EVENT(xfs_bdstrat_shut);
|
||||
DEFINE_BUF_EVENT(xfs_buf_item_relse);
|
||||
DEFINE_BUF_EVENT(xfs_buf_item_iodone);
|
||||
|
|
|
@ -1131,7 +1131,8 @@ xlog_alloc_log(xfs_mount_t *mp,
|
|||
iclog->ic_prev = prev_iclog;
|
||||
prev_iclog = iclog;
|
||||
|
||||
bp = xfs_buf_get_noaddr(log->l_iclog_size, mp->m_logdev_targp);
|
||||
bp = xfs_buf_get_uncached(mp->m_logdev_targp,
|
||||
log->l_iclog_size, 0);
|
||||
if (!bp)
|
||||
goto out_free_iclog;
|
||||
if (!XFS_BUF_CPSEMA(bp))
|
||||
|
|
|
@ -107,7 +107,8 @@ xlog_get_bp(
|
|||
nbblks += log->l_sectBBsize;
|
||||
nbblks = round_up(nbblks, log->l_sectBBsize);
|
||||
|
||||
return xfs_buf_get_noaddr(BBTOB(nbblks), log->l_mp->m_logdev_targp);
|
||||
return xfs_buf_get_uncached(log->l_mp->m_logdev_targp,
|
||||
BBTOB(nbblks), 0);
|
||||
}
|
||||
|
||||
STATIC void
|
||||
|
|
|
@ -2434,9 +2434,9 @@ xfs_zero_remaining_bytes(
|
|||
if (endoff > ip->i_size)
|
||||
endoff = ip->i_size;
|
||||
|
||||
bp = xfs_buf_get_noaddr(mp->m_sb.sb_blocksize,
|
||||
XFS_IS_REALTIME_INODE(ip) ?
|
||||
mp->m_rtdev_targp : mp->m_ddev_targp);
|
||||
bp = xfs_buf_get_uncached(XFS_IS_REALTIME_INODE(ip) ?
|
||||
mp->m_rtdev_targp : mp->m_ddev_targp,
|
||||
mp->m_sb.sb_blocksize, XBF_DONT_BLOCK);
|
||||
if (!bp)
|
||||
return XFS_ERROR(ENOMEM);
|
||||
|
||||
|
|
Loading…
Reference in a new issue