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" 21*4fb6e8adSChristoph 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 943ebe7d2dSDave Chinner if (icp->ic_item.li_flags & XFS_LI_ABORTED) 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 */ 1363ebe7d2dSDave Chinner static 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