Annotation of sys/xfs/xfs_node.c, Revision 1.1
1.1 ! nbrk 1: /*
! 2: * Copyright (c) 2002 - 2003, Stockholms Universitet
! 3: * (Stockholm University, Stockholm Sweden)
! 4: * All rights reserved.
! 5: *
! 6: * Redistribution and use in source and binary forms, with or without
! 7: * modification, are permitted provided that the following conditions
! 8: * are met:
! 9: *
! 10: * 1. Redistributions of source code must retain the above copyright
! 11: * notice, this list of conditions and the following disclaimer.
! 12: *
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: *
! 17: * 3. Neither the name of the university nor the names of its contributors
! 18: * may be used to endorse or promote products derived from this software
! 19: * without specific prior written permission.
! 20: *
! 21: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
! 22: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
! 25: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 26: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 27: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 28: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 29: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 30: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 31: * POSSIBILITY OF SUCH DAMAGE.
! 32: */
! 33:
! 34: #include <xfs/xfs_locl.h>
! 35: #include <xfs/xfs_common.h>
! 36: #include <xfs/xfs_fs.h>
! 37: #include <xfs/xfs_deb.h>
! 38: #include <xfs/xfs_node.h>
! 39: #include <xfs/xfs_vnodeops.h>
! 40: #include <xfs/xfs_queue.h>
! 41:
! 42: RCSID("$arla: xfs_node.c,v 1.3 2003/02/06 12:56:09 lha Exp $");
! 43:
! 44: #define xfs_hash(node) \
! 45: (((node)->a+(node)->b+(node)->c+(node)->d) % XN_HASHSIZE)
! 46:
! 47: /*
! 48: * Init the nnp node storage system
! 49: */
! 50:
! 51: void
! 52: nnfs_init_head(struct xfs_nodelist_head *head)
! 53: {
! 54: int i;
! 55:
! 56: for (i = 0; i < XN_HASHSIZE; i++)
! 57: NNPQUEUE_INIT(&head->nh_nodelist[i]);
! 58: }
! 59:
! 60: /*
! 61: * Tries to purge all nodes from the hashtable. Nodes that unpurgeable
! 62: * (still used nodes) are given to proc for special termination
! 63: * (conversion to dead node).
! 64: */
! 65:
! 66: void
! 67: xfs_node_purge(struct xfs_nodelist_head *head,
! 68: void (*func)(struct xfs_node *))
! 69: {
! 70: panic("xfs_node_purge");
! 71: }
! 72:
! 73: /*
! 74: * xfs_node_find returns the node with the handle `handlep'.
! 75: */
! 76:
! 77: struct xfs_node *
! 78: xfs_node_find(struct xfs_nodelist_head *head, xfs_handle *handlep)
! 79: {
! 80: struct nh_node_list *h;
! 81: struct xfs_node *nn;
! 82:
! 83: h = &head->nh_nodelist[xfs_hash(handlep)];
! 84:
! 85: NNPQUEUE_FOREACH(nn, h, nn_hash) {
! 86: if (xfs_handle_eq(handlep, &nn->handle))
! 87: break;
! 88: }
! 89:
! 90: return nn;
! 91: }
! 92:
! 93: /*
! 94: * Remove the node `node' from the node storage system.
! 95: */
! 96:
! 97: void
! 98: xfs_remove_node(struct xfs_nodelist_head *head, struct xfs_node *node)
! 99: {
! 100: struct nh_node_list *h;
! 101:
! 102: h = &head->nh_nodelist[xfs_hash(&node->handle)];
! 103: NNPQUEUE_REMOVE(node, h, nn_hash);
! 104: }
! 105:
! 106: /*
! 107: * Add the node `node' from the node storage system.
! 108: */
! 109:
! 110: void
! 111: xfs_insert(struct xfs_nodelist_head *head, struct xfs_node *node)
! 112: {
! 113: struct nh_node_list *h;
! 114:
! 115: h = &head->nh_nodelist[xfs_hash(&node->handle)];
! 116: NNPQUEUE_INSERT_HEAD(h, node, nn_hash);
! 117: }
! 118:
! 119: /*
! 120: * Update `old_handlep' in the node list `head' to `new_handlep'.
! 121: */
! 122:
! 123: int
! 124: xfs_update_handle(struct xfs_nodelist_head *head,
! 125: xfs_handle *old_handlep, xfs_handle *new_handlep)
! 126: {
! 127: struct xfs_node *node;
! 128:
! 129: node = xfs_node_find(head, new_handlep);
! 130: if (node)
! 131: return EEXIST;
! 132: node = xfs_node_find(head, old_handlep);
! 133: if (node == NULL)
! 134: return ENOENT;
! 135: xfs_remove_node(head, node);
! 136: node->handle = *new_handlep;
! 137: xfs_insert(head, node);
! 138:
! 139: return 0;
! 140: }
CVSweb