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