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