mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
Revert "xfs: use iomap_valid method to detect stale cached iomaps"
This reverts commitea67e73129which is commit304a68b9c6upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I371fe53ba28e2f032a4befb0f3e8d006d52a7167 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -4551,8 +4551,7 @@ xfs_bmapi_convert_delalloc(
|
||||
* the extent. Just return the real extent at this offset.
|
||||
*/
|
||||
if (!isnullstartblock(bma.got.br_startblock)) {
|
||||
xfs_bmbt_to_iomap(ip, iomap, &bma.got, 0, flags,
|
||||
xfs_iomap_inode_sequence(ip, flags));
|
||||
xfs_bmbt_to_iomap(ip, iomap, &bma.got, 0, flags);
|
||||
*seq = READ_ONCE(ifp->if_seq);
|
||||
goto out_trans_cancel;
|
||||
}
|
||||
@@ -4600,8 +4599,7 @@ xfs_bmapi_convert_delalloc(
|
||||
XFS_STATS_INC(mp, xs_xstrat_quick);
|
||||
|
||||
ASSERT(!isnullstartblock(bma.got.br_startblock));
|
||||
xfs_bmbt_to_iomap(ip, iomap, &bma.got, 0, flags,
|
||||
xfs_iomap_inode_sequence(ip, flags));
|
||||
xfs_bmbt_to_iomap(ip, iomap, &bma.got, 0, flags);
|
||||
*seq = READ_ONCE(ifp->if_seq);
|
||||
|
||||
if (whichfork == XFS_COW_FORK)
|
||||
|
||||
@@ -372,7 +372,7 @@ retry:
|
||||
isnullstartblock(imap.br_startblock))
|
||||
goto allocate_blocks;
|
||||
|
||||
xfs_bmbt_to_iomap(ip, &wpc->iomap, &imap, 0, 0, XFS_WPC(wpc)->data_seq);
|
||||
xfs_bmbt_to_iomap(ip, &wpc->iomap, &imap, 0, 0);
|
||||
trace_xfs_map_blocks_found(ip, offset, count, whichfork, &imap);
|
||||
return 0;
|
||||
allocate_blocks:
|
||||
|
||||
@@ -48,45 +48,13 @@ xfs_alert_fsblock_zero(
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
|
||||
u64
|
||||
xfs_iomap_inode_sequence(
|
||||
struct xfs_inode *ip,
|
||||
u16 iomap_flags)
|
||||
{
|
||||
u64 cookie = 0;
|
||||
|
||||
if (iomap_flags & IOMAP_F_XATTR)
|
||||
return READ_ONCE(ip->i_af.if_seq);
|
||||
if ((iomap_flags & IOMAP_F_SHARED) && ip->i_cowfp)
|
||||
cookie = (u64)READ_ONCE(ip->i_cowfp->if_seq) << 32;
|
||||
return cookie | READ_ONCE(ip->i_df.if_seq);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check that the iomap passed to us is still valid for the given offset and
|
||||
* length.
|
||||
*/
|
||||
static bool
|
||||
xfs_iomap_valid(
|
||||
struct inode *inode,
|
||||
const struct iomap *iomap)
|
||||
{
|
||||
return iomap->validity_cookie ==
|
||||
xfs_iomap_inode_sequence(XFS_I(inode), iomap->flags);
|
||||
}
|
||||
|
||||
const struct iomap_page_ops xfs_iomap_page_ops = {
|
||||
.iomap_valid = xfs_iomap_valid,
|
||||
};
|
||||
|
||||
int
|
||||
xfs_bmbt_to_iomap(
|
||||
struct xfs_inode *ip,
|
||||
struct iomap *iomap,
|
||||
struct xfs_bmbt_irec *imap,
|
||||
unsigned int mapping_flags,
|
||||
u16 iomap_flags,
|
||||
u64 sequence_cookie)
|
||||
u16 iomap_flags)
|
||||
{
|
||||
struct xfs_mount *mp = ip->i_mount;
|
||||
struct xfs_buftarg *target = xfs_inode_buftarg(ip);
|
||||
@@ -123,9 +91,6 @@ xfs_bmbt_to_iomap(
|
||||
if (xfs_ipincount(ip) &&
|
||||
(ip->i_itemp->ili_fsync_fields & ~XFS_ILOG_TIMESTAMP))
|
||||
iomap->flags |= IOMAP_F_DIRTY;
|
||||
|
||||
iomap->validity_cookie = sequence_cookie;
|
||||
iomap->page_ops = &xfs_iomap_page_ops;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -230,8 +195,7 @@ xfs_iomap_write_direct(
|
||||
xfs_fileoff_t offset_fsb,
|
||||
xfs_fileoff_t count_fsb,
|
||||
unsigned int flags,
|
||||
struct xfs_bmbt_irec *imap,
|
||||
u64 *seq)
|
||||
struct xfs_bmbt_irec *imap)
|
||||
{
|
||||
struct xfs_mount *mp = ip->i_mount;
|
||||
struct xfs_trans *tp;
|
||||
@@ -321,7 +285,6 @@ xfs_iomap_write_direct(
|
||||
error = xfs_alert_fsblock_zero(ip, imap);
|
||||
|
||||
out_unlock:
|
||||
*seq = xfs_iomap_inode_sequence(ip, 0);
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
return error;
|
||||
|
||||
@@ -780,7 +743,6 @@ xfs_direct_write_iomap_begin(
|
||||
bool shared = false;
|
||||
u16 iomap_flags = 0;
|
||||
unsigned int lockmode = XFS_ILOCK_SHARED;
|
||||
u64 seq;
|
||||
|
||||
ASSERT(flags & (IOMAP_WRITE | IOMAP_ZERO));
|
||||
|
||||
@@ -849,10 +811,9 @@ xfs_direct_write_iomap_begin(
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
seq = xfs_iomap_inode_sequence(ip, iomap_flags);
|
||||
xfs_iunlock(ip, lockmode);
|
||||
trace_xfs_iomap_found(ip, offset, length, XFS_DATA_FORK, &imap);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, iomap_flags, seq);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, iomap_flags);
|
||||
|
||||
allocate_blocks:
|
||||
error = -EAGAIN;
|
||||
@@ -878,26 +839,24 @@ allocate_blocks:
|
||||
xfs_iunlock(ip, lockmode);
|
||||
|
||||
error = xfs_iomap_write_direct(ip, offset_fsb, end_fsb - offset_fsb,
|
||||
flags, &imap, &seq);
|
||||
flags, &imap);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
trace_xfs_iomap_alloc(ip, offset, length, XFS_DATA_FORK, &imap);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &imap, flags,
|
||||
iomap_flags | IOMAP_F_NEW, seq);
|
||||
iomap_flags | IOMAP_F_NEW);
|
||||
|
||||
out_found_cow:
|
||||
xfs_iunlock(ip, lockmode);
|
||||
length = XFS_FSB_TO_B(mp, cmap.br_startoff + cmap.br_blockcount);
|
||||
trace_xfs_iomap_found(ip, offset, length - offset, XFS_COW_FORK, &cmap);
|
||||
if (imap.br_startblock != HOLESTARTBLOCK) {
|
||||
seq = xfs_iomap_inode_sequence(ip, 0);
|
||||
error = xfs_bmbt_to_iomap(ip, srcmap, &imap, flags, 0, seq);
|
||||
error = xfs_bmbt_to_iomap(ip, srcmap, &imap, flags, 0);
|
||||
if (error)
|
||||
goto out_unlock;
|
||||
return error;
|
||||
}
|
||||
seq = xfs_iomap_inode_sequence(ip, IOMAP_F_SHARED);
|
||||
xfs_iunlock(ip, lockmode);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &cmap, flags, IOMAP_F_SHARED, seq);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &cmap, flags, IOMAP_F_SHARED);
|
||||
|
||||
out_unlock:
|
||||
if (lockmode)
|
||||
@@ -956,7 +915,6 @@ xfs_buffered_write_iomap_begin(
|
||||
int allocfork = XFS_DATA_FORK;
|
||||
int error = 0;
|
||||
unsigned int lockmode = XFS_ILOCK_EXCL;
|
||||
u64 seq;
|
||||
|
||||
if (xfs_is_shutdown(mp))
|
||||
return -EIO;
|
||||
@@ -1136,31 +1094,26 @@ retry:
|
||||
* Flag newly allocated delalloc blocks with IOMAP_F_NEW so we punch
|
||||
* them out if the write happens to fail.
|
||||
*/
|
||||
seq = xfs_iomap_inode_sequence(ip, IOMAP_F_NEW);
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
trace_xfs_iomap_alloc(ip, offset, count, allocfork, &imap);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, IOMAP_F_NEW, seq);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, IOMAP_F_NEW);
|
||||
|
||||
found_imap:
|
||||
seq = xfs_iomap_inode_sequence(ip, 0);
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, 0, seq);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, 0);
|
||||
|
||||
found_cow:
|
||||
seq = xfs_iomap_inode_sequence(ip, 0);
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
if (imap.br_startoff <= offset_fsb) {
|
||||
error = xfs_bmbt_to_iomap(ip, srcmap, &imap, flags, 0, seq);
|
||||
error = xfs_bmbt_to_iomap(ip, srcmap, &imap, flags, 0);
|
||||
if (error)
|
||||
goto out_unlock;
|
||||
seq = xfs_iomap_inode_sequence(ip, IOMAP_F_SHARED);
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
return error;
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &cmap, flags,
|
||||
IOMAP_F_SHARED, seq);
|
||||
IOMAP_F_SHARED);
|
||||
}
|
||||
|
||||
xfs_trim_extent(&cmap, offset_fsb, imap.br_startoff - offset_fsb);
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &cmap, flags, 0, seq);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &cmap, flags, 0);
|
||||
|
||||
out_unlock:
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
@@ -1231,7 +1184,6 @@ xfs_read_iomap_begin(
|
||||
int nimaps = 1, error = 0;
|
||||
bool shared = false;
|
||||
unsigned int lockmode = XFS_ILOCK_SHARED;
|
||||
u64 seq;
|
||||
|
||||
ASSERT(!(flags & (IOMAP_WRITE | IOMAP_ZERO)));
|
||||
|
||||
@@ -1245,14 +1197,13 @@ xfs_read_iomap_begin(
|
||||
&nimaps, 0);
|
||||
if (!error && (flags & IOMAP_REPORT))
|
||||
error = xfs_reflink_trim_around_shared(ip, &imap, &shared);
|
||||
seq = xfs_iomap_inode_sequence(ip, shared ? IOMAP_F_SHARED : 0);
|
||||
xfs_iunlock(ip, lockmode);
|
||||
|
||||
if (error)
|
||||
return error;
|
||||
trace_xfs_iomap_found(ip, offset, length, XFS_DATA_FORK, &imap);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &imap, flags,
|
||||
shared ? IOMAP_F_SHARED : 0, seq);
|
||||
shared ? IOMAP_F_SHARED : 0);
|
||||
}
|
||||
|
||||
const struct iomap_ops xfs_read_iomap_ops = {
|
||||
@@ -1277,7 +1228,6 @@ xfs_seek_iomap_begin(
|
||||
struct xfs_bmbt_irec imap, cmap;
|
||||
int error = 0;
|
||||
unsigned lockmode;
|
||||
u64 seq;
|
||||
|
||||
if (xfs_is_shutdown(mp))
|
||||
return -EIO;
|
||||
@@ -1312,9 +1262,8 @@ xfs_seek_iomap_begin(
|
||||
if (data_fsb < cow_fsb + cmap.br_blockcount)
|
||||
end_fsb = min(end_fsb, data_fsb);
|
||||
xfs_trim_extent(&cmap, offset_fsb, end_fsb);
|
||||
seq = xfs_iomap_inode_sequence(ip, IOMAP_F_SHARED);
|
||||
error = xfs_bmbt_to_iomap(ip, iomap, &cmap, flags,
|
||||
IOMAP_F_SHARED, seq);
|
||||
IOMAP_F_SHARED);
|
||||
/*
|
||||
* This is a COW extent, so we must probe the page cache
|
||||
* because there could be dirty page cache being backed
|
||||
@@ -1335,9 +1284,8 @@ xfs_seek_iomap_begin(
|
||||
imap.br_startblock = HOLESTARTBLOCK;
|
||||
imap.br_state = XFS_EXT_NORM;
|
||||
done:
|
||||
seq = xfs_iomap_inode_sequence(ip, 0);
|
||||
xfs_trim_extent(&imap, offset_fsb, end_fsb);
|
||||
error = xfs_bmbt_to_iomap(ip, iomap, &imap, flags, 0, seq);
|
||||
error = xfs_bmbt_to_iomap(ip, iomap, &imap, flags, 0);
|
||||
out_unlock:
|
||||
xfs_iunlock(ip, lockmode);
|
||||
return error;
|
||||
@@ -1363,7 +1311,6 @@ xfs_xattr_iomap_begin(
|
||||
struct xfs_bmbt_irec imap;
|
||||
int nimaps = 1, error = 0;
|
||||
unsigned lockmode;
|
||||
int seq;
|
||||
|
||||
if (xfs_is_shutdown(mp))
|
||||
return -EIO;
|
||||
@@ -1380,14 +1327,12 @@ xfs_xattr_iomap_begin(
|
||||
error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap,
|
||||
&nimaps, XFS_BMAPI_ATTRFORK);
|
||||
out_unlock:
|
||||
|
||||
seq = xfs_iomap_inode_sequence(ip, IOMAP_F_XATTR);
|
||||
xfs_iunlock(ip, lockmode);
|
||||
|
||||
if (error)
|
||||
return error;
|
||||
ASSERT(nimaps);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, IOMAP_F_XATTR, seq);
|
||||
return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, 0);
|
||||
}
|
||||
|
||||
const struct iomap_ops xfs_xattr_iomap_ops = {
|
||||
|
||||
@@ -13,15 +13,14 @@ struct xfs_bmbt_irec;
|
||||
|
||||
int xfs_iomap_write_direct(struct xfs_inode *ip, xfs_fileoff_t offset_fsb,
|
||||
xfs_fileoff_t count_fsb, unsigned int flags,
|
||||
struct xfs_bmbt_irec *imap, u64 *sequence);
|
||||
struct xfs_bmbt_irec *imap);
|
||||
int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, xfs_off_t, bool);
|
||||
xfs_fileoff_t xfs_iomap_eof_align_last_fsb(struct xfs_inode *ip,
|
||||
xfs_fileoff_t end_fsb);
|
||||
|
||||
u64 xfs_iomap_inode_sequence(struct xfs_inode *ip, u16 iomap_flags);
|
||||
int xfs_bmbt_to_iomap(struct xfs_inode *ip, struct iomap *iomap,
|
||||
struct xfs_bmbt_irec *imap, unsigned int mapping_flags,
|
||||
u16 iomap_flags, u64 sequence_cookie);
|
||||
u16 iomap_flags);
|
||||
|
||||
int xfs_zero_range(struct xfs_inode *ip, loff_t pos, loff_t len,
|
||||
bool *did_zero);
|
||||
|
||||
@@ -125,7 +125,6 @@ xfs_fs_map_blocks(
|
||||
int nimaps = 1;
|
||||
uint lock_flags;
|
||||
int error = 0;
|
||||
u64 seq;
|
||||
|
||||
if (xfs_is_shutdown(mp))
|
||||
return -EIO;
|
||||
@@ -177,7 +176,6 @@ xfs_fs_map_blocks(
|
||||
lock_flags = xfs_ilock_data_map_shared(ip);
|
||||
error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb,
|
||||
&imap, &nimaps, bmapi_flags);
|
||||
seq = xfs_iomap_inode_sequence(ip, 0);
|
||||
|
||||
ASSERT(!nimaps || imap.br_startblock != DELAYSTARTBLOCK);
|
||||
|
||||
@@ -191,7 +189,7 @@ xfs_fs_map_blocks(
|
||||
xfs_iunlock(ip, lock_flags);
|
||||
|
||||
error = xfs_iomap_write_direct(ip, offset_fsb,
|
||||
end_fsb - offset_fsb, 0, &imap, &seq);
|
||||
end_fsb - offset_fsb, 0, &imap);
|
||||
if (error)
|
||||
goto out_unlock;
|
||||
|
||||
@@ -211,7 +209,7 @@ xfs_fs_map_blocks(
|
||||
}
|
||||
xfs_iunlock(ip, XFS_IOLOCK_EXCL);
|
||||
|
||||
error = xfs_bmbt_to_iomap(ip, iomap, &imap, 0, 0, seq);
|
||||
error = xfs_bmbt_to_iomap(ip, iomap, &imap, 0, 0);
|
||||
*device_generation = mp->m_generation;
|
||||
return error;
|
||||
out_unlock:
|
||||
|
||||
Reference in New Issue
Block a user