]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.suse/ocfs2-Use-ocfs2_extent_list-instead-o.patch
Reenabled linux-xen, added patches for Xen Kernel Version 2.6.27.31,
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.suse / ocfs2-Use-ocfs2_extent_list-instead-o.patch
diff --git a/src/patches/suse-2.6.27.31/patches.suse/ocfs2-Use-ocfs2_extent_list-instead-o.patch b/src/patches/suse-2.6.27.31/patches.suse/ocfs2-Use-ocfs2_extent_list-instead-o.patch
new file mode 100644 (file)
index 0000000..3f2d0e8
--- /dev/null
@@ -0,0 +1,223 @@
+From: Tao Ma <tao.ma@oracle.com>
+Subject: [PATCH 02/16] ocfs2: Use ocfs2_extent_list instead of ocfs2_dinode.
+Patch-mainline: 2.6.28?
+References: FATE302067
+
+ocfs2_extend_meta_needed(), ocfs2_calc_extend_credits() and
+ocfs2_reserve_new_metadata() are all useful for extent tree operations. But
+they are all limited to an inode btree because they use a struct
+ocfs2_dinode parameter. Change their parameter to struct ocfs2_extent_list
+(the part of an ocfs2_dinode they actually use) so that the xattr btree code
+can use these functions.
+
+Signed-off-by: Tao Ma <tao.ma@oracle.com>
+Signed-off-by: Mark Fasheh <mfasheh@suse.com>
+---
+ fs/ocfs2/alloc.c    |    3 ++-
+ fs/ocfs2/alloc.h    |   12 +++++++++---
+ fs/ocfs2/aops.c     |    3 ++-
+ fs/ocfs2/dir.c      |    5 +++--
+ fs/ocfs2/file.c     |    9 +++++----
+ fs/ocfs2/journal.h  |   17 +++++++++++------
+ fs/ocfs2/suballoc.c |    4 ++--
+ fs/ocfs2/suballoc.h |    7 ++++++-
+ 8 files changed, 40 insertions(+), 20 deletions(-)
+
+--- a/fs/ocfs2/alloc.c
++++ b/fs/ocfs2/alloc.c
+@@ -4536,7 +4536,8 @@ static int ocfs2_split_tree(struct inode
+       } else
+               rightmost_el = path_leaf_el(path);
+-      credits += path->p_tree_depth + ocfs2_extend_meta_needed(di);
++      credits += path->p_tree_depth +
++                 ocfs2_extend_meta_needed(&di->id2.i_list);
+       ret = ocfs2_extend_trans(handle, credits);
+       if (ret) {
+               mlog_errno(ret);
+--- a/fs/ocfs2/alloc.h
++++ b/fs/ocfs2/alloc.h
+@@ -48,8 +48,14 @@ int ocfs2_remove_extent(struct inode *in
+ int ocfs2_num_free_extents(struct ocfs2_super *osb,
+                          struct inode *inode,
+                          struct buffer_head *bh);
+-/* how many new metadata chunks would an allocation need at maximum? */
+-static inline int ocfs2_extend_meta_needed(struct ocfs2_dinode *fe)
++/*
++ * how many new metadata chunks would an allocation need at maximum?
++ *
++ * Please note that the caller must make sure that root_el is the root
++ * of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
++ * the result may be wrong.
++ */
++static inline int ocfs2_extend_meta_needed(struct ocfs2_extent_list *root_el)
+ {
+       /*
+        * Rather than do all the work of determining how much we need
+@@ -59,7 +65,7 @@ static inline int ocfs2_extend_meta_need
+        * new tree_depth==0 extent_block, and one block at the new
+        * top-of-the tree.
+        */
+-      return le16_to_cpu(fe->id2.i_list.l_tree_depth) + 2;
++      return le16_to_cpu(root_el->l_tree_depth) + 2;
+ }
+ void ocfs2_dinode_new_extent_list(struct inode *inode, struct ocfs2_dinode *di);
+--- a/fs/ocfs2/aops.c
++++ b/fs/ocfs2/aops.c
+@@ -1720,7 +1720,8 @@ int ocfs2_write_begin_nolock(struct addr
+                       goto out;
+               }
+-              credits = ocfs2_calc_extend_credits(inode->i_sb, di,
++              credits = ocfs2_calc_extend_credits(inode->i_sb,
++                                                  &di->id2.i_list,
+                                                   clusters_to_alloc);
+       }
+--- a/fs/ocfs2/dir.c
++++ b/fs/ocfs2/dir.c
+@@ -1430,6 +1430,7 @@ static int ocfs2_extend_dir(struct ocfs2
+       int credits, num_free_extents, drop_alloc_sem = 0;
+       loff_t dir_i_size;
+       struct ocfs2_dinode *fe = (struct ocfs2_dinode *) parent_fe_bh->b_data;
++      struct ocfs2_extent_list *el = &fe->id2.i_list;
+       struct ocfs2_alloc_context *data_ac = NULL;
+       struct ocfs2_alloc_context *meta_ac = NULL;
+       handle_t *handle = NULL;
+@@ -1488,7 +1489,7 @@ static int ocfs2_extend_dir(struct ocfs2
+               }
+               if (!num_free_extents) {
+-                      status = ocfs2_reserve_new_metadata(osb, fe, &meta_ac);
++                      status = ocfs2_reserve_new_metadata(osb, el, &meta_ac);
+                       if (status < 0) {
+                               if (status != -ENOSPC)
+                                       mlog_errno(status);
+@@ -1503,7 +1504,7 @@ static int ocfs2_extend_dir(struct ocfs2
+                       goto bail;
+               }
+-              credits = ocfs2_calc_extend_credits(sb, fe, 1);
++              credits = ocfs2_calc_extend_credits(sb, el, 1);
+       } else {
+               spin_unlock(&OCFS2_I(dir)->ip_lock);
+               credits = OCFS2_SIMPLE_DIR_EXTEND_CREDITS;
+--- a/fs/ocfs2/file.c
++++ b/fs/ocfs2/file.c
+@@ -540,7 +540,7 @@ int ocfs2_do_extend_allocation(struct oc
+               goto leave;
+       } else if ((!free_extents)
+                  && (ocfs2_alloc_context_bits_left(meta_ac)
+-                     < ocfs2_extend_meta_needed(fe))) {
++                     < ocfs2_extend_meta_needed(&fe->id2.i_list))) {
+               mlog(0, "filesystem is really fragmented...\n");
+               status = -EAGAIN;
+               reason = RESTART_META;
+@@ -652,7 +652,7 @@ int ocfs2_lock_allocators(struct inode *
+        */
+       if (!num_free_extents ||
+           (ocfs2_sparse_alloc(osb) && num_free_extents < max_recs_needed)) {
+-              ret = ocfs2_reserve_new_metadata(osb, di, meta_ac);
++              ret = ocfs2_reserve_new_metadata(osb, &di->id2.i_list, meta_ac);
+               if (ret < 0) {
+                       if (ret != -ENOSPC)
+                               mlog_errno(ret);
+@@ -732,7 +732,8 @@ restart_all:
+               goto leave;
+       }
+-      credits = ocfs2_calc_extend_credits(osb->sb, fe, clusters_to_add);
++      credits = ocfs2_calc_extend_credits(osb->sb, &fe->id2.i_list,
++                                          clusters_to_add);
+       handle = ocfs2_start_trans(osb, credits);
+       if (IS_ERR(handle)) {
+               status = PTR_ERR(handle);
+@@ -790,7 +791,7 @@ restarted_transaction:
+                       mlog(0, "restarting transaction.\n");
+                       /* TODO: This can be more intelligent. */
+                       credits = ocfs2_calc_extend_credits(osb->sb,
+-                                                          fe,
++                                                          &fe->id2.i_list,
+                                                           clusters_to_add);
+                       status = ocfs2_extend_trans(handle, credits);
+                       if (status < 0) {
+--- a/fs/ocfs2/journal.h
++++ b/fs/ocfs2/journal.h
+@@ -340,11 +340,16 @@ int                  ocfs2_journal_dirty
+ #define OCFS2_RENAME_CREDITS (3 * OCFS2_INODE_UPDATE_CREDITS + 3              \
+                            + OCFS2_UNLINK_CREDITS)
++/*
++ * Please note that the caller must make sure that root_el is the root
++ * of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
++ * the result may be wrong.
++ */
+ static inline int ocfs2_calc_extend_credits(struct super_block *sb,
+-                                          struct ocfs2_dinode *fe,
++                                          struct ocfs2_extent_list *root_el,
+                                           u32 bits_wanted)
+ {
+-      int bitmap_blocks, sysfile_bitmap_blocks, dinode_blocks;
++      int bitmap_blocks, sysfile_bitmap_blocks, extent_blocks;
+       /* bitmap dinode, group desc. + relinked group. */
+       bitmap_blocks = OCFS2_SUBALLOC_ALLOC;
+@@ -355,16 +360,16 @@ static inline int ocfs2_calc_extend_cred
+        * however many metadata chunks needed * a remaining suballoc
+        * alloc. */
+       sysfile_bitmap_blocks = 1 +
+-              (OCFS2_SUBALLOC_ALLOC - 1) * ocfs2_extend_meta_needed(fe);
++              (OCFS2_SUBALLOC_ALLOC - 1) * ocfs2_extend_meta_needed(root_el);
+       /* this does not include *new* metadata blocks, which are
+-       * accounted for in sysfile_bitmap_blocks. fe +
++       * accounted for in sysfile_bitmap_blocks. root_el +
+        * prev. last_eb_blk + blocks along edge of tree.
+        * calc_symlink_credits passes because we just need 1
+        * credit for the dinode there. */
+-      dinode_blocks = 1 + 1 + le16_to_cpu(fe->id2.i_list.l_tree_depth);
++      extent_blocks = 1 + 1 + le16_to_cpu(root_el->l_tree_depth);
+-      return bitmap_blocks + sysfile_bitmap_blocks + dinode_blocks;
++      return bitmap_blocks + sysfile_bitmap_blocks + extent_blocks;
+ }
+ static inline int ocfs2_calc_symlink_credits(struct super_block *sb)
+--- a/fs/ocfs2/suballoc.c
++++ b/fs/ocfs2/suballoc.c
+@@ -494,7 +494,7 @@ bail:
+ }
+ int ocfs2_reserve_new_metadata(struct ocfs2_super *osb,
+-                             struct ocfs2_dinode *fe,
++                             struct ocfs2_extent_list *root_el,
+                              struct ocfs2_alloc_context **ac)
+ {
+       int status;
+@@ -507,7 +507,7 @@ int ocfs2_reserve_new_metadata(struct oc
+               goto bail;
+       }
+-      (*ac)->ac_bits_wanted = ocfs2_extend_meta_needed(fe);
++      (*ac)->ac_bits_wanted = ocfs2_extend_meta_needed(root_el);
+       (*ac)->ac_which = OCFS2_AC_USE_META;
+       slot = osb->slot_num;
+       (*ac)->ac_group_search = ocfs2_block_group_search;
+--- a/fs/ocfs2/suballoc.h
++++ b/fs/ocfs2/suballoc.h
+@@ -59,8 +59,13 @@ static inline int ocfs2_alloc_context_bi
+       return ac->ac_bits_wanted - ac->ac_bits_given;
+ }
++/*
++ * Please note that the caller must make sure that root_el is the root
++ * of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
++ * the result may be wrong.
++ */
+ int ocfs2_reserve_new_metadata(struct ocfs2_super *osb,
+-                             struct ocfs2_dinode *fe,
++                             struct ocfs2_extent_list *root_el,
+                              struct ocfs2_alloc_context **ac);
+ int ocfs2_reserve_new_inode(struct ocfs2_super *osb,
+                           struct ocfs2_alloc_context **ac);