ocfs2: Add functions for extents refcounted.
Add function ocfs2_mark_extent_refcounted which can mark an extent refcounted. Signed-off-by: Tao Ma <tao.ma@oracle.com>
This commit is contained in:
Родитель
1823cb0b9f
Коммит
1aa75fea64
|
@ -5169,12 +5169,12 @@ out:
|
||||||
*
|
*
|
||||||
* The caller is responsible for passing down meta_ac if we'll need it.
|
* The caller is responsible for passing down meta_ac if we'll need it.
|
||||||
*/
|
*/
|
||||||
static int ocfs2_change_extent_flag(handle_t *handle,
|
int ocfs2_change_extent_flag(handle_t *handle,
|
||||||
struct ocfs2_extent_tree *et,
|
struct ocfs2_extent_tree *et,
|
||||||
u32 cpos, u32 len, u32 phys,
|
u32 cpos, u32 len, u32 phys,
|
||||||
struct ocfs2_alloc_context *meta_ac,
|
struct ocfs2_alloc_context *meta_ac,
|
||||||
struct ocfs2_cached_dealloc_ctxt *dealloc,
|
struct ocfs2_cached_dealloc_ctxt *dealloc,
|
||||||
int new_flags, int clear_flags)
|
int new_flags, int clear_flags)
|
||||||
{
|
{
|
||||||
int ret, index;
|
int ret, index;
|
||||||
struct super_block *sb = ocfs2_metadata_cache_get_super(et->et_ci);
|
struct super_block *sb = ocfs2_metadata_cache_get_super(et->et_ci);
|
||||||
|
|
|
@ -128,6 +128,12 @@ int ocfs2_mark_extent_written(struct inode *inode,
|
||||||
handle_t *handle, u32 cpos, u32 len, u32 phys,
|
handle_t *handle, u32 cpos, u32 len, u32 phys,
|
||||||
struct ocfs2_alloc_context *meta_ac,
|
struct ocfs2_alloc_context *meta_ac,
|
||||||
struct ocfs2_cached_dealloc_ctxt *dealloc);
|
struct ocfs2_cached_dealloc_ctxt *dealloc);
|
||||||
|
int ocfs2_change_extent_flag(handle_t *handle,
|
||||||
|
struct ocfs2_extent_tree *et,
|
||||||
|
u32 cpos, u32 len, u32 phys,
|
||||||
|
struct ocfs2_alloc_context *meta_ac,
|
||||||
|
struct ocfs2_cached_dealloc_ctxt *dealloc,
|
||||||
|
int new_flags, int clear_flags);
|
||||||
int ocfs2_remove_extent(handle_t *handle, struct ocfs2_extent_tree *et,
|
int ocfs2_remove_extent(handle_t *handle, struct ocfs2_extent_tree *et,
|
||||||
u32 cpos, u32 len,
|
u32 cpos, u32 len,
|
||||||
struct ocfs2_alloc_context *meta_ac,
|
struct ocfs2_alloc_context *meta_ac,
|
||||||
|
|
|
@ -516,6 +516,13 @@ static inline void ocfs2_add_links_count(struct ocfs2_dinode *di, int n)
|
||||||
ocfs2_set_links_count(di, links);
|
ocfs2_set_links_count(di, links);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int ocfs2_refcount_tree(struct ocfs2_super *osb)
|
||||||
|
{
|
||||||
|
if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_REFCOUNT_TREE)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* set / clear functions because cluster events can make these happen
|
/* set / clear functions because cluster events can make these happen
|
||||||
* in parallel so we want the transitions to be atomic. this also
|
* in parallel so we want the transitions to be atomic. this also
|
||||||
* means that any future flags osb_flags must be protected by spinlock
|
* means that any future flags osb_flags must be protected by spinlock
|
||||||
|
|
|
@ -2153,3 +2153,42 @@ out:
|
||||||
brelse(ref_root_bh);
|
brelse(ref_root_bh);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mark the already-existing extent at cpos as refcounted for len clusters.
|
||||||
|
* This adds the refcount extent flag.
|
||||||
|
*
|
||||||
|
* If the existing extent is larger than the request, initiate a
|
||||||
|
* split. An attempt will be made at merging with adjacent extents.
|
||||||
|
*
|
||||||
|
* The caller is responsible for passing down meta_ac if we'll need it.
|
||||||
|
*/
|
||||||
|
static int ocfs2_mark_extent_refcounted(struct inode *inode,
|
||||||
|
struct ocfs2_extent_tree *et,
|
||||||
|
handle_t *handle, u32 cpos,
|
||||||
|
u32 len, u32 phys,
|
||||||
|
struct ocfs2_alloc_context *meta_ac,
|
||||||
|
struct ocfs2_cached_dealloc_ctxt *dealloc)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
mlog(0, "Inode %lu refcount tree cpos %u, len %u, phys cluster %u\n",
|
||||||
|
inode->i_ino, cpos, len, phys);
|
||||||
|
|
||||||
|
if (!ocfs2_refcount_tree(OCFS2_SB(inode->i_sb))) {
|
||||||
|
ocfs2_error(inode->i_sb, "Inode %lu want to use refcount "
|
||||||
|
"tree, but the feature bit is not set in the "
|
||||||
|
"super block.", inode->i_ino);
|
||||||
|
ret = -EROFS;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ocfs2_change_extent_flag(handle, et, cpos,
|
||||||
|
len, phys, meta_ac, dealloc,
|
||||||
|
OCFS2_EXT_REFCOUNTED, 0);
|
||||||
|
if (ret)
|
||||||
|
mlog_errno(ret);
|
||||||
|
|
||||||
|
out:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче