Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e73a819d authored by Tao Ma's avatar Tao Ma Committed by Joel Becker
Browse files

ocfs2: Add support for incrementing refcount in the tree.



    Given a physical cpos and length, increment the refcount
in the tree. If the extent has not been seen before, a refcount
record is created for it. Refcount records may be merged or
split by this operation.

Signed-off-by: default avatarTao Ma <tao.ma@oracle.com>
parent e2e9f608
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -353,7 +353,7 @@ static int ocfs2_search_for_hole_index(struct ocfs2_extent_list *el,
 * eb_bh is NULL. Otherwise, eb_bh should point to the extent block
 * containing el.
 */
static int ocfs2_figure_hole_clusters(struct inode *inode,
int ocfs2_figure_hole_clusters(struct ocfs2_caching_info *ci,
			       struct ocfs2_extent_list *el,
			       struct buffer_head *eb_bh,
			       u32 v_cluster,
@@ -375,7 +375,7 @@ static int ocfs2_figure_hole_clusters(struct inode *inode,
		if (le64_to_cpu(eb->h_next_leaf_blk) == 0ULL)
			goto no_more_extents;

		ret = ocfs2_read_extent_block(INODE_CACHE(inode),
		ret = ocfs2_read_extent_block(ci,
					      le64_to_cpu(eb->h_next_leaf_blk),
					      &next_eb_bh);
		if (ret) {
@@ -456,7 +456,8 @@ static int ocfs2_get_clusters_nocache(struct inode *inode,
		 * field.
		 */
		if (hole_len) {
			ret = ocfs2_figure_hole_clusters(inode, el, eb_bh,
			ret = ocfs2_figure_hole_clusters(INODE_CACHE(inode),
							 el, eb_bh,
							 v_cluster, &len);
			if (ret) {
				mlog_errno(ret);
+5 −0
Original line number Diff line number Diff line
@@ -61,6 +61,11 @@ int ocfs2_read_virt_blocks(struct inode *inode, u64 v_block, int nr,
			   struct buffer_head *bhs[], int flags,
			   int (*validate)(struct super_block *sb,
					   struct buffer_head *bh));
int ocfs2_figure_hole_clusters(struct ocfs2_caching_info *ci,
			       struct ocfs2_extent_list *el,
			       struct buffer_head *eb_bh,
			       u32 v_cluster,
			       u32 *num_clusters);
static inline int ocfs2_read_virt_block(struct inode *inode, u64 v_block,
					struct buffer_head **bh,
					int (*validate)(struct super_block *sb,
+7 −0
Original line number Diff line number Diff line
@@ -916,6 +916,7 @@ struct ocfs2_refcount_rec {
	__le32 r_refcount;	/* Reference count of this extent */
/*10*/
};
#define OCFS2_32BIT_POS_MASK		(0xffffffffULL)

#define OCFS2_REFCOUNT_LEAF_FL          (0x00000001)
#define OCFS2_REFCOUNT_TREE_FL          (0x00000002)
@@ -1394,6 +1395,12 @@ static inline u16 ocfs2_refcount_recs_per_rb(struct super_block *sb)

	return size / sizeof(struct ocfs2_refcount_rec);
}

static inline u32
ocfs2_get_ref_rec_low_cpos(const struct ocfs2_refcount_rec *rec)
{
	return le64_to_cpu(rec->r_cpos) & OCFS2_32BIT_POS_MASK;
}
#else
static inline int ocfs2_fast_symlink_chars(int blocksize)
{
+1053 −0

File changed.

Preview size limit exceeded, changes collapsed.