/* * linux/fs/nfs/blocklayout/blocklayout.h * * Module for the NFSv4.1 pNFS block layout driver. * * Copyright (c) 2006 The Regents of the University of Michigan. * All rights reserved. * * Andy Adamson * Fred Isaman * * permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any purpose, * so long as the name of the university of michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. if * the above copyright notice or any other identification of the * university of michigan is included in any copy of any portion of * this software, then the disclaimer below must also be included. * * this software is provided as is, without representation from the * university of michigan as to its fitness for any purpose, and without * warranty by the university of michigan of any kind, either express * or implied, including without limitation the implied warranties of * merchantability and fitness for a particular purpose. the regents * of the university of michigan shall not be liable for any damages, * including special, indirect, incidental, or consequential damages, * with respect to any claim arising out or in connection with the use * of the software, even if it has been or is hereafter advised of the * possibility of such damages. */ #include "blocklayout.h" #define NFSDBG_FACILITY NFSDBG_PNFS_LD static void print_bl_extent(struct pnfs_block_extent *be) { dprintk("PRINT EXTENT extent %p\n", be); if (be) { dprintk(" be_f_offset %llu\n", (u64)be->be_f_offset); dprintk(" be_length %llu\n", (u64)be->be_length); dprintk(" be_v_offset %llu\n", (u64)be->be_v_offset); dprintk(" be_state %d\n", be->be_state); } } static void destroy_extent(struct kref *kref) { struct pnfs_block_extent *be; be = container_of(kref, struct pnfs_block_extent, be_refcnt); dprintk("%s be=%p\n", __func__, be); kfree(be); } void bl_put_extent(struct pnfs_block_extent *be) { if (be) { dprintk("%s enter %p (%i)\n", __func__, be, atomic_read(&be->be_refcnt.refcount)); kref_put(&be->be_refcnt, destroy_extent); } } struct pnfs_block_extent *bl_alloc_extent(void) { struct pnfs_block_extent *be; be = kmalloc(sizeof(struct pnfs_block_extent), GFP_NOFS); if (!be) return NULL; INIT_LIST_HEAD(&be->be_node); kref_init(&be->be_refcnt); be->be_inval = NULL; return be; } static void print_elist(struct list_head *list) { struct pnfs_block_extent *be; dprintk("****************\n"); dprintk("Extent list looks like:\n"); list_for_each_entry(be, list, be_node) { print_bl_extent(be); } dprintk("****************\n"); }