forked from Minki/linux
6ae23c5555
During CoW, if the old extent record is refcounted, we allocate som new clusters and do CoW. Actually we can have some improvement here. If the old extent has refcount=1, that means now it is only used by this file. So we don't need to allocate new clusters, just remove the refcounted flag and it is OK. We also have to remove it from the refcount tree while not deleting it. Signed-off-by: Tao Ma <tao.ma@oracle.com>
58 lines
1.9 KiB
C
58 lines
1.9 KiB
C
/* -*- mode: c; c-basic-offset: 8; -*-
|
|
* vim: noexpandtab sw=8 ts=8 sts=0:
|
|
*
|
|
* refcounttree.h
|
|
*
|
|
* Copyright (C) 2009 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 version 2 as published by the Free Software Foundation.
|
|
*
|
|
* 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.
|
|
*/
|
|
#ifndef OCFS2_REFCOUNTTREE_H
|
|
#define OCFS2_REFCOUNTTREE_H
|
|
|
|
struct ocfs2_refcount_tree {
|
|
struct rb_node rf_node;
|
|
u64 rf_blkno;
|
|
u32 rf_generation;
|
|
struct rw_semaphore rf_sem;
|
|
struct ocfs2_lock_res rf_lockres;
|
|
struct kref rf_getcnt;
|
|
int rf_removed;
|
|
|
|
/* the following 4 fields are used by caching_info. */
|
|
struct ocfs2_caching_info rf_ci;
|
|
spinlock_t rf_lock;
|
|
struct mutex rf_io_mutex;
|
|
struct super_block *rf_sb;
|
|
};
|
|
|
|
void ocfs2_purge_refcount_trees(struct ocfs2_super *osb);
|
|
int ocfs2_lock_refcount_tree(struct ocfs2_super *osb, u64 ref_blkno, int rw,
|
|
struct ocfs2_refcount_tree **tree,
|
|
struct buffer_head **ref_bh);
|
|
void ocfs2_unlock_refcount_tree(struct ocfs2_super *osb,
|
|
struct ocfs2_refcount_tree *tree,
|
|
int rw);
|
|
|
|
int ocfs2_decrease_refcount(struct inode *inode,
|
|
handle_t *handle, u32 cpos, u32 len,
|
|
struct ocfs2_alloc_context *meta_ac,
|
|
struct ocfs2_cached_dealloc_ctxt *dealloc,
|
|
int delete);
|
|
int ocfs2_prepare_refcount_change_for_del(struct inode *inode,
|
|
struct buffer_head *di_bh,
|
|
u64 phys_blkno,
|
|
u32 clusters,
|
|
int *credits,
|
|
struct ocfs2_alloc_context **meta_ac);
|
|
int ocfs2_refcount_cow(struct inode *inode, struct buffer_head *di_bh,
|
|
u32 cpos, u32 write_len);
|
|
#endif /* OCFS2_REFCOUNTTREE_H */
|