From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 85673481FA1 for ; Mon, 5 Oct 2026 12:57:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.137.202.133 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791205041; cv=none; b=TPjQNajqsnjUZxn3iXzqnqYeeO2ybSjqtPaqJzMdk9rVOAiKBFM6t5y7ledkArRQ18YsSpPllAVHZHabeYYvei2LJCKiBN2RAkvPK9lT9rDh0x0VLUcLDHK83dKbsoMbYcfyNgMR0w++W6oC/zGn26ZEgJiJqlkA0P7kptjk1rY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791205041; c=relaxed/simple; bh=Y8Bgqfos+/h8Mx02g93yhrYzY7kzSwebnng+DAAh0GY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hhFGi8K0K6621lTWlxj+51PT9uP+Tt+r0quqNb9nhnQJes+szU0zPnpAURj+XchqCGUK5QRIDg8lmNuc9uECQ/dkRMau8eFLeyHPG1T6g8F1ZH7R6lItN0cgjWbJdZjccdscB2thAMqKPTAJaXAZTgytiG+La/ONm3Jcsz2NCzk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=lst.de; spf=none smtp.mailfrom=bombadil.srs.infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=Hf/qHfQd; arc=none smtp.client-ip=198.137.202.133 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=lst.de Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bombadil.srs.infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="Hf/qHfQd" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=M1NVuH+C1dPixaqUtW9qW/2H6at491Qbmx9nVciS6I8=; b=Hf/qHfQdq/fifJNW2JN90DPbBv lVydhaZhSoXLl8rG7/dTAfVg/VKTlFIrBoUYjUUspyTTnys6PXQpmaKfzqu6fg1jH4yeChvNULPzq XIfQRXguhnBGlmfdHXGBozTAYvY+jPy9HZyHymYCrIRaZuNFzEWQorPylv/ifcG7qmPH70OT02kJo +exDcTWk6qZk/MlcXxKCARDiLof7Xq68C3NHW7S+7Cv/LKUuXujWAAVLcchNzzFoil+ou5npv6eYr g6PJSmjBW78GqLB4NHPVUZ4W8I/uYHJ/J4AVFWM3ZNoUvholnsvMsqx2ydO+wuP42KH2VT5J492qu QfP20B7g==; Received: from 2a02-8389-2301-9f00-88fd-fcdd-06aa-821c.cable.dynamic.v6.surfer.at ([2a02:8389:2301:9f00:88fd:fcdd:6aa:821c] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.99.1 #2 (Red Hat Linux)) id 1xDiFq-0000000GR8x-30Y2; Mon, 05 Oct 2026 12:57:19 +0000 From: Christoph Hellwig To: Andrey Albershteyn Cc: "Darrick J . Wong " , Eric Sandeen , Carlos Maiolino , linux-xfs@vger.kernel.org Subject: [PATCH 12/13] libxfs: use xfs_trans.h from the kernel source Date: Mon, 5 Oct 2026 14:56:22 +0200 Message-ID: <20261005125637.1340355-13-hch@lst.de> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261005125637.1340355-1-hch@lst.de> References: <20261005125637.1340355-1-hch@lst.de> Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Replace the the existing xfs_trans.h with a copy of the kernel versions. Signed-off-by: Christoph Hellwig --- libxfs/Makefile | 4 +- libxfs/libxfs_api_defs.h | 1 + libxfs/stubs/xfs_trans.h | 132 ------------------ libxfs/trans.c | 22 +++ libxfs/xfs_platform.h | 12 -- libxfs/xfs_trans.h | 283 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 308 insertions(+), 146 deletions(-) delete mode 100644 libxfs/stubs/xfs_trans.h create mode 100644 libxfs/xfs_trans.h diff --git a/libxfs/Makefile b/libxfs/Makefile index f64dd596b645..ac7ddac5acec 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -47,6 +47,7 @@ HFILES = \ xfs_cksum.h \ xfs_da_btree.h \ xfs_dir2.h \ + xfs_dir2_priv.h \ xfs_errortag.h \ xfs_exchmaps.h \ xfs_group.h \ @@ -73,7 +74,7 @@ HFILES = \ xfs_shared.h \ xfs_trans_resv.h \ xfs_trans_space.h \ - xfs_dir2_priv.h \ + xfs_trans.h \ xfs_zones.h \ stubs/xfs_buf_mem.h \ stubs/xfs_error.h \ @@ -83,7 +84,6 @@ HFILES = \ stubs/xfs_mount.h \ stubs/xfs_quota.h \ stubs/xfs_trace.h \ - stubs/xfs_trans.h \ stubs/xfs_trans_priv.h CFILES = buf_mem.c \ diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index 4f542ae7267e..300135fcac8b 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -391,6 +391,7 @@ #define xfs_trans_ordered_buf libxfs_trans_ordered_buf #define xfs_trans_read_buf libxfs_trans_read_buf #define xfs_trans_read_buf_map libxfs_trans_read_buf_map +#define xfs_trans_reserve_more libxfs_trans_reserve_more #define xfs_trans_resv_calc libxfs_trans_resv_calc #define xfs_trans_roll_inode libxfs_trans_roll_inode #define xfs_trans_roll libxfs_trans_roll diff --git a/libxfs/stubs/xfs_trans.h b/libxfs/stubs/xfs_trans.h deleted file mode 100644 index 2619347df923..000000000000 --- a/libxfs/stubs/xfs_trans.h +++ /dev/null @@ -1,132 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. - * All Rights Reserved. - */ - -#ifndef __XFS_TRANS_H__ -#define __XFS_TRANS_H__ - -struct xfs_mount; -struct xfs_buftarg; -struct xfs_buf; -struct xfs_buf_map; - -/* - * Userspace Transaction interface - */ - -struct xfs_item_ops { - uint64_t (*iop_sort)(struct xfs_log_item *lip); - int (*iop_precommit)(struct xfs_trans *tp, struct xfs_log_item *lip); -}; - -struct xfs_log_item { - struct list_head li_trans; /* transaction list */ - xfs_lsn_t li_lsn; /* last on-disk lsn */ - uint li_type; /* item type */ - unsigned long li_flags; /* misc flags */ - struct xfs_buf *li_buf; /* real buffer pointer */ - struct list_head li_bio_list; /* buffer item list */ - const struct xfs_item_ops *li_ops; /* function list */ -}; - -#define XFS_LI_DIRTY 3 /* log item dirty in transaction */ - -typedef struct xfs_trans { - unsigned int t_log_res; /* amt of log space resvd */ - unsigned int t_log_count; /* count for perm log res */ - unsigned int t_blk_res; /* # of blocks resvd */ - unsigned int t_blk_res_used; /* # of resvd blocks used */ - unsigned int t_rtx_res; /* # of rt extents resvd */ - unsigned int t_rtx_res_used; /* # of resvd rt extents used */ - unsigned int t_flags; /* misc flags */ - xfs_agnumber_t t_highest_agno; /* highest AGF locked */ - struct xfs_mount *t_mountp; /* ptr to fs mount struct */ - struct xfs_dquot_acct *t_dqinfo; /* acctg info for dquots */ - long t_icount_delta; /* superblock icount change */ - long t_ifree_delta; /* superblock ifree change */ - long t_fdblocks_delta;/* superblock fdblocks chg */ - long t_frextents_delta;/* superblock freextents chg*/ - struct list_head t_items; /* log item descriptors */ - struct list_head t_dfops; /* deferred operations */ -} xfs_trans_t; - -int xfs_trans_roll(struct xfs_trans **); - -int libxfs_trans_alloc(struct xfs_mount *mp, struct xfs_trans_res *resp, - uint blocks, uint rtextents, uint flags, - struct xfs_trans **tpp); -int libxfs_trans_alloc_inode(struct xfs_inode *ip, struct xfs_trans_res *resv, - unsigned int dblocks, unsigned int rblocks, bool force, - struct xfs_trans **tpp); -int libxfs_trans_alloc_dir(struct xfs_inode *dp, struct xfs_trans_res *resv, - struct xfs_inode *ip, unsigned int *dblocks, - struct xfs_trans **tpp, int *nospace_error); -struct xfs_trans *libxfs_trans_alloc_empty(struct xfs_mount *mp); -int libxfs_trans_commit(struct xfs_trans *); -void libxfs_trans_cancel(struct xfs_trans *); -int libxfs_trans_reserve_more(struct xfs_trans *tp, uint blocks, - uint rtextents); - -/* cancel dfops associated with a transaction */ -void xfs_defer_cancel(struct xfs_trans *); - -struct xfs_buf *libxfs_trans_getsb(struct xfs_trans *); -struct xfs_buf *libxfs_trans_getrtsb(struct xfs_trans *tp); - -void libxfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); -void libxfs_trans_log_inode (struct xfs_trans *, struct xfs_inode *, - uint); -int libxfs_trans_roll_inode (struct xfs_trans **, struct xfs_inode *); - -void libxfs_trans_brelse(struct xfs_trans *, struct xfs_buf *); -void libxfs_trans_binval(struct xfs_trans *, struct xfs_buf *); -void libxfs_trans_bjoin(struct xfs_trans *, struct xfs_buf *); -void libxfs_trans_bdetach(struct xfs_trans *tp, struct xfs_buf *bp); -void libxfs_trans_bhold(struct xfs_trans *, struct xfs_buf *); -void libxfs_trans_bhold_release(struct xfs_trans *, struct xfs_buf *); -void libxfs_trans_dirty_buf(struct xfs_trans *, struct xfs_buf *); -void libxfs_trans_log_buf(struct xfs_trans *, struct xfs_buf *, - uint, uint); -bool libxfs_trans_ordered_buf(xfs_trans_t *, struct xfs_buf *); - -int libxfs_trans_get_buf_map(struct xfs_trans *tp, struct xfs_buftarg *btp, - struct xfs_buf_map *map, int nmaps, xfs_buf_flags_t flags, - struct xfs_buf **bpp); - -int libxfs_trans_read_buf_map(struct xfs_mount *mp, struct xfs_trans *tp, - struct xfs_buftarg *btp, - struct xfs_buf_map *map, int nmaps, - xfs_buf_flags_t flags, struct xfs_buf **bpp, - const struct xfs_buf_ops *ops); -static inline int -libxfs_trans_get_buf( - struct xfs_trans *tp, - struct xfs_buftarg *btp, - xfs_daddr_t blkno, - int numblks, - uint flags, - struct xfs_buf **bpp) -{ - DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); - - return libxfs_trans_get_buf_map(tp, btp, &map, 1, flags, bpp); -} - -static inline int -libxfs_trans_read_buf( - struct xfs_mount *mp, - struct xfs_trans *tp, - struct xfs_buftarg *btp, - xfs_daddr_t blkno, - int numblks, - xfs_buf_flags_t flags, - struct xfs_buf **bpp, - const struct xfs_buf_ops *ops) -{ - DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); - return libxfs_trans_read_buf_map(mp, tp, btp, &map, 1, flags, bpp, ops); -} - -#endif /* __XFS_TRANS_H__ */ diff --git a/libxfs/trans.c b/libxfs/trans.c index 77a2a574809e..25015ad2795c 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -353,6 +353,21 @@ xfs_buf_item_put( /* from xfs_trans_buf.c */ +void +xfs_trans_buf_set_type( + struct xfs_trans *tp, + struct xfs_buf *bp, + enum xfs_blft type) +{ +} + +void +xfs_trans_buf_copy_type( + struct xfs_buf *dst_bp, + struct xfs_buf *src_bp) +{ +} + /* * Add the locked buffer to the transaction. * @@ -765,6 +780,13 @@ libxfs_trans_binval( tp->t_flags |= XFS_TRANS_DIRTY; } +void +xfs_trans_inode_buf( + struct xfs_trans *tp, + struct xfs_buf *bp) +{ +} + /* * Mark the buffer as being one which contains newly allocated * inodes. We need to make sure that even if this buffer is diff --git a/libxfs/xfs_platform.h b/libxfs/xfs_platform.h index 4a899dcc6461..4b0069fd70d7 100644 --- a/libxfs/xfs_platform.h +++ b/libxfs/xfs_platform.h @@ -314,16 +314,6 @@ xfs_buf_incore( void __xfs_buf_mark_corrupt(struct xfs_buf *bp, xfs_failaddr_t fa); #define xfs_buf_mark_corrupt(bp) __xfs_buf_mark_corrupt((bp), __this_address) -/* mount stuff */ -#define xfs_trans_set_sync(tp) ((void) 0) -#define xfs_trans_buf_set_type(tp, bp, t) ({ \ - int __t = (t); \ - __t = __t; /* no set-but-unused warning */ \ - tp = tp; /* no set-but-unused warning */ \ -}) - -#define xfs_trans_buf_copy_type(dbp, sbp) - static inline void xfs_buf_readahead( struct xfs_buftarg *target, @@ -357,8 +347,6 @@ xfs_buf_readahead( #define xfs_filestream_new_ag(ip,ag) (0) #define xfs_filestream_select_ag(...) (-ENOSYS) -#define xfs_trans_inode_buf(tp, bp) ((void) 0) - #define uuid_copy(s,d) platform_uuid_copy((s),(d)) #define uuid_equal(s,d) (platform_uuid_compare((s),(d)) == 0) diff --git a/libxfs/xfs_trans.h b/libxfs/xfs_trans.h new file mode 100644 index 000000000000..eb83c5dac032 --- /dev/null +++ b/libxfs/xfs_trans.h @@ -0,0 +1,283 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * All Rights Reserved. + */ +#ifndef __XFS_TRANS_H__ +#define __XFS_TRANS_H__ + +/* kernel only transaction subsystem defines */ + +struct xlog; +struct xlog_format_buf; +struct xfs_buf; +struct xfs_buftarg; +struct xfs_efd_log_item; +struct xfs_efi_log_item; +struct xfs_inode; +struct xfs_item_ops; +struct xfs_mount; +struct xfs_trans; +struct xfs_trans_res; +struct xfs_dquot_acct; +struct xfs_rud_log_item; +struct xfs_rui_log_item; +struct xfs_btree_cur; +struct xfs_cui_log_item; +struct xfs_cud_log_item; +struct xfs_bui_log_item; +struct xfs_bud_log_item; + +struct xfs_log_item { + struct list_head li_ail; /* AIL pointers */ + struct list_head li_trans; /* transaction list */ + xfs_lsn_t li_lsn; /* last on-disk lsn */ + struct xlog *li_log; + struct xfs_ail *li_ailp; /* ptr to AIL */ + uint li_type; /* item type */ + unsigned long li_flags; /* misc flags */ + struct xfs_buf *li_buf; /* real buffer pointer */ + struct list_head li_bio_list; /* buffer item list */ + const struct xfs_item_ops *li_ops; /* function list */ + + /* delayed logging */ + struct list_head li_cil; /* CIL pointers */ + struct xfs_log_vec *li_lv; /* active log vector */ + struct xfs_log_vec *li_lv_shadow; /* standby vector */ + xfs_csn_t li_seq; /* CIL commit seq */ + uint32_t li_order_id; /* CIL commit order */ +}; + +/* + * li_flags use the (set/test/clear)_bit atomic interfaces because updates can + * race with each other and we don't want to have to use the AIL lock to + * serialise all updates. + */ +#define XFS_LI_IN_AIL 0 +#define XFS_LI_ABORTED 1 +#define XFS_LI_FAILED 2 +#define XFS_LI_DIRTY 3 +#define XFS_LI_WHITEOUT 4 +#define XFS_LI_FLUSHING 5 + +#define XFS_LI_FLAGS \ + { (1u << XFS_LI_IN_AIL), "IN_AIL" }, \ + { (1u << XFS_LI_ABORTED), "ABORTED" }, \ + { (1u << XFS_LI_FAILED), "FAILED" }, \ + { (1u << XFS_LI_DIRTY), "DIRTY" }, \ + { (1u << XFS_LI_WHITEOUT), "WHITEOUT" }, \ + { (1u << XFS_LI_FLUSHING), "FLUSHING" } + +struct xfs_item_ops { + unsigned flags; + void (*iop_size)(struct xfs_log_item *, int *, int *); + void (*iop_format)(struct xfs_log_item *lip, + struct xlog_format_buf *lfb); + void (*iop_pin)(struct xfs_log_item *); + void (*iop_unpin)(struct xfs_log_item *, int remove); + uint64_t (*iop_sort)(struct xfs_log_item *lip); + int (*iop_precommit)(struct xfs_trans *tp, struct xfs_log_item *lip); + void (*iop_committing)(struct xfs_log_item *lip, xfs_csn_t seq); + xfs_lsn_t (*iop_committed)(struct xfs_log_item *, xfs_lsn_t); + uint (*iop_push)(struct xfs_log_item *, struct list_head *); + void (*iop_release)(struct xfs_log_item *); + bool (*iop_match)(struct xfs_log_item *item, uint64_t id); + struct xfs_log_item *(*iop_intent)(struct xfs_log_item *intent_done); +}; + +/* + * Log item ops flags + */ +/* + * Release the log item when the journal commits instead of inserting into the + * AIL for writeback tracking and/or log tail pinning. + */ +#define XFS_ITEM_RELEASE_WHEN_COMMITTED (1 << 0) +#define XFS_ITEM_INTENT (1 << 1) +#define XFS_ITEM_INTENT_DONE (1 << 2) + +static inline bool +xlog_item_is_intent(struct xfs_log_item *lip) +{ + return lip->li_ops->flags & XFS_ITEM_INTENT; +} + +static inline bool +xlog_item_is_intent_done(struct xfs_log_item *lip) +{ + return lip->li_ops->flags & XFS_ITEM_INTENT_DONE; +} + +void xfs_log_item_init(struct xfs_mount *mp, struct xfs_log_item *item, + int type, const struct xfs_item_ops *ops); + +/* + * Return values for the iop_push() routines. + */ +#define XFS_ITEM_SUCCESS 0 +#define XFS_ITEM_PINNED 1 +#define XFS_ITEM_LOCKED 2 +#define XFS_ITEM_FLUSHING 3 + +/* + * This is the structure maintained for every active transaction. + */ +typedef struct xfs_trans { + unsigned int t_log_res; /* amt of log space resvd */ + unsigned int t_log_count; /* count for perm log res */ + unsigned int t_blk_res; /* # of blocks resvd */ + unsigned int t_blk_res_used; /* # of resvd blocks used */ + unsigned int t_rtx_res; /* # of rt extents resvd */ + unsigned int t_rtx_res_used; /* # of resvd rt extents used */ + unsigned int t_flags; /* misc flags */ + xfs_agnumber_t t_highest_agno; /* highest AGF locked */ + struct xlog_ticket *t_ticket; /* log mgr ticket */ + struct xfs_mount *t_mountp; /* ptr to fs mount struct */ + struct xfs_dquot_acct *t_dqinfo; /* acctg info for dquots */ + int64_t t_icount_delta; /* superblock icount change */ + int64_t t_ifree_delta; /* superblock ifree change */ + int64_t t_fdblocks_delta; /* superblock fdblocks chg */ + int64_t t_res_fdblocks_delta; /* on-disk only chg */ + int64_t t_frextents_delta;/* superblock freextents chg*/ + int64_t t_res_frextents_delta; /* on-disk only chg */ + int64_t t_dblocks_delta;/* superblock dblocks change */ + int64_t t_agcount_delta;/* superblock agcount change */ + int64_t t_imaxpct_delta;/* superblock imaxpct change */ + int64_t t_rextsize_delta;/* superblock rextsize chg */ + int64_t t_rbmblocks_delta;/* superblock rbmblocks chg */ + int64_t t_rblocks_delta;/* superblock rblocks change */ + int64_t t_rextents_delta;/* superblocks rextents chg */ + int64_t t_rextslog_delta;/* superblocks rextslog chg */ + int64_t t_rgcount_delta; /* realtime group count */ + struct list_head t_items; /* log item descriptors */ + struct list_head t_busy; /* list of busy extents */ + struct list_head t_dfops; /* deferred operations */ + unsigned long t_pflags; /* saved process flags state */ +} xfs_trans_t; + +/* + * XFS transaction mechanism exported interfaces that are + * actually macros. + */ +#define xfs_trans_set_sync(tp) ((tp)->t_flags |= XFS_TRANS_SYNC) + +/* + * XFS transaction mechanism exported interfaces. + */ +int xfs_trans_alloc(struct xfs_mount *mp, struct xfs_trans_res *resp, + uint blocks, uint rtextents, uint flags, + struct xfs_trans **tpp); +int xfs_trans_reserve_more(struct xfs_trans *tp, + unsigned int blocks, unsigned int rtextents); +struct xfs_trans *xfs_trans_alloc_empty(struct xfs_mount *mp); +void xfs_trans_mod_sb(xfs_trans_t *, uint, int64_t); + +int xfs_trans_get_buf_map(struct xfs_trans *tp, struct xfs_buftarg *target, + struct xfs_buf_map *map, int nmaps, xfs_buf_flags_t flags, + struct xfs_buf **bpp); + +static inline int +xfs_trans_get_buf( + struct xfs_trans *tp, + struct xfs_buftarg *target, + xfs_daddr_t blkno, + int numblks, + xfs_buf_flags_t flags, + struct xfs_buf **bpp) +{ + DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); + return xfs_trans_get_buf_map(tp, target, &map, 1, flags, bpp); +} + +int xfs_trans_read_buf_map(struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buftarg *target, + struct xfs_buf_map *map, int nmaps, + xfs_buf_flags_t flags, + struct xfs_buf **bpp, + const struct xfs_buf_ops *ops); + +static inline int +xfs_trans_read_buf( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buftarg *target, + xfs_daddr_t blkno, + int numblks, + xfs_buf_flags_t flags, + struct xfs_buf **bpp, + const struct xfs_buf_ops *ops) +{ + DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); + return xfs_trans_read_buf_map(mp, tp, target, &map, 1, + flags, bpp, ops); +} + +struct xfs_buf *xfs_trans_getsb(struct xfs_trans *); +struct xfs_buf *xfs_trans_getrtsb(struct xfs_trans *tp); + +void xfs_trans_brelse(xfs_trans_t *, struct xfs_buf *); +void xfs_trans_bjoin(xfs_trans_t *, struct xfs_buf *); +void xfs_trans_bdetach(struct xfs_trans *tp, struct xfs_buf *bp); +void xfs_trans_bhold(xfs_trans_t *, struct xfs_buf *); +void xfs_trans_bhold_release(xfs_trans_t *, struct xfs_buf *); +void xfs_trans_binval(xfs_trans_t *, struct xfs_buf *); +void xfs_trans_inode_buf(xfs_trans_t *, struct xfs_buf *); +void xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *); +bool xfs_trans_ordered_buf(xfs_trans_t *, struct xfs_buf *); +void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); +void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); +void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); +void xfs_trans_log_buf(struct xfs_trans *, struct xfs_buf *, uint, + uint); +void xfs_trans_dirty_buf(struct xfs_trans *, struct xfs_buf *); +bool xfs_trans_buf_is_dirty(struct xfs_buf *bp); +void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); + +int xfs_trans_commit(struct xfs_trans *); +int xfs_trans_roll(struct xfs_trans **); +int xfs_trans_roll_inode(struct xfs_trans **, struct xfs_inode *); +void xfs_trans_cancel(xfs_trans_t *); +int xfs_trans_ail_init(struct xfs_mount *); +void xfs_trans_ail_destroy(struct xfs_mount *); + +void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, + enum xfs_blft); +void xfs_trans_buf_copy_type(struct xfs_buf *dst_bp, + struct xfs_buf *src_bp); + +extern struct kmem_cache *xfs_trans_cache; + +struct xfs_dquot; + +int xfs_trans_alloc_inode(struct xfs_inode *ip, struct xfs_trans_res *resv, + unsigned int dblocks, unsigned int rblocks, bool force, + struct xfs_trans **tpp); +int xfs_trans_reserve_more_inode(struct xfs_trans *tp, struct xfs_inode *ip, + unsigned int dblocks, unsigned int rblocks, bool force_quota); +int xfs_trans_alloc_icreate(struct xfs_mount *mp, struct xfs_trans_res *resv, + struct xfs_dquot *udqp, struct xfs_dquot *gdqp, + struct xfs_dquot *pdqp, unsigned int dblocks, + struct xfs_trans **tpp); +int xfs_trans_alloc_ichange(struct xfs_inode *ip, struct xfs_dquot *udqp, + struct xfs_dquot *gdqp, struct xfs_dquot *pdqp, bool force, + struct xfs_trans **tpp); +int xfs_trans_alloc_dir(struct xfs_inode *dp, struct xfs_trans_res *resv, + struct xfs_inode *ip, unsigned int *dblocks, + struct xfs_trans **tpp, int *nospace_error); + +static inline void +xfs_trans_set_context( + struct xfs_trans *tp) +{ + tp->t_pflags = memalloc_nofs_save(); +} + +static inline void +xfs_trans_clear_context( + struct xfs_trans *tp) +{ + memalloc_nofs_restore(tp->t_pflags); +} + +#endif /* __XFS_TRANS_H__ */ -- 2.53.0