mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
xfs: cap the block count of xfs_iomap_write_direct() at one extent
xfs_iomap_write_direct() reserves blocks for the whole count in an
unsigned int. For a pNFS layout the client chooses that count, and an
RW LAYOUTGET for 16 TiB wraps the reservation and shuts XFS down.
xfs_bmapi_write() maps at most XFS_MAX_BMBT_EXTLEN blocks here, so cap
the count at that. nfsd asks again for the rest. The other callers get
the same mapping as before.
Suggested-by: Darrick J. Wong <djwong@kernel.org>
Suggested-by: Christoph Hellwig <hch@lst.de>
Suggested-by: Pankaj Raghav <p.raghav@samsung.com>
Fixes: 527851124d ("xfs: implement pNFS export operations")
Cc: stable@vger.kernel.org
Signed-off-by: Daejun Park <daejun7.park@samsung.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
parent
d8c2bc8846
commit
66d1ce09eb
|
|
@ -285,6 +285,14 @@ xfs_iomap_write_direct(
|
|||
|
||||
ASSERT(count_fsb > 0);
|
||||
|
||||
/*
|
||||
* xfs_bmapi_write() maps at most XFS_MAX_BMBT_EXTLEN blocks in one
|
||||
* mapping, so don't reserve blocks for more. A pNFS layout range
|
||||
* comes from a client, and its block count may not even fit the
|
||||
* 32-bit reservation. The caller maps the rest with a later call.
|
||||
*/
|
||||
count_fsb = min_t(xfs_filblks_t, count_fsb, XFS_MAX_BMBT_EXTLEN);
|
||||
|
||||
resaligned = xfs_aligned_fsb_count(offset_fsb, count_fsb,
|
||||
xfs_get_extsz_hint(ip));
|
||||
if (unlikely(XFS_IS_REALTIME_INODE(ip))) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user