ocfs2: Return extent flags for xattr value tree.
authorTao Ma <tao.ma@oracle.com>
Tue, 18 Aug 2009 03:41:57 +0000 (11:41 +0800)
committerJoel Becker <joel.becker@oracle.com>
Wed, 23 Sep 2009 03:09:39 +0000 (20:09 -0700)
With the new refcount tree, xattr value can also be refcounted
among multiple files. So return the appropriate extent flags
so that CoW can used it later.

Signed-off-by: Tao Ma <tao.ma@oracle.com>
fs/ocfs2/extent_map.c
fs/ocfs2/extent_map.h
fs/ocfs2/xattr.c

index 40b5105..843db64 100644 (file)
@@ -541,7 +541,8 @@ static void ocfs2_relative_extent_offsets(struct super_block *sb,
 
 int ocfs2_xattr_get_clusters(struct inode *inode, u32 v_cluster,
                             u32 *p_cluster, u32 *num_clusters,
-                            struct ocfs2_extent_list *el)
+                            struct ocfs2_extent_list *el,
+                            unsigned int *extent_flags)
 {
        int ret = 0, i;
        struct buffer_head *eb_bh = NULL;
@@ -593,6 +594,9 @@ int ocfs2_xattr_get_clusters(struct inode *inode, u32 v_cluster,
                *p_cluster = *p_cluster + coff;
                if (num_clusters)
                        *num_clusters = ocfs2_rec_clusters(el, rec) - coff;
+
+               if (extent_flags)
+                       *extent_flags = rec->e_flags;
        }
 out:
        if (eb_bh)
index 9942f47..e79d41c 100644 (file)
@@ -55,7 +55,8 @@ int ocfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 
 int ocfs2_xattr_get_clusters(struct inode *inode, u32 v_cluster,
                             u32 *p_cluster, u32 *num_clusters,
-                            struct ocfs2_extent_list *el);
+                            struct ocfs2_extent_list *el,
+                            unsigned int *extent_flags);
 
 int ocfs2_read_virt_blocks(struct inode *inode, u64 v_block, int nr,
                           struct buffer_head *bhs[], int flags,
index 1bf12c4..dda49c0 100644 (file)
@@ -704,7 +704,7 @@ static int ocfs2_xattr_shrink_size(struct inode *inode,
        while (trunc_len) {
                ret = ocfs2_xattr_get_clusters(inode, cpos, &phys_cpos,
                                               &alloc_size,
-                                              &vb->vb_xv->xr_list);
+                                              &vb->vb_xv->xr_list, NULL);
                if (ret) {
                        mlog_errno(ret);
                        goto out;
@@ -959,7 +959,7 @@ static int ocfs2_xattr_get_value_outside(struct inode *inode,
        cpos = 0;
        while (cpos < clusters) {
                ret = ocfs2_xattr_get_clusters(inode, cpos, &p_cluster,
-                                              &num_clusters, el);
+                                              &num_clusters, el, NULL);
                if (ret) {
                        mlog_errno(ret);
                        goto out;
@@ -1198,7 +1198,8 @@ static int __ocfs2_xattr_set_value_outside(struct inode *inode,
 
        while (cpos < clusters) {
                ret = ocfs2_xattr_get_clusters(inode, cpos, &p_cluster,
-                                              &num_clusters, &xv->xr_list);
+                                              &num_clusters, &xv->xr_list,
+                                              NULL);
                if (ret) {
                        mlog_errno(ret);
                        goto out;