xref: /openbmc/linux/fs/xfs/xfs_icreate_item.c (revision 0b61f8a4)
10b61f8a4SDave Chinner // SPDX-License-Identifier: GPL-2.0
23ebe7d2dSDave Chinner /*
33ebe7d2dSDave Chinner  * Copyright (c) 2008-2010, 2013 Dave Chinner
43ebe7d2dSDave Chinner  * All Rights Reserved.
53ebe7d2dSDave Chinner  */
63ebe7d2dSDave Chinner #include "xfs.h"
73ebe7d2dSDave Chinner #include "xfs_fs.h"
870a9883cSDave Chinner #include "xfs_shared.h"
94fb6e8adSChristoph Hellwig #include "xfs_format.h"
10239880efSDave Chinner #include "xfs_log_format.h"
11239880efSDave Chinner #include "xfs_trans_resv.h"
123ebe7d2dSDave Chinner #include "xfs_bit.h"
133ebe7d2dSDave Chinner #include "xfs_mount.h"
14239880efSDave Chinner #include "xfs_trans.h"
153ebe7d2dSDave Chinner #include "xfs_trans_priv.h"
163ebe7d2dSDave Chinner #include "xfs_error.h"
173ebe7d2dSDave Chinner #include "xfs_icreate_item.h"
181234351cSChristoph Hellwig #include "xfs_log.h"
193ebe7d2dSDave Chinner 
203ebe7d2dSDave Chinner kmem_zone_t	*xfs_icreate_zone;		/* inode create item zone */
213ebe7d2dSDave Chinner 
223ebe7d2dSDave Chinner static inline struct xfs_icreate_item *ICR_ITEM(struct xfs_log_item *lip)
233ebe7d2dSDave Chinner {
243ebe7d2dSDave Chinner 	return container_of(lip, struct xfs_icreate_item, ic_item);
253ebe7d2dSDave Chinner }
263ebe7d2dSDave Chinner 
273ebe7d2dSDave Chinner /*
283ebe7d2dSDave Chinner  * This returns the number of iovecs needed to log the given inode item.
293ebe7d2dSDave Chinner  *
303ebe7d2dSDave Chinner  * We only need one iovec for the icreate log structure.
313ebe7d2dSDave Chinner  */
32166d1368SDave Chinner STATIC void
333ebe7d2dSDave Chinner xfs_icreate_item_size(
34166d1368SDave Chinner 	struct xfs_log_item	*lip,
35166d1368SDave Chinner 	int			*nvecs,
36166d1368SDave Chinner 	int			*nbytes)
373ebe7d2dSDave Chinner {
38166d1368SDave Chinner 	*nvecs += 1;
39166d1368SDave Chinner 	*nbytes += sizeof(struct xfs_icreate_log);
403ebe7d2dSDave Chinner }
413ebe7d2dSDave Chinner 
423ebe7d2dSDave Chinner /*
433ebe7d2dSDave Chinner  * This is called to fill in the vector of log iovecs for the
443ebe7d2dSDave Chinner  * given inode create log item.
453ebe7d2dSDave Chinner  */
463ebe7d2dSDave Chinner STATIC void
473ebe7d2dSDave Chinner xfs_icreate_item_format(
483ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
49bde7cff6SChristoph Hellwig 	struct xfs_log_vec	*lv)
503ebe7d2dSDave Chinner {
513ebe7d2dSDave Chinner 	struct xfs_icreate_item	*icp = ICR_ITEM(lip);
52bde7cff6SChristoph Hellwig 	struct xfs_log_iovec	*vecp = NULL;
533ebe7d2dSDave Chinner 
54bde7cff6SChristoph Hellwig 	xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ICREATE,
551234351cSChristoph Hellwig 			&icp->ic_format,
561234351cSChristoph Hellwig 			sizeof(struct xfs_icreate_log));
573ebe7d2dSDave Chinner }
583ebe7d2dSDave Chinner 
593ebe7d2dSDave Chinner 
603ebe7d2dSDave Chinner /* Pinning has no meaning for the create item, so just return. */
613ebe7d2dSDave Chinner STATIC void
623ebe7d2dSDave Chinner xfs_icreate_item_pin(
633ebe7d2dSDave Chinner 	struct xfs_log_item	*lip)
643ebe7d2dSDave Chinner {
653ebe7d2dSDave Chinner }
663ebe7d2dSDave Chinner 
673ebe7d2dSDave Chinner 
683ebe7d2dSDave Chinner /* pinning has no meaning for the create item, so just return. */
693ebe7d2dSDave Chinner STATIC void
703ebe7d2dSDave Chinner xfs_icreate_item_unpin(
713ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
723ebe7d2dSDave Chinner 	int			remove)
733ebe7d2dSDave Chinner {
743ebe7d2dSDave Chinner }
753ebe7d2dSDave Chinner 
763ebe7d2dSDave Chinner STATIC void
773ebe7d2dSDave Chinner xfs_icreate_item_unlock(
783ebe7d2dSDave Chinner 	struct xfs_log_item	*lip)
793ebe7d2dSDave Chinner {
803ebe7d2dSDave Chinner 	struct xfs_icreate_item	*icp = ICR_ITEM(lip);
813ebe7d2dSDave Chinner 
8222525c17SDave Chinner 	if (test_bit(XFS_LI_ABORTED, &lip->li_flags))
833ebe7d2dSDave Chinner 		kmem_zone_free(xfs_icreate_zone, icp);
843ebe7d2dSDave Chinner 	return;
853ebe7d2dSDave Chinner }
863ebe7d2dSDave Chinner 
873ebe7d2dSDave Chinner /*
883ebe7d2dSDave Chinner  * Because we have ordered buffers being tracked in the AIL for the inode
893ebe7d2dSDave Chinner  * creation, we don't need the create item after this. Hence we can free
903ebe7d2dSDave Chinner  * the log item and return -1 to tell the caller we're done with the item.
913ebe7d2dSDave Chinner  */
923ebe7d2dSDave Chinner STATIC xfs_lsn_t
933ebe7d2dSDave Chinner xfs_icreate_item_committed(
943ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
953ebe7d2dSDave Chinner 	xfs_lsn_t		lsn)
963ebe7d2dSDave Chinner {
973ebe7d2dSDave Chinner 	struct xfs_icreate_item	*icp = ICR_ITEM(lip);
983ebe7d2dSDave Chinner 
993ebe7d2dSDave Chinner 	kmem_zone_free(xfs_icreate_zone, icp);
1003ebe7d2dSDave Chinner 	return (xfs_lsn_t)-1;
1013ebe7d2dSDave Chinner }
1023ebe7d2dSDave Chinner 
1033ebe7d2dSDave Chinner /* item can never get into the AIL */
1043ebe7d2dSDave Chinner STATIC uint
1053ebe7d2dSDave Chinner xfs_icreate_item_push(
1063ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
1073ebe7d2dSDave Chinner 	struct list_head	*buffer_list)
1083ebe7d2dSDave Chinner {
1093ebe7d2dSDave Chinner 	ASSERT(0);
1103ebe7d2dSDave Chinner 	return XFS_ITEM_SUCCESS;
1113ebe7d2dSDave Chinner }
1123ebe7d2dSDave Chinner 
1133ebe7d2dSDave Chinner /* Ordered buffers do the dependency tracking here, so this does nothing. */
1143ebe7d2dSDave Chinner STATIC void
1153ebe7d2dSDave Chinner xfs_icreate_item_committing(
1163ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
1173ebe7d2dSDave Chinner 	xfs_lsn_t		lsn)
1183ebe7d2dSDave Chinner {
1193ebe7d2dSDave Chinner }
1203ebe7d2dSDave Chinner 
1213ebe7d2dSDave Chinner /*
1223ebe7d2dSDave Chinner  * This is the ops vector shared by all buf log items.
1233ebe7d2dSDave Chinner  */
124bb6e0ebeSBhumika Goyal static const struct xfs_item_ops xfs_icreate_item_ops = {
1253ebe7d2dSDave Chinner 	.iop_size	= xfs_icreate_item_size,
1263ebe7d2dSDave Chinner 	.iop_format	= xfs_icreate_item_format,
1273ebe7d2dSDave Chinner 	.iop_pin	= xfs_icreate_item_pin,
1283ebe7d2dSDave Chinner 	.iop_unpin	= xfs_icreate_item_unpin,
1293ebe7d2dSDave Chinner 	.iop_push	= xfs_icreate_item_push,
1303ebe7d2dSDave Chinner 	.iop_unlock	= xfs_icreate_item_unlock,
1313ebe7d2dSDave Chinner 	.iop_committed	= xfs_icreate_item_committed,
1323ebe7d2dSDave Chinner 	.iop_committing = xfs_icreate_item_committing,
1333ebe7d2dSDave Chinner };
1343ebe7d2dSDave Chinner 
1353ebe7d2dSDave Chinner 
1363ebe7d2dSDave Chinner /*
1373ebe7d2dSDave Chinner  * Initialize the inode log item for a newly allocated (in-core) inode.
1383ebe7d2dSDave Chinner  *
1393ebe7d2dSDave Chinner  * Inode extents can only reside within an AG. Hence specify the starting
1403ebe7d2dSDave Chinner  * block for the inode chunk by offset within an AG as well as the
1413ebe7d2dSDave Chinner  * length of the allocated extent.
1423ebe7d2dSDave Chinner  *
1433ebe7d2dSDave Chinner  * This joins the item to the transaction and marks it dirty so
1443ebe7d2dSDave Chinner  * that we don't need a separate call to do this, nor does the
1453ebe7d2dSDave Chinner  * caller need to know anything about the icreate item.
1463ebe7d2dSDave Chinner  */
1473ebe7d2dSDave Chinner void
1483ebe7d2dSDave Chinner xfs_icreate_log(
1493ebe7d2dSDave Chinner 	struct xfs_trans	*tp,
1503ebe7d2dSDave Chinner 	xfs_agnumber_t		agno,
1513ebe7d2dSDave Chinner 	xfs_agblock_t		agbno,
1523ebe7d2dSDave Chinner 	unsigned int		count,
1533ebe7d2dSDave Chinner 	unsigned int		inode_size,
1543ebe7d2dSDave Chinner 	xfs_agblock_t		length,
1553ebe7d2dSDave Chinner 	unsigned int		generation)
1563ebe7d2dSDave Chinner {
1573ebe7d2dSDave Chinner 	struct xfs_icreate_item	*icp;
1583ebe7d2dSDave Chinner 
1593ebe7d2dSDave Chinner 	icp = kmem_zone_zalloc(xfs_icreate_zone, KM_SLEEP);
1603ebe7d2dSDave Chinner 
1613ebe7d2dSDave Chinner 	xfs_log_item_init(tp->t_mountp, &icp->ic_item, XFS_LI_ICREATE,
1623ebe7d2dSDave Chinner 			  &xfs_icreate_item_ops);
1633ebe7d2dSDave Chinner 
1643ebe7d2dSDave Chinner 	icp->ic_format.icl_type = XFS_LI_ICREATE;
1653ebe7d2dSDave Chinner 	icp->ic_format.icl_size = 1;	/* single vector */
1663ebe7d2dSDave Chinner 	icp->ic_format.icl_ag = cpu_to_be32(agno);
1673ebe7d2dSDave Chinner 	icp->ic_format.icl_agbno = cpu_to_be32(agbno);
1683ebe7d2dSDave Chinner 	icp->ic_format.icl_count = cpu_to_be32(count);
1693ebe7d2dSDave Chinner 	icp->ic_format.icl_isize = cpu_to_be32(inode_size);
1703ebe7d2dSDave Chinner 	icp->ic_format.icl_length = cpu_to_be32(length);
1713ebe7d2dSDave Chinner 	icp->ic_format.icl_gen = cpu_to_be32(generation);
1723ebe7d2dSDave Chinner 
1733ebe7d2dSDave Chinner 	xfs_trans_add_item(tp, &icp->ic_item);
1743ebe7d2dSDave Chinner 	tp->t_flags |= XFS_TRANS_DIRTY;
175e6631f85SDave Chinner 	set_bit(XFS_LI_DIRTY, &icp->ic_item.li_flags);
1763ebe7d2dSDave Chinner }
177