From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Christoph Hellwig <hch@lst.de>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 5/8] xfs: simplify the xfs_iomap_write_direct calling conventions
Date: Mon, 28 Oct 2019 09:25:29 -0700 [thread overview]
Message-ID: <20191028162529.GE15222@magnolia> (raw)
In-Reply-To: <20191025150336.19411-6-hch@lst.de>
On Fri, Oct 25, 2019 at 05:03:33PM +0200, Christoph Hellwig wrote:
> Move the EOF alignment and checking for the next allocated extent into
> the callers to avoid the need to pass the byte based offset and count
> as well as looking at the incoming imap. The added benefit is that
> the caller can unlock the incoming ilock and the function doesn't have
> funny unbalanced locking contexts.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
Looks ok, though it took me a while to figure out the old unlocking
strategy well enough to compare it to the new one. :)
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
--D
> ---
> fs/xfs/xfs_iomap.c | 82 ++++++++++++++++------------------------------
> fs/xfs/xfs_iomap.h | 6 ++--
> fs/xfs/xfs_pnfs.c | 25 +++++++-------
> 3 files changed, 45 insertions(+), 68 deletions(-)
>
> diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
> index e3b11cda447e..4af50b101d2b 100644
> --- a/fs/xfs/xfs_iomap.c
> +++ b/fs/xfs/xfs_iomap.c
> @@ -148,7 +148,7 @@ xfs_eof_alignment(
> * Check if last_fsb is outside the last extent, and if so grow it to the next
> * stripe unit boundary.
> */
> -static xfs_fileoff_t
> +xfs_fileoff_t
> xfs_iomap_eof_align_last_fsb(
> struct xfs_inode *ip,
> xfs_fileoff_t end_fsb)
> @@ -185,61 +185,36 @@ xfs_iomap_eof_align_last_fsb(
>
> int
> xfs_iomap_write_direct(
> - xfs_inode_t *ip,
> - xfs_off_t offset,
> - size_t count,
> - xfs_bmbt_irec_t *imap,
> - int nmaps)
> + struct xfs_inode *ip,
> + xfs_fileoff_t offset_fsb,
> + xfs_fileoff_t count_fsb,
> + struct xfs_bmbt_irec *imap)
> {
> - xfs_mount_t *mp = ip->i_mount;
> - xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset);
> - xfs_fileoff_t last_fsb = xfs_iomap_end_fsb(mp, offset, count);
> - xfs_filblks_t count_fsb, resaligned;
> - xfs_extlen_t extsz;
> - int nimaps;
> - int quota_flag;
> - int rt;
> - xfs_trans_t *tp;
> - uint qblocks, resblks, resrtextents;
> - int error;
> - int lockmode;
> - int bmapi_flags = XFS_BMAPI_PREALLOC;
> - uint tflags = 0;
> -
> - rt = XFS_IS_REALTIME_INODE(ip);
> - extsz = xfs_get_extsz_hint(ip);
> - lockmode = XFS_ILOCK_SHARED; /* locked by caller */
> -
> - ASSERT(xfs_isilocked(ip, lockmode));
> + struct xfs_mount *mp = ip->i_mount;
> + struct xfs_trans *tp;
> + xfs_filblks_t resaligned;
> + int nimaps;
> + int quota_flag;
> + uint qblocks, resblks;
> + unsigned int resrtextents = 0;
> + int error;
> + int bmapi_flags = XFS_BMAPI_PREALLOC;
> + uint tflags = 0;
>
> - if (offset + count > XFS_ISIZE(ip)) {
> - last_fsb = xfs_iomap_eof_align_last_fsb(ip, last_fsb);
> - } else {
> - if (nmaps && (imap->br_startblock == HOLESTARTBLOCK))
> - last_fsb = min(last_fsb, (xfs_fileoff_t)
> - imap->br_blockcount +
> - imap->br_startoff);
> - }
> - count_fsb = last_fsb - offset_fsb;
> ASSERT(count_fsb > 0);
> - resaligned = xfs_aligned_fsb_count(offset_fsb, count_fsb, extsz);
>
> - if (unlikely(rt)) {
> + resaligned = xfs_aligned_fsb_count(offset_fsb, count_fsb,
> + xfs_get_extsz_hint(ip));
> + if (unlikely(XFS_IS_REALTIME_INODE(ip))) {
> resrtextents = qblocks = resaligned;
> resrtextents /= mp->m_sb.sb_rextsize;
> resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0);
> quota_flag = XFS_QMOPT_RES_RTBLKS;
> } else {
> - resrtextents = 0;
> resblks = qblocks = XFS_DIOSTRAT_SPACE_RES(mp, resaligned);
> quota_flag = XFS_QMOPT_RES_REGBLKS;
> }
>
> - /*
> - * Drop the shared lock acquired by the caller, attach the dquot if
> - * necessary and move on to transaction setup.
> - */
> - xfs_iunlock(ip, lockmode);
> error = xfs_qm_dqattach(ip);
> if (error)
> return error;
> @@ -269,8 +244,7 @@ xfs_iomap_write_direct(
> if (error)
> return error;
>
> - lockmode = XFS_ILOCK_EXCL;
> - xfs_ilock(ip, lockmode);
> + xfs_ilock(ip, XFS_ILOCK_EXCL);
>
> error = xfs_trans_reserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
> if (error)
> @@ -307,7 +281,7 @@ xfs_iomap_write_direct(
> error = xfs_alert_fsblock_zero(ip, imap);
>
> out_unlock:
> - xfs_iunlock(ip, lockmode);
> + xfs_iunlock(ip, XFS_ILOCK_EXCL);
> return error;
>
> out_res_cancel:
> @@ -807,14 +781,16 @@ xfs_direct_write_iomap_begin(
> * lower level functions are updated.
> */
> length = min_t(loff_t, length, 1024 * PAGE_SIZE);
> + end_fsb = xfs_iomap_end_fsb(mp, offset, length);
>
> - /*
> - * xfs_iomap_write_direct() expects the shared lock. It is unlocked on
> - * return.
> - */
> - if (lockmode == XFS_ILOCK_EXCL)
> - xfs_ilock_demote(ip, lockmode);
> - error = xfs_iomap_write_direct(ip, offset, length, &imap, nimaps);
> + if (offset + length > XFS_ISIZE(ip))
> + end_fsb = xfs_iomap_eof_align_last_fsb(ip, end_fsb);
> + else if (nimaps && imap.br_startblock == HOLESTARTBLOCK)
> + end_fsb = min(end_fsb, imap.br_startoff + imap.br_blockcount);
> + xfs_iunlock(ip, lockmode);
> +
> + error = xfs_iomap_write_direct(ip, offset_fsb, end_fsb - offset_fsb,
> + &imap);
> if (error)
> return error;
>
> diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h
> index d5b292bdaf82..7d3703556d0e 100644
> --- a/fs/xfs/xfs_iomap.h
> +++ b/fs/xfs/xfs_iomap.h
> @@ -11,9 +11,11 @@
> struct xfs_inode;
> struct xfs_bmbt_irec;
>
> -int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t,
> - struct xfs_bmbt_irec *, int);
> +int xfs_iomap_write_direct(struct xfs_inode *ip, xfs_fileoff_t offset_fsb,
> + xfs_fileoff_t count_fsb, 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);
>
> int xfs_bmbt_to_iomap(struct xfs_inode *, struct iomap *,
> struct xfs_bmbt_irec *, u16);
> diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c
> index fa90c6334c7c..f64996ca4870 100644
> --- a/fs/xfs/xfs_pnfs.c
> +++ b/fs/xfs/xfs_pnfs.c
> @@ -142,22 +142,19 @@ 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);
> - xfs_iunlock(ip, lock_flags);
> -
> - if (error)
> - goto out_unlock;
> -
> - if (write &&
> + if (!error && write &&
> (!nimaps || imap.br_startblock == HOLESTARTBLOCK)) {
> ASSERT(imap.br_startblock != DELAYSTARTBLOCK);
>
> - /*
> - * xfs_iomap_write_direct() expects to take ownership of the
> - * shared ilock.
> - */
> - xfs_ilock(ip, XFS_ILOCK_SHARED);
> - error = xfs_iomap_write_direct(ip, offset, length, &imap,
> - nimaps);
> + if (offset + length > XFS_ISIZE(ip))
> + end_fsb = xfs_iomap_eof_align_last_fsb(ip, end_fsb);
> + else if (nimaps && imap.br_startblock == HOLESTARTBLOCK)
> + end_fsb = min(end_fsb, imap.br_startoff +
> + imap.br_blockcount);
> + xfs_iunlock(ip, lock_flags);
> +
> + error = xfs_iomap_write_direct(ip, offset_fsb,
> + end_fsb - offset_fsb, &imap);
> if (error)
> goto out_unlock;
>
> @@ -170,6 +167,8 @@ xfs_fs_map_blocks(
> XFS_PREALLOC_SET | XFS_PREALLOC_SYNC);
> if (error)
> goto out_unlock;
> + } else {
> + xfs_iunlock(ip, lock_flags);
> }
> xfs_iunlock(ip, XFS_IOLOCK_EXCL);
>
> --
> 2.20.1
>
next prev parent reply other threads:[~2019-10-28 16:27 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-25 15:03 a few iomap / bmap cleanups Christoph Hellwig
2019-10-25 15:03 ` [PATCH 1/8] xfs: simplify xfs_iomap_eof_align_last_fsb Christoph Hellwig
2019-10-28 15:55 ` Darrick J. Wong
2019-10-25 15:03 ` [PATCH 2/8] xfs: mark xfs_eof_alignment static Christoph Hellwig
2019-10-28 15:55 ` Darrick J. Wong
2019-10-25 15:03 ` [PATCH 3/8] xfs: remove the extsize argument to xfs_eof_alignment Christoph Hellwig
2019-10-28 16:06 ` Darrick J. Wong
2019-10-29 7:57 ` Christoph Hellwig
2019-10-25 15:03 ` [PATCH 4/8] xfs: don't log the inode in xfs_fs_map_blocks if it wasn't modified Christoph Hellwig
2019-10-28 16:12 ` Darrick J. Wong
2019-10-29 7:58 ` Christoph Hellwig
2019-10-30 16:12 ` Darrick J. Wong
2019-10-30 17:56 ` Christoph Hellwig
2019-10-25 15:03 ` [PATCH 5/8] xfs: simplify the xfs_iomap_write_direct calling conventions Christoph Hellwig
2019-10-28 16:25 ` Darrick J. Wong [this message]
2019-10-25 15:03 ` [PATCH 6/8] xfs: refactor xfs_bmapi_allocate Christoph Hellwig
2019-10-28 16:29 ` Darrick J. Wong
2019-10-25 15:03 ` [PATCH 7/8] xfs: move extent zeroing to xfs_bmapi_allocate Christoph Hellwig
2019-10-28 16:31 ` Darrick J. Wong
2019-10-25 15:03 ` [PATCH 8/8] xfs: cleanup use of the XFS_ALLOC_ flags Christoph Hellwig
2019-10-28 16:32 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191028162529.GE15222@magnolia \
--to=darrick.wong@oracle.com \
--cc=hch@lst.de \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox