xref: /openbmc/linux/fs/xfs/xfs_icreate_item.c (revision 4fb6e8ad)
13ebe7d2dSDave Chinner /*
23ebe7d2dSDave Chinner  * Copyright (c) 2008-2010, 2013 Dave Chinner
33ebe7d2dSDave Chinner  * All Rights Reserved.
43ebe7d2dSDave Chinner  *
53ebe7d2dSDave Chinner  * This program is free software; you can redistribute it and/or
63ebe7d2dSDave Chinner  * modify it under the terms of the GNU General Public License as
73ebe7d2dSDave Chinner  * published by the Free Software Foundation.
83ebe7d2dSDave Chinner  *
93ebe7d2dSDave Chinner  * This program is distributed in the hope that it would be useful,
103ebe7d2dSDave Chinner  * but WITHOUT ANY WARRANTY; without even the implied warranty of
113ebe7d2dSDave Chinner  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
123ebe7d2dSDave Chinner  * GNU General Public License for more details.
133ebe7d2dSDave Chinner  *
143ebe7d2dSDave Chinner  * You should have received a copy of the GNU General Public License
153ebe7d2dSDave Chinner  * along with this program; if not, write the Free Software Foundation,
163ebe7d2dSDave Chinner  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
173ebe7d2dSDave Chinner  */
183ebe7d2dSDave Chinner #include "xfs.h"
193ebe7d2dSDave Chinner #include "xfs_fs.h"
2070a9883cSDave Chinner #include "xfs_shared.h"
214fb6e8adSChristoph Hellwig #include "xfs_format.h"
22239880efSDave Chinner #include "xfs_log_format.h"
23239880efSDave Chinner #include "xfs_trans_resv.h"
243ebe7d2dSDave Chinner #include "xfs_bit.h"
253ebe7d2dSDave Chinner #include "xfs_sb.h"
263ebe7d2dSDave Chinner #include "xfs_mount.h"
27239880efSDave Chinner #include "xfs_trans.h"
283ebe7d2dSDave Chinner #include "xfs_trans_priv.h"
293ebe7d2dSDave Chinner #include "xfs_error.h"
303ebe7d2dSDave Chinner #include "xfs_icreate_item.h"
311234351cSChristoph Hellwig #include "xfs_log.h"
323ebe7d2dSDave Chinner 
333ebe7d2dSDave Chinner kmem_zone_t	*xfs_icreate_zone;		/* inode create item zone */
343ebe7d2dSDave Chinner 
353ebe7d2dSDave Chinner static inline struct xfs_icreate_item *ICR_ITEM(struct xfs_log_item *lip)
363ebe7d2dSDave Chinner {
373ebe7d2dSDave Chinner 	return container_of(lip, struct xfs_icreate_item, ic_item);
383ebe7d2dSDave Chinner }
393ebe7d2dSDave Chinner 
403ebe7d2dSDave Chinner /*
413ebe7d2dSDave Chinner  * This returns the number of iovecs needed to log the given inode item.
423ebe7d2dSDave Chinner  *
433ebe7d2dSDave Chinner  * We only need one iovec for the icreate log structure.
443ebe7d2dSDave Chinner  */
45166d1368SDave Chinner STATIC void
463ebe7d2dSDave Chinner xfs_icreate_item_size(
47166d1368SDave Chinner 	struct xfs_log_item	*lip,
48166d1368SDave Chinner 	int			*nvecs,
49166d1368SDave Chinner 	int			*nbytes)
503ebe7d2dSDave Chinner {
51166d1368SDave Chinner 	*nvecs += 1;
52166d1368SDave Chinner 	*nbytes += sizeof(struct xfs_icreate_log);
533ebe7d2dSDave Chinner }
543ebe7d2dSDave Chinner 
553ebe7d2dSDave Chinner /*
563ebe7d2dSDave Chinner  * This is called to fill in the vector of log iovecs for the
573ebe7d2dSDave Chinner  * given inode create log item.
583ebe7d2dSDave Chinner  */
593ebe7d2dSDave Chinner STATIC void
603ebe7d2dSDave Chinner xfs_icreate_item_format(
613ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
62bde7cff6SChristoph Hellwig 	struct xfs_log_vec	*lv)
633ebe7d2dSDave Chinner {
643ebe7d2dSDave Chinner 	struct xfs_icreate_item	*icp = ICR_ITEM(lip);
65bde7cff6SChristoph Hellwig 	struct xfs_log_iovec	*vecp = NULL;
663ebe7d2dSDave Chinner 
67bde7cff6SChristoph Hellwig 	xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ICREATE,
681234351cSChristoph Hellwig 			&icp->ic_format,
691234351cSChristoph Hellwig 			sizeof(struct xfs_icreate_log));
703ebe7d2dSDave Chinner }
713ebe7d2dSDave Chinner 
723ebe7d2dSDave Chinner 
733ebe7d2dSDave Chinner /* Pinning has no meaning for the create item, so just return. */
743ebe7d2dSDave Chinner STATIC void
753ebe7d2dSDave Chinner xfs_icreate_item_pin(
763ebe7d2dSDave Chinner 	struct xfs_log_item	*lip)
773ebe7d2dSDave Chinner {
783ebe7d2dSDave Chinner }
793ebe7d2dSDave Chinner 
803ebe7d2dSDave Chinner 
813ebe7d2dSDave Chinner /* pinning has no meaning for the create item, so just return. */
823ebe7d2dSDave Chinner STATIC void
833ebe7d2dSDave Chinner xfs_icreate_item_unpin(
843ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
853ebe7d2dSDave Chinner 	int			remove)
863ebe7d2dSDave Chinner {
873ebe7d2dSDave Chinner }
883ebe7d2dSDave Chinner 
893ebe7d2dSDave Chinner STATIC void
903ebe7d2dSDave Chinner xfs_icreate_item_unlock(
913ebe7d2dSDave Chinner 	struct xfs_log_item	*lip)
923ebe7d2dSDave Chinner {
933ebe7d2dSDave Chinner 	struct xfs_icreate_item	*icp = ICR_ITEM(lip);
943ebe7d2dSDave Chinner 
953ebe7d2dSDave Chinner 	if (icp->ic_item.li_flags & XFS_LI_ABORTED)
963ebe7d2dSDave Chinner 		kmem_zone_free(xfs_icreate_zone, icp);
973ebe7d2dSDave Chinner 	return;
983ebe7d2dSDave Chinner }
993ebe7d2dSDave Chinner 
1003ebe7d2dSDave Chinner /*
1013ebe7d2dSDave Chinner  * Because we have ordered buffers being tracked in the AIL for the inode
1023ebe7d2dSDave Chinner  * creation, we don't need the create item after this. Hence we can free
1033ebe7d2dSDave Chinner  * the log item and return -1 to tell the caller we're done with the item.
1043ebe7d2dSDave Chinner  */
1053ebe7d2dSDave Chinner STATIC xfs_lsn_t
1063ebe7d2dSDave Chinner xfs_icreate_item_committed(
1073ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
1083ebe7d2dSDave Chinner 	xfs_lsn_t		lsn)
1093ebe7d2dSDave Chinner {
1103ebe7d2dSDave Chinner 	struct xfs_icreate_item	*icp = ICR_ITEM(lip);
1113ebe7d2dSDave Chinner 
1123ebe7d2dSDave Chinner 	kmem_zone_free(xfs_icreate_zone, icp);
1133ebe7d2dSDave Chinner 	return (xfs_lsn_t)-1;
1143ebe7d2dSDave Chinner }
1153ebe7d2dSDave Chinner 
1163ebe7d2dSDave Chinner /* item can never get into the AIL */
1173ebe7d2dSDave Chinner STATIC uint
1183ebe7d2dSDave Chinner xfs_icreate_item_push(
1193ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
1203ebe7d2dSDave Chinner 	struct list_head	*buffer_list)
1213ebe7d2dSDave Chinner {
1223ebe7d2dSDave Chinner 	ASSERT(0);
1233ebe7d2dSDave Chinner 	return XFS_ITEM_SUCCESS;
1243ebe7d2dSDave Chinner }
1253ebe7d2dSDave Chinner 
1263ebe7d2dSDave Chinner /* Ordered buffers do the dependency tracking here, so this does nothing. */
1273ebe7d2dSDave Chinner STATIC void
1283ebe7d2dSDave Chinner xfs_icreate_item_committing(
1293ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
1303ebe7d2dSDave Chinner 	xfs_lsn_t		lsn)
1313ebe7d2dSDave Chinner {
1323ebe7d2dSDave Chinner }
1333ebe7d2dSDave Chinner 
1343ebe7d2dSDave Chinner /*
1353ebe7d2dSDave Chinner  * This is the ops vector shared by all buf log items.
1363ebe7d2dSDave Chinner  */
1373ebe7d2dSDave Chinner static struct xfs_item_ops xfs_icreate_item_ops = {
1383ebe7d2dSDave Chinner 	.iop_size	= xfs_icreate_item_size,
1393ebe7d2dSDave Chinner 	.iop_format	= xfs_icreate_item_format,
1403ebe7d2dSDave Chinner 	.iop_pin	= xfs_icreate_item_pin,
1413ebe7d2dSDave Chinner 	.iop_unpin	= xfs_icreate_item_unpin,
1423ebe7d2dSDave Chinner 	.iop_push	= xfs_icreate_item_push,
1433ebe7d2dSDave Chinner 	.iop_unlock	= xfs_icreate_item_unlock,
1443ebe7d2dSDave Chinner 	.iop_committed	= xfs_icreate_item_committed,
1453ebe7d2dSDave Chinner 	.iop_committing = xfs_icreate_item_committing,
1463ebe7d2dSDave Chinner };
1473ebe7d2dSDave Chinner 
1483ebe7d2dSDave Chinner 
1493ebe7d2dSDave Chinner /*
1503ebe7d2dSDave Chinner  * Initialize the inode log item for a newly allocated (in-core) inode.
1513ebe7d2dSDave Chinner  *
1523ebe7d2dSDave Chinner  * Inode extents can only reside within an AG. Hence specify the starting
1533ebe7d2dSDave Chinner  * block for the inode chunk by offset within an AG as well as the
1543ebe7d2dSDave Chinner  * length of the allocated extent.
1553ebe7d2dSDave Chinner  *
1563ebe7d2dSDave Chinner  * This joins the item to the transaction and marks it dirty so
1573ebe7d2dSDave Chinner  * that we don't need a separate call to do this, nor does the
1583ebe7d2dSDave Chinner  * caller need to know anything about the icreate item.
1593ebe7d2dSDave Chinner  */
1603ebe7d2dSDave Chinner void
1613ebe7d2dSDave Chinner xfs_icreate_log(
1623ebe7d2dSDave Chinner 	struct xfs_trans	*tp,
1633ebe7d2dSDave Chinner 	xfs_agnumber_t		agno,
1643ebe7d2dSDave Chinner 	xfs_agblock_t		agbno,
1653ebe7d2dSDave Chinner 	unsigned int		count,
1663ebe7d2dSDave Chinner 	unsigned int		inode_size,
1673ebe7d2dSDave Chinner 	xfs_agblock_t		length,
1683ebe7d2dSDave Chinner 	unsigned int		generation)
1693ebe7d2dSDave Chinner {
1703ebe7d2dSDave Chinner 	struct xfs_icreate_item	*icp;
1713ebe7d2dSDave Chinner 
1723ebe7d2dSDave Chinner 	icp = kmem_zone_zalloc(xfs_icreate_zone, KM_SLEEP);
1733ebe7d2dSDave Chinner 
1743ebe7d2dSDave Chinner 	xfs_log_item_init(tp->t_mountp, &icp->ic_item, XFS_LI_ICREATE,
1753ebe7d2dSDave Chinner 			  &xfs_icreate_item_ops);
1763ebe7d2dSDave Chinner 
1773ebe7d2dSDave Chinner 	icp->ic_format.icl_type = XFS_LI_ICREATE;
1783ebe7d2dSDave Chinner 	icp->ic_format.icl_size = 1;	/* single vector */
1793ebe7d2dSDave Chinner 	icp->ic_format.icl_ag = cpu_to_be32(agno);
1803ebe7d2dSDave Chinner 	icp->ic_format.icl_agbno = cpu_to_be32(agbno);
1813ebe7d2dSDave Chinner 	icp->ic_format.icl_count = cpu_to_be32(count);
1823ebe7d2dSDave Chinner 	icp->ic_format.icl_isize = cpu_to_be32(inode_size);
1833ebe7d2dSDave Chinner 	icp->ic_format.icl_length = cpu_to_be32(length);
1843ebe7d2dSDave Chinner 	icp->ic_format.icl_gen = cpu_to_be32(generation);
1853ebe7d2dSDave Chinner 
1863ebe7d2dSDave Chinner 	xfs_trans_add_item(tp, &icp->ic_item);
1873ebe7d2dSDave Chinner 	tp->t_flags |= XFS_TRANS_DIRTY;
1883ebe7d2dSDave Chinner 	icp->ic_item.li_desc->lid_flags |= XFS_LID_DIRTY;
1893ebe7d2dSDave Chinner }
190