xref: /openbmc/linux/fs/xfs/xfs_icreate_item.c (revision 22525c17)
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_mount.h"
26239880efSDave Chinner #include "xfs_trans.h"
273ebe7d2dSDave Chinner #include "xfs_trans_priv.h"
283ebe7d2dSDave Chinner #include "xfs_error.h"
293ebe7d2dSDave Chinner #include "xfs_icreate_item.h"
301234351cSChristoph Hellwig #include "xfs_log.h"
313ebe7d2dSDave Chinner 
323ebe7d2dSDave Chinner kmem_zone_t	*xfs_icreate_zone;		/* inode create item zone */
333ebe7d2dSDave Chinner 
343ebe7d2dSDave Chinner static inline struct xfs_icreate_item *ICR_ITEM(struct xfs_log_item *lip)
353ebe7d2dSDave Chinner {
363ebe7d2dSDave Chinner 	return container_of(lip, struct xfs_icreate_item, ic_item);
373ebe7d2dSDave Chinner }
383ebe7d2dSDave Chinner 
393ebe7d2dSDave Chinner /*
403ebe7d2dSDave Chinner  * This returns the number of iovecs needed to log the given inode item.
413ebe7d2dSDave Chinner  *
423ebe7d2dSDave Chinner  * We only need one iovec for the icreate log structure.
433ebe7d2dSDave Chinner  */
44166d1368SDave Chinner STATIC void
453ebe7d2dSDave Chinner xfs_icreate_item_size(
46166d1368SDave Chinner 	struct xfs_log_item	*lip,
47166d1368SDave Chinner 	int			*nvecs,
48166d1368SDave Chinner 	int			*nbytes)
493ebe7d2dSDave Chinner {
50166d1368SDave Chinner 	*nvecs += 1;
51166d1368SDave Chinner 	*nbytes += sizeof(struct xfs_icreate_log);
523ebe7d2dSDave Chinner }
533ebe7d2dSDave Chinner 
543ebe7d2dSDave Chinner /*
553ebe7d2dSDave Chinner  * This is called to fill in the vector of log iovecs for the
563ebe7d2dSDave Chinner  * given inode create log item.
573ebe7d2dSDave Chinner  */
583ebe7d2dSDave Chinner STATIC void
593ebe7d2dSDave Chinner xfs_icreate_item_format(
603ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
61bde7cff6SChristoph Hellwig 	struct xfs_log_vec	*lv)
623ebe7d2dSDave Chinner {
633ebe7d2dSDave Chinner 	struct xfs_icreate_item	*icp = ICR_ITEM(lip);
64bde7cff6SChristoph Hellwig 	struct xfs_log_iovec	*vecp = NULL;
653ebe7d2dSDave Chinner 
66bde7cff6SChristoph Hellwig 	xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ICREATE,
671234351cSChristoph Hellwig 			&icp->ic_format,
681234351cSChristoph Hellwig 			sizeof(struct xfs_icreate_log));
693ebe7d2dSDave Chinner }
703ebe7d2dSDave Chinner 
713ebe7d2dSDave Chinner 
723ebe7d2dSDave Chinner /* Pinning has no meaning for the create item, so just return. */
733ebe7d2dSDave Chinner STATIC void
743ebe7d2dSDave Chinner xfs_icreate_item_pin(
753ebe7d2dSDave Chinner 	struct xfs_log_item	*lip)
763ebe7d2dSDave Chinner {
773ebe7d2dSDave Chinner }
783ebe7d2dSDave Chinner 
793ebe7d2dSDave Chinner 
803ebe7d2dSDave Chinner /* pinning has no meaning for the create item, so just return. */
813ebe7d2dSDave Chinner STATIC void
823ebe7d2dSDave Chinner xfs_icreate_item_unpin(
833ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
843ebe7d2dSDave Chinner 	int			remove)
853ebe7d2dSDave Chinner {
863ebe7d2dSDave Chinner }
873ebe7d2dSDave Chinner 
883ebe7d2dSDave Chinner STATIC void
893ebe7d2dSDave Chinner xfs_icreate_item_unlock(
903ebe7d2dSDave Chinner 	struct xfs_log_item	*lip)
913ebe7d2dSDave Chinner {
923ebe7d2dSDave Chinner 	struct xfs_icreate_item	*icp = ICR_ITEM(lip);
933ebe7d2dSDave Chinner 
9422525c17SDave Chinner 	if (test_bit(XFS_LI_ABORTED, &lip->li_flags))
953ebe7d2dSDave Chinner 		kmem_zone_free(xfs_icreate_zone, icp);
963ebe7d2dSDave Chinner 	return;
973ebe7d2dSDave Chinner }
983ebe7d2dSDave Chinner 
993ebe7d2dSDave Chinner /*
1003ebe7d2dSDave Chinner  * Because we have ordered buffers being tracked in the AIL for the inode
1013ebe7d2dSDave Chinner  * creation, we don't need the create item after this. Hence we can free
1023ebe7d2dSDave Chinner  * the log item and return -1 to tell the caller we're done with the item.
1033ebe7d2dSDave Chinner  */
1043ebe7d2dSDave Chinner STATIC xfs_lsn_t
1053ebe7d2dSDave Chinner xfs_icreate_item_committed(
1063ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
1073ebe7d2dSDave Chinner 	xfs_lsn_t		lsn)
1083ebe7d2dSDave Chinner {
1093ebe7d2dSDave Chinner 	struct xfs_icreate_item	*icp = ICR_ITEM(lip);
1103ebe7d2dSDave Chinner 
1113ebe7d2dSDave Chinner 	kmem_zone_free(xfs_icreate_zone, icp);
1123ebe7d2dSDave Chinner 	return (xfs_lsn_t)-1;
1133ebe7d2dSDave Chinner }
1143ebe7d2dSDave Chinner 
1153ebe7d2dSDave Chinner /* item can never get into the AIL */
1163ebe7d2dSDave Chinner STATIC uint
1173ebe7d2dSDave Chinner xfs_icreate_item_push(
1183ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
1193ebe7d2dSDave Chinner 	struct list_head	*buffer_list)
1203ebe7d2dSDave Chinner {
1213ebe7d2dSDave Chinner 	ASSERT(0);
1223ebe7d2dSDave Chinner 	return XFS_ITEM_SUCCESS;
1233ebe7d2dSDave Chinner }
1243ebe7d2dSDave Chinner 
1253ebe7d2dSDave Chinner /* Ordered buffers do the dependency tracking here, so this does nothing. */
1263ebe7d2dSDave Chinner STATIC void
1273ebe7d2dSDave Chinner xfs_icreate_item_committing(
1283ebe7d2dSDave Chinner 	struct xfs_log_item	*lip,
1293ebe7d2dSDave Chinner 	xfs_lsn_t		lsn)
1303ebe7d2dSDave Chinner {
1313ebe7d2dSDave Chinner }
1323ebe7d2dSDave Chinner 
1333ebe7d2dSDave Chinner /*
1343ebe7d2dSDave Chinner  * This is the ops vector shared by all buf log items.
1353ebe7d2dSDave Chinner  */
136bb6e0ebeSBhumika Goyal static const struct xfs_item_ops xfs_icreate_item_ops = {
1373ebe7d2dSDave Chinner 	.iop_size	= xfs_icreate_item_size,
1383ebe7d2dSDave Chinner 	.iop_format	= xfs_icreate_item_format,
1393ebe7d2dSDave Chinner 	.iop_pin	= xfs_icreate_item_pin,
1403ebe7d2dSDave Chinner 	.iop_unpin	= xfs_icreate_item_unpin,
1413ebe7d2dSDave Chinner 	.iop_push	= xfs_icreate_item_push,
1423ebe7d2dSDave Chinner 	.iop_unlock	= xfs_icreate_item_unlock,
1433ebe7d2dSDave Chinner 	.iop_committed	= xfs_icreate_item_committed,
1443ebe7d2dSDave Chinner 	.iop_committing = xfs_icreate_item_committing,
1453ebe7d2dSDave Chinner };
1463ebe7d2dSDave Chinner 
1473ebe7d2dSDave Chinner 
1483ebe7d2dSDave Chinner /*
1493ebe7d2dSDave Chinner  * Initialize the inode log item for a newly allocated (in-core) inode.
1503ebe7d2dSDave Chinner  *
1513ebe7d2dSDave Chinner  * Inode extents can only reside within an AG. Hence specify the starting
1523ebe7d2dSDave Chinner  * block for the inode chunk by offset within an AG as well as the
1533ebe7d2dSDave Chinner  * length of the allocated extent.
1543ebe7d2dSDave Chinner  *
1553ebe7d2dSDave Chinner  * This joins the item to the transaction and marks it dirty so
1563ebe7d2dSDave Chinner  * that we don't need a separate call to do this, nor does the
1573ebe7d2dSDave Chinner  * caller need to know anything about the icreate item.
1583ebe7d2dSDave Chinner  */
1593ebe7d2dSDave Chinner void
1603ebe7d2dSDave Chinner xfs_icreate_log(
1613ebe7d2dSDave Chinner 	struct xfs_trans	*tp,
1623ebe7d2dSDave Chinner 	xfs_agnumber_t		agno,
1633ebe7d2dSDave Chinner 	xfs_agblock_t		agbno,
1643ebe7d2dSDave Chinner 	unsigned int		count,
1653ebe7d2dSDave Chinner 	unsigned int		inode_size,
1663ebe7d2dSDave Chinner 	xfs_agblock_t		length,
1673ebe7d2dSDave Chinner 	unsigned int		generation)
1683ebe7d2dSDave Chinner {
1693ebe7d2dSDave Chinner 	struct xfs_icreate_item	*icp;
1703ebe7d2dSDave Chinner 
1713ebe7d2dSDave Chinner 	icp = kmem_zone_zalloc(xfs_icreate_zone, KM_SLEEP);
1723ebe7d2dSDave Chinner 
1733ebe7d2dSDave Chinner 	xfs_log_item_init(tp->t_mountp, &icp->ic_item, XFS_LI_ICREATE,
1743ebe7d2dSDave Chinner 			  &xfs_icreate_item_ops);
1753ebe7d2dSDave Chinner 
1763ebe7d2dSDave Chinner 	icp->ic_format.icl_type = XFS_LI_ICREATE;
1773ebe7d2dSDave Chinner 	icp->ic_format.icl_size = 1;	/* single vector */
1783ebe7d2dSDave Chinner 	icp->ic_format.icl_ag = cpu_to_be32(agno);
1793ebe7d2dSDave Chinner 	icp->ic_format.icl_agbno = cpu_to_be32(agbno);
1803ebe7d2dSDave Chinner 	icp->ic_format.icl_count = cpu_to_be32(count);
1813ebe7d2dSDave Chinner 	icp->ic_format.icl_isize = cpu_to_be32(inode_size);
1823ebe7d2dSDave Chinner 	icp->ic_format.icl_length = cpu_to_be32(length);
1833ebe7d2dSDave Chinner 	icp->ic_format.icl_gen = cpu_to_be32(generation);
1843ebe7d2dSDave Chinner 
1853ebe7d2dSDave Chinner 	xfs_trans_add_item(tp, &icp->ic_item);
1863ebe7d2dSDave Chinner 	tp->t_flags |= XFS_TRANS_DIRTY;
1873ebe7d2dSDave Chinner 	icp->ic_item.li_desc->lid_flags |= XFS_LID_DIRTY;
1883ebe7d2dSDave Chinner }
189