cregit-Linux how code gets into the kernel

Release 4.10 fs/ocfs2/alloc.c

Directory: fs/ocfs2
/* -*- mode: c; c-basic-offset: 8; -*-
 * vim: noexpandtab sw=8 ts=8 sts=0:
 *
 * alloc.c
 *
 * Extent allocs and frees
 *
 * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this program; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 021110-1307, USA.
 */

#include <linux/fs.h>
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/highmem.h>
#include <linux/swap.h>
#include <linux/quotaops.h>
#include <linux/blkdev.h>

#include <cluster/masklog.h>

#include "ocfs2.h"

#include "alloc.h"
#include "aops.h"
#include "blockcheck.h"
#include "dlmglue.h"
#include "extent_map.h"
#include "inode.h"
#include "journal.h"
#include "localalloc.h"
#include "suballoc.h"
#include "sysfile.h"
#include "file.h"
#include "super.h"
#include "uptodate.h"
#include "xattr.h"
#include "refcounttree.h"
#include "ocfs2_trace.h"

#include "buffer_head_io.h"


enum ocfs2_contig_type {
	
CONTIG_NONE = 0,
	
CONTIG_LEFT,
	
CONTIG_RIGHT,
	
CONTIG_LEFTRIGHT,
};

static enum ocfs2_contig_type
	ocfs2_extent_rec_contig(struct super_block *sb,
				struct ocfs2_extent_rec *ext,
				struct ocfs2_extent_rec *insert_rec);
/*
 * Operations for a specific extent tree type.
 *
 * To implement an on-disk btree (extent tree) type in ocfs2, add
 * an ocfs2_extent_tree_operations structure and the matching
 * ocfs2_init_<thingy>_extent_tree() function.  That's pretty much it
 * for the allocation portion of the extent tree.
 */

struct ocfs2_extent_tree_operations {
	/*
         * last_eb_blk is the block number of the right most leaf extent
         * block.  Most on-disk structures containing an extent tree store
         * this value for fast access.  The ->eo_set_last_eb_blk() and
         * ->eo_get_last_eb_blk() operations access this value.  They are
         *  both required.
         */
	
void (*eo_set_last_eb_blk)(struct ocfs2_extent_tree *et,
				   u64 blkno);
	
u64 (*eo_get_last_eb_blk)(struct ocfs2_extent_tree *et);

	/*
         * The on-disk structure usually keeps track of how many total
         * clusters are stored in this extent tree.  This function updates
         * that value.  new_clusters is the delta, and must be
         * added to the total.  Required.
         */
	
void (*eo_update_clusters)(struct ocfs2_extent_tree *et,
				   u32 new_clusters);

	/*
         * If this extent tree is supported by an extent map, insert
         * a record into the map.
         */
	
void (*eo_extent_map_insert)(struct ocfs2_extent_tree *et,
				     struct ocfs2_extent_rec *rec);

	/*
         * If this extent tree is supported by an extent map, truncate the
         * map to clusters,
         */
	
void (*eo_extent_map_truncate)(struct ocfs2_extent_tree *et,
				       u32 clusters);

	/*
         * If ->eo_insert_check() exists, it is called before rec is
         * inserted into the extent tree.  It is optional.
         */
	
int (*eo_insert_check)(struct ocfs2_extent_tree *et,
			       struct ocfs2_extent_rec *rec);
	
int (*eo_sanity_check)(struct ocfs2_extent_tree *et);

	/*
         * --------------------------------------------------------------
         * The remaining are internal to ocfs2_extent_tree and don't have
         * accessor functions
         */

	/*
         * ->eo_fill_root_el() takes et->et_object and sets et->et_root_el.
         * It is required.
         */
	
void (*eo_fill_root_el)(struct ocfs2_extent_tree *et);

	/*
         * ->eo_fill_max_leaf_clusters sets et->et_max_leaf_clusters if
         * it exists.  If it does not, et->et_max_leaf_clusters is set
         * to 0 (unlimited).  Optional.
         */
	
void (*eo_fill_max_leaf_clusters)(struct ocfs2_extent_tree *et);

	/*
         * ->eo_extent_contig test whether the 2 ocfs2_extent_rec
         * are contiguous or not. Optional. Don't need to set it if use
         * ocfs2_extent_rec as the tree leaf.
         */
	enum ocfs2_contig_type
		(
*eo_extent_contig)(struct ocfs2_extent_tree *et,
				    struct ocfs2_extent_rec *ext,
				    struct ocfs2_extent_rec *insert_rec);
};


/*
 * Pre-declare ocfs2_dinode_et_ops so we can use it as a sanity check
 * in the methods.
 */
static u64 ocfs2_dinode_get_last_eb_blk(struct ocfs2_extent_tree *et);
static void ocfs2_dinode_set_last_eb_blk(struct ocfs2_extent_tree *et,
					 u64 blkno);
static void ocfs2_dinode_update_clusters(struct ocfs2_extent_tree *et,
					 u32 clusters);
static void ocfs2_dinode_extent_map_insert(struct ocfs2_extent_tree *et,
					   struct ocfs2_extent_rec *rec);
static void ocfs2_dinode_extent_map_truncate(struct ocfs2_extent_tree *et,
					     u32 clusters);
static int ocfs2_dinode_insert_check(struct ocfs2_extent_tree *et,
				     struct ocfs2_extent_rec *rec);
static int ocfs2_dinode_sanity_check(struct ocfs2_extent_tree *et);
static void ocfs2_dinode_fill_root_el(struct ocfs2_extent_tree *et);

static const struct ocfs2_extent_tree_operations ocfs2_dinode_et_ops = {
	.eo_set_last_eb_blk	= ocfs2_dinode_set_last_eb_blk,
	.eo_get_last_eb_blk	= ocfs2_dinode_get_last_eb_blk,
	.eo_update_clusters	= ocfs2_dinode_update_clusters,
	.eo_extent_map_insert	= ocfs2_dinode_extent_map_insert,
	.eo_extent_map_truncate	= ocfs2_dinode_extent_map_truncate,
	.eo_insert_check	= ocfs2_dinode_insert_check,
	.eo_sanity_check	= ocfs2_dinode_sanity_check,
	.eo_fill_root_el	= ocfs2_dinode_fill_root_el,
};


static void ocfs2_dinode_set_last_eb_blk(struct ocfs2_extent_tree *et, u64 blkno) { struct ocfs2_dinode *di = et->et_object; BUG_ON(et->et_ops != &ocfs2_dinode_et_ops); di->i_last_eb_blk = cpu_to_le64(blkno); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma3890.48%133.33%
joel beckerjoel becker49.52%266.67%
Total42100.00%3100.00%


static u64 ocfs2_dinode_get_last_eb_blk(struct ocfs2_extent_tree *et) { struct ocfs2_dinode *di = et->et_object; BUG_ON(et->et_ops != &ocfs2_dinode_et_ops); return le64_to_cpu(di->i_last_eb_blk); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma3489.47%133.33%
joel beckerjoel becker410.53%266.67%
Total38100.00%3100.00%


static void ocfs2_dinode_update_clusters(struct ocfs2_extent_tree *et, u32 clusters) { struct ocfs2_inode_info *oi = cache_info_to_inode(et->et_ci); struct ocfs2_dinode *di = et->et_object; le32_add_cpu(&di->i_clusters, clusters); spin_lock(&oi->ip_lock); oi->ip_clusters = le32_to_cpu(di->i_clusters); spin_unlock(&oi->ip_lock); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma5677.78%133.33%
joel beckerjoel becker1622.22%266.67%
Total72100.00%3100.00%


static void ocfs2_dinode_extent_map_insert(struct ocfs2_extent_tree *et, struct ocfs2_extent_rec *rec) { struct inode *inode = &cache_info_to_inode(et->et_ci)->vfs_inode; ocfs2_extent_map_insert_rec(inode, rec); }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker38100.00%1100.00%
Total38100.00%1100.00%


static void ocfs2_dinode_extent_map_truncate(struct ocfs2_extent_tree *et, u32 clusters) { struct inode *inode = &cache_info_to_inode(et->et_ci)->vfs_inode; ocfs2_extent_map_trunc(inode, clusters); }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker36100.00%1100.00%
Total36100.00%1100.00%


static int ocfs2_dinode_insert_check(struct ocfs2_extent_tree *et, struct ocfs2_extent_rec *rec) { struct ocfs2_inode_info *oi = cache_info_to_inode(et->et_ci); struct ocfs2_super *osb = OCFS2_SB(oi->vfs_inode.i_sb); BUG_ON(oi->ip_dyn_features & OCFS2_INLINE_DATA_FL); mlog_bug_on_msg(!ocfs2_sparse_alloc(osb) && (oi->ip_clusters != le32_to_cpu(rec->e_cpos)), "Device %s, asking for sparse allocation: inode %llu, " "cpos %u, clusters %u\n", osb->dev_str, (unsigned long long)oi->ip_blkno, rec->e_cpos, oi->ip_clusters); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker9797.00%266.67%
tao matao ma33.00%133.33%
Total100100.00%3100.00%


static int ocfs2_dinode_sanity_check(struct ocfs2_extent_tree *et) { struct ocfs2_dinode *di = et->et_object; BUG_ON(et->et_ops != &ocfs2_dinode_et_ops); BUG_ON(!OCFS2_IS_VALID_DINODE(di)); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma3276.19%133.33%
joel beckerjoel becker1023.81%266.67%
Total42100.00%3100.00%


static void ocfs2_dinode_fill_root_el(struct ocfs2_extent_tree *et) { struct ocfs2_dinode *di = et->et_object; et->et_root_el = &di->id2.i_list; }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker2787.10%266.67%
tao matao ma412.90%133.33%
Total31100.00%3100.00%


static void ocfs2_xattr_value_fill_root_el(struct ocfs2_extent_tree *et) { struct ocfs2_xattr_value_buf *vb = et->et_object; et->et_root_el = &vb->vb_xv->xr_list; }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker31100.00%2100.00%
Total31100.00%2100.00%


static void ocfs2_xattr_value_set_last_eb_blk(struct ocfs2_extent_tree *et, u64 blkno) { struct ocfs2_xattr_value_buf *vb = et->et_object; vb->vb_xv->xr_last_eb_blk = cpu_to_le64(blkno); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma2882.35%133.33%
joel beckerjoel becker617.65%266.67%
Total34100.00%3100.00%


static u64 ocfs2_xattr_value_get_last_eb_blk(struct ocfs2_extent_tree *et) { struct ocfs2_xattr_value_buf *vb = et->et_object; return le64_to_cpu(vb->vb_xv->xr_last_eb_blk); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma2480.00%133.33%
joel beckerjoel becker620.00%266.67%
Total30100.00%3100.00%


static void ocfs2_xattr_value_update_clusters(struct ocfs2_extent_tree *et, u32 clusters) { struct ocfs2_xattr_value_buf *vb = et->et_object; le32_add_cpu(&vb->vb_xv->xr_clusters, clusters); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma2982.86%133.33%
joel beckerjoel becker617.14%266.67%
Total35100.00%3100.00%

static const struct ocfs2_extent_tree_operations ocfs2_xattr_value_et_ops = { .eo_set_last_eb_blk = ocfs2_xattr_value_set_last_eb_blk, .eo_get_last_eb_blk = ocfs2_xattr_value_get_last_eb_blk, .eo_update_clusters = ocfs2_xattr_value_update_clusters, .eo_fill_root_el = ocfs2_xattr_value_fill_root_el, };
static void ocfs2_xattr_tree_fill_root_el(struct ocfs2_extent_tree *et) { struct ocfs2_xattr_block *xb = et->et_object; et->et_root_el = &xb->xb_attrs.xb_root.xt_list; }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker33100.00%1100.00%
Total33100.00%1100.00%


static void ocfs2_xattr_tree_fill_max_leaf_clusters(struct ocfs2_extent_tree *et) { struct super_block *sb = ocfs2_metadata_cache_get_super(et->et_ci); et->et_max_leaf_clusters = ocfs2_clusters_for_bytes(sb, OCFS2_MAX_XATTR_TREE_LEAF_SIZE); }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker34100.00%2100.00%
Total34100.00%2100.00%


static void ocfs2_xattr_tree_set_last_eb_blk(struct ocfs2_extent_tree *et, u64 blkno) { struct ocfs2_xattr_block *xb = et->et_object; struct ocfs2_xattr_tree_root *xt = &xb->xb_attrs.xb_root; xt->xt_last_eb_blk = cpu_to_le64(blkno); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma4397.73%150.00%
joel beckerjoel becker12.27%150.00%
Total44100.00%2100.00%


static u64 ocfs2_xattr_tree_get_last_eb_blk(struct ocfs2_extent_tree *et) { struct ocfs2_xattr_block *xb = et->et_object; struct ocfs2_xattr_tree_root *xt = &xb->xb_attrs.xb_root; return le64_to_cpu(xt->xt_last_eb_blk); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma3997.50%150.00%
joel beckerjoel becker12.50%150.00%
Total40100.00%2100.00%


static void ocfs2_xattr_tree_update_clusters(struct ocfs2_extent_tree *et, u32 clusters) { struct ocfs2_xattr_block *xb = et->et_object; le32_add_cpu(&xb->xb_attrs.xb_root.xt_clusters, clusters); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma3697.30%150.00%
joel beckerjoel becker12.70%150.00%
Total37100.00%2100.00%

static const struct ocfs2_extent_tree_operations ocfs2_xattr_tree_et_ops = { .eo_set_last_eb_blk = ocfs2_xattr_tree_set_last_eb_blk, .eo_get_last_eb_blk = ocfs2_xattr_tree_get_last_eb_blk, .eo_update_clusters = ocfs2_xattr_tree_update_clusters, .eo_fill_root_el = ocfs2_xattr_tree_fill_root_el, .eo_fill_max_leaf_clusters = ocfs2_xattr_tree_fill_max_leaf_clusters, };
static void ocfs2_dx_root_set_last_eb_blk(struct ocfs2_extent_tree *et, u64 blkno) { struct ocfs2_dx_root_block *dx_root = et->et_object; dx_root->dr_last_eb_blk = cpu_to_le64(blkno); }

Contributors

PersonTokensPropCommitsCommitProp
mark fashehmark fasheh32100.00%1100.00%
Total32100.00%1100.00%


static u64 ocfs2_dx_root_get_last_eb_blk(struct ocfs2_extent_tree *et) { struct ocfs2_dx_root_block *dx_root = et->et_object; return le64_to_cpu(dx_root->dr_last_eb_blk); }

Contributors

PersonTokensPropCommitsCommitProp
mark fashehmark fasheh28100.00%1100.00%
Total28100.00%1100.00%


static void ocfs2_dx_root_update_clusters(struct ocfs2_extent_tree *et, u32 clusters) { struct ocfs2_dx_root_block *dx_root = et->et_object; le32_add_cpu(&dx_root->dr_clusters, clusters); }

Contributors

PersonTokensPropCommitsCommitProp
mark fashehmark fasheh33100.00%1100.00%
Total33100.00%1100.00%


static int ocfs2_dx_root_sanity_check(struct ocfs2_extent_tree *et) { struct ocfs2_dx_root_block *dx_root = et->et_object; BUG_ON(!OCFS2_IS_VALID_DX_ROOT(dx_root)); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
mark fashehmark fasheh32100.00%1100.00%
Total32100.00%1100.00%


static void ocfs2_dx_root_fill_root_el(struct ocfs2_extent_tree *et) { struct ocfs2_dx_root_block *dx_root = et->et_object; et->et_root_el = &dx_root->dr_list; }

Contributors

PersonTokensPropCommitsCommitProp
mark fashehmark fasheh29100.00%1100.00%
Total29100.00%1100.00%

static const struct ocfs2_extent_tree_operations ocfs2_dx_root_et_ops = { .eo_set_last_eb_blk = ocfs2_dx_root_set_last_eb_blk, .eo_get_last_eb_blk = ocfs2_dx_root_get_last_eb_blk, .eo_update_clusters = ocfs2_dx_root_update_clusters, .eo_sanity_check = ocfs2_dx_root_sanity_check, .eo_fill_root_el = ocfs2_dx_root_fill_root_el, };
static void ocfs2_refcount_tree_fill_root_el(struct ocfs2_extent_tree *et) { struct ocfs2_refcount_block *rb = et->et_object; et->et_root_el = &rb->rf_list; }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma29100.00%1100.00%
Total29100.00%1100.00%


static void ocfs2_refcount_tree_set_last_eb_blk(struct ocfs2_extent_tree *et, u64 blkno) { struct ocfs2_refcount_block *rb = et->et_object; rb->rf_last_eb_blk = cpu_to_le64(blkno); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma32100.00%1100.00%
Total32100.00%1100.00%


static u64 ocfs2_refcount_tree_get_last_eb_blk(struct ocfs2_extent_tree *et) { struct ocfs2_refcount_block *rb = et->et_object; return le64_to_cpu(rb->rf_last_eb_blk); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma28100.00%1100.00%
Total28100.00%1100.00%


static void ocfs2_refcount_tree_update_clusters(struct ocfs2_extent_tree *et, u32 clusters) { struct ocfs2_refcount_block *rb = et->et_object; le32_add_cpu(&rb->rf_clusters, clusters); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma33100.00%1100.00%
Total33100.00%1100.00%


static enum ocfs2_contig_type ocfs2_refcount_tree_extent_contig(struct ocfs2_extent_tree *et, struct ocfs2_extent_rec *ext, struct ocfs2_extent_rec *insert_rec) { return CONTIG_NONE; }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma25100.00%1100.00%
Total25100.00%1100.00%

static const struct ocfs2_extent_tree_operations ocfs2_refcount_tree_et_ops = { .eo_set_last_eb_blk = ocfs2_refcount_tree_set_last_eb_blk, .eo_get_last_eb_blk = ocfs2_refcount_tree_get_last_eb_blk, .eo_update_clusters = ocfs2_refcount_tree_update_clusters, .eo_fill_root_el = ocfs2_refcount_tree_fill_root_el, .eo_extent_contig = ocfs2_refcount_tree_extent_contig, };
static void __ocfs2_init_extent_tree(struct ocfs2_extent_tree *et, struct ocfs2_caching_info *ci, struct buffer_head *bh, ocfs2_journal_access_func access, void *obj, const struct ocfs2_extent_tree_operations *ops) { et->et_ops = ops; et->et_root_bh = bh; et->et_ci = ci; et->et_root_journal_access = access; if (!obj) obj = (void *)bh->b_data; et->et_object = obj; et->et_ops->eo_fill_root_el(et); if (!et->et_ops->eo_fill_max_leaf_clusters) et->et_max_leaf_clusters = 0; else et->et_ops->eo_fill_max_leaf_clusters(et); }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker8373.45%1071.43%
tao matao ma2925.66%321.43%
julia lawalljulia lawall10.88%17.14%
Total113100.00%14100.00%


void ocfs2_init_dinode_extent_tree(struct ocfs2_extent_tree *et, struct ocfs2_caching_info *ci, struct buffer_head *bh) { __ocfs2_init_extent_tree(et, ci, bh, ocfs2_journal_access_di, NULL, &ocfs2_dinode_et_ops); }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker36100.00%4100.00%
Total36100.00%4100.00%


void ocfs2_init_xattr_tree_extent_tree(struct ocfs2_extent_tree *et, struct ocfs2_caching_info *ci, struct buffer_head *bh) { __ocfs2_init_extent_tree(et, ci, bh, ocfs2_journal_access_xb, NULL, &ocfs2_xattr_tree_et_ops); }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker36100.00%4100.00%
Total36100.00%4100.00%


void ocfs2_init_xattr_value_extent_tree(struct ocfs2_extent_tree *et, struct ocfs2_caching_info *ci, struct ocfs2_xattr_value_buf *vb) { __ocfs2_init_extent_tree(et, ci, vb->vb_bh, vb->vb_access, vb, &ocfs2_xattr_value_et_ops); }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker40100.00%5100.00%
Total40100.00%5100.00%


void ocfs2_init_dx_root_extent_tree(struct ocfs2_extent_tree *et, struct ocfs2_caching_info *ci, struct buffer_head *bh) { __ocfs2_init_extent_tree(et, ci, bh, ocfs2_journal_access_dr, NULL, &ocfs2_dx_root_et_ops); }

Contributors

PersonTokensPropCommitsCommitProp
mark fashehmark fasheh3391.67%150.00%
joel beckerjoel becker38.33%150.00%
Total36100.00%2100.00%


void ocfs2_init_refcount_extent_tree(struct ocfs2_extent_tree *et, struct ocfs2_caching_info *ci, struct buffer_head *bh) { __ocfs2_init_extent_tree(et, ci, bh, ocfs2_journal_access_rb, NULL, &ocfs2_refcount_tree_et_ops); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma36100.00%1100.00%
Total36100.00%1100.00%


static inline void ocfs2_et_set_last_eb_blk(struct ocfs2_extent_tree *et, u64 new_last_eb_blk) { et->et_ops->eo_set_last_eb_blk(et, new_last_eb_blk); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma2388.46%133.33%
joel beckerjoel becker311.54%266.67%
Total26100.00%3100.00%


static inline u64 ocfs2_et_get_last_eb_blk(struct ocfs2_extent_tree *et) { return et->et_ops->eo_get_last_eb_blk(et); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma1986.36%133.33%
joel beckerjoel becker313.64%266.67%
Total22100.00%3100.00%


static inline void ocfs2_et_update_clusters(struct ocfs2_extent_tree *et, u32 clusters) { et->et_ops->eo_update_clusters(et, clusters); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma2388.46%133.33%
joel beckerjoel becker311.54%266.67%
Total26100.00%3100.00%


static inline void ocfs2_et_extent_map_insert(struct ocfs2_extent_tree *et, struct ocfs2_extent_rec *rec) { if (et->et_ops->eo_extent_map_insert) et->et_ops->eo_extent_map_insert(et, rec); }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker36100.00%1100.00%
Total36100.00%1100.00%


static inline void ocfs2_et_extent_map_truncate(struct ocfs2_extent_tree *et, u32 clusters) { if (et->et_ops->eo_extent_map_truncate) et->et_ops->eo_extent_map_truncate(et, clusters); }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker34100.00%1100.00%
Total34100.00%1100.00%


static inline int ocfs2_et_root_journal_access(handle_t *handle, struct ocfs2_extent_tree *et, int type) { return et->et_root_journal_access(handle, et->et_ci, et->et_root_bh, type); }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker37100.00%2100.00%
Total37100.00%2100.00%


static inline enum ocfs2_contig_type ocfs2_et_extent_contig(struct ocfs2_extent_tree *et, struct ocfs2_extent_rec *rec, struct ocfs2_extent_rec *insert_rec) { if (et->et_ops->eo_extent_contig) return et->et_ops->eo_extent_contig(et, rec, insert_rec); return ocfs2_extent_rec_contig( ocfs2_metadata_cache_get_super(et->et_ci), rec, insert_rec); }

Contributors

PersonTokensPropCommitsCommitProp
tao matao ma60100.00%1100.00%
Total60100.00%1100.00%


static inline int ocfs2_et_insert_check(struct ocfs2_extent_tree *et, struct ocfs2_extent_rec *rec) { int ret = 0; if (et->et_ops->eo_insert_check) ret = et->et_ops->eo_insert_check(et, rec); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker46100.00%1100.00%
Total46100.00%1100.00%


static inline int ocfs2_et_sanity_check(struct ocfs2_extent_tree *et) { int ret = 0; if (et->et_ops->eo_sanity_check) ret = et->et_ops->eo_sanity_check(et); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
joel beckerjoel becker39100.00%3100.00%
Total39100.00%3100.00%

static int ocfs2_cache_extent_block_free(struct ocfs2_cached_dealloc_ctxt *ctxt, struct ocfs2_extent_block *eb); static void ocfs2_adjust_rightmost_records(handle_t *handle, struct ocfs2_extent_tree *et, struct ocfs2_path *path, struct ocfs2_extent_rec *insert_rec); /* * Reset the actual path elements so that we can re-use the structure * to build another path. Generally, this involves freeing the buffer * heads. */
void ocfs2_reinit_path(struct ocfs2_path *path, int keep_root) { int i, start = 0, depth = 0; struct ocfs2_path_item *node; if (keep_root) start = 1; for(i = start; i < path_num_items(path); i++) { node = &path->p_node[i]; brelse(node->bh); node->bh = NULL; node->el = NULL; } /* * Tree depth may change during truncate, or insert. If we're * keeping the root extent list, then make sure that our path * structure reflects the proper depth. */ if (keep_root) depth = le16_to_cpu(path_root_el(path)->l_tree_depth); else path_root_access(path) = NULL; path->p_tree_depth = depth; }

Contributors

PersonTokensPropCommitsCommitProp
mark fashehmark fasheh10793.04%266.67%
joel beckerjoel becker86.96%133.33%
Total115100.00%3100.00%


void ocfs2_free_path(struct ocfs2_path *path) { if (path) { ocfs2_reinit_path(path, 0); kfree(path); } }

Contributors

PersonTokensPropCommitsCommitProp
mark fashehmark fasheh28100.00%2100.00%
Total28100.00%2100.00%

/* * All the elements of src into dest. After this call, src could be freed * without affecting dest. * * Both paths should have the same root. Any non-root elements of dest * will be freed. */
static void ocfs2_cp_path(struct ocfs2_path *dest, struct ocfs2_path *src) { int i; BUG_ON(path_root_bh(dest) != path_root_bh(src)); BUG_ON(path_root_el(dest) != path_root_el(src)); BUG_ON(path_root_access(dest) != path_root_access(src)); ocfs2_reinit_path(dest, 1); for(i = 1; i < OCFS2_MAX_PATH_DEPTH; i++) { dest->p_node[i].bh = src->p_node[i].bh; dest->p_node[i].el = src->p_node[i].el; if (dest->p_node[i].bh) get_bh(dest->p_node[i].bh); } }

Contributors

PersonTokensPropCommitsCommitProp
mark fashehmark fasheh12690.65%150.00%
joel beckerjoel becker139.35%150.00%
Total139100.00%2100.00%

/* * Make the *dest path the same as src and re-initialize src path to * have a root only. */
static void ocfs2_mv_path(struct ocfs2_path *dest, struct ocfs2_path *src) { int i; BUG_ON(path_root_bh(dest) != path_root_bh(src)); BUG_ON(path_root_access(dest) != path_root_access(src)); for(i = 1; i < OCFS2_MAX_PATH_DEPTH; i++) { brelse(dest->p_node[i].bh); dest->p_node[i].bh = src->p_node[i].bh; dest->p_node[i].el = src->p_node[i].el; src->p_node[i].bh = NULL; src->p_node[i].el = NULL; } }

Contributors

PersonTokensPropCommitsCommitProp
mark fashehmark fasheh11790.00%266.67%
joel beckerjoel becker1310.00%133.33%
Total130100.00%3100.00%

/* * Insert an extent block at given index. * * This will not take an additional reference on eb_bh. */
static inline void ocfs2_path_insert_eb(struct ocfs2_path *path, int index, struct buffer_head *eb_bh) { struct ocfs2_extent_block *eb = (struct ocfs2_extent_block *)eb_bh->b_data; /* * Right now, no root bh is an extent block, so this helps * catch code errors with dinode trees. The assertion can be * safely removed if we ever need to insert extent block * structures at the root. */ BUG_ON(index == 0); path->p_node[index].bh = eb_bh; path->p_node[index].el = &eb->h_list; }

Contributors

PersonTokensPropCommitsCommitProp
mark fashehmark fasheh67100.00%2100.00%
Total67100.00%2100.00%


static struct ocfs2_path *ocfs2_new_path(struct buffer_head *root_bh, struct ocfs2_extent_list *root_el, ocfs2_journal_access_func access) { struct ocfs2_path *path; BUG_ON(le16_to_cpu(root_el->l_tree_depth) >= OCFS2_MAX_PATH_DEPTH); path = kzalloc(sizeof(*path), GFP_NOFS); if (path) { path->p_tree_depth = le16_to_cpu(root_el->l_tree_depth); get_bh(root_bh); path_root_bh(path) = root_bh; path_root_el(path) = root_el; path_root_access(path) = access; } return path; }

Contributors

PersonTokensPropCommitsCommitProp
mark fashehmark fasheh7577.32%250.00%
tao matao ma1212.37%125.00%
joel beckerjoel becker1010.31%125.00%
Total97100.00%4100.00%


struct ocfs2_path *ocfs2_new_path_from_path(struct