]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.suse/ocfs2-Make-high-level-btree-extend-co.patch
Revert "Move xen patchset to new version's subdir."
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.suse / ocfs2-Make-high-level-btree-extend-co.patch
diff --git a/src/patches/suse-2.6.27.31/patches.suse/ocfs2-Make-high-level-btree-extend-co.patch b/src/patches/suse-2.6.27.31/patches.suse/ocfs2-Make-high-level-btree-extend-co.patch
deleted file mode 100644 (file)
index 96b9e23..0000000
+++ /dev/null
@@ -1,420 +0,0 @@
-From: Tao Ma <tao.ma@oracle.com>
-Subject: [PATCH 04/16] ocfs2: Make high level btree extend code generic
-Patch-mainline: 2.6.28?
-References: FATE302067 
-
-Factor out the non-inode specifics of ocfs2_do_extend_allocation() into a more generic
-function, ocfs2_do_cluster_allocation(). ocfs2_do_extend_allocation calls
-ocfs2_do_cluster_allocation() now, but the latter can be used for other
-btree types as well.
-
-Signed-off-by: Tao Ma <tao.ma@oracle.com>
-Signed-off-by: Mark Fasheh <mfasheh@suse.com>
----
- fs/ocfs2/alloc.c |  110 ++++++++++++++++++++++++++++++++++++++++++++
- fs/ocfs2/alloc.h |   17 ++++++
- fs/ocfs2/aops.c  |    8 +--
- fs/ocfs2/dir.c   |    6 +-
- fs/ocfs2/file.c  |  136 ++++++++++---------------------------------------------
- fs/ocfs2/file.h  |   26 ++++------
- fs/ocfs2/namei.c |    8 +--
- 7 files changed, 176 insertions(+), 135 deletions(-)
-
---- a/fs/ocfs2/alloc.c
-+++ b/fs/ocfs2/alloc.c
-@@ -4302,6 +4302,116 @@ bail:
-       return status;
- }
-+/*
-+ * Allcate and add clusters into the extent b-tree.
-+ * The new clusters(clusters_to_add) will be inserted at logical_offset.
-+ * The extent b-tree's root is root_el and it should be in root_bh, and
-+ * it is not limited to the file storage. Any extent tree can use this
-+ * function if it implements the proper ocfs2_extent_tree.
-+ */
-+int ocfs2_add_clusters_in_btree(struct ocfs2_super *osb,
-+                              struct inode *inode,
-+                              u32 *logical_offset,
-+                              u32 clusters_to_add,
-+                              int mark_unwritten,
-+                              struct buffer_head *root_bh,
-+                              struct ocfs2_extent_list *root_el,
-+                              handle_t *handle,
-+                              struct ocfs2_alloc_context *data_ac,
-+                              struct ocfs2_alloc_context *meta_ac,
-+                              enum ocfs2_alloc_restarted *reason_ret,
-+                              enum ocfs2_extent_tree_type type)
-+{
-+      int status = 0;
-+      int free_extents;
-+      enum ocfs2_alloc_restarted reason = RESTART_NONE;
-+      u32 bit_off, num_bits;
-+      u64 block;
-+      u8 flags = 0;
-+
-+      BUG_ON(!clusters_to_add);
-+
-+      if (mark_unwritten)
-+              flags = OCFS2_EXT_UNWRITTEN;
-+
-+      free_extents = ocfs2_num_free_extents(osb, inode, root_bh, type);
-+      if (free_extents < 0) {
-+              status = free_extents;
-+              mlog_errno(status);
-+              goto leave;
-+      }
-+
-+      /* there are two cases which could cause us to EAGAIN in the
-+       * we-need-more-metadata case:
-+       * 1) we haven't reserved *any*
-+       * 2) we are so fragmented, we've needed to add metadata too
-+       *    many times. */
-+      if (!free_extents && !meta_ac) {
-+              mlog(0, "we haven't reserved any metadata!\n");
-+              status = -EAGAIN;
-+              reason = RESTART_META;
-+              goto leave;
-+      } else if ((!free_extents)
-+                 && (ocfs2_alloc_context_bits_left(meta_ac)
-+                     < ocfs2_extend_meta_needed(root_el))) {
-+              mlog(0, "filesystem is really fragmented...\n");
-+              status = -EAGAIN;
-+              reason = RESTART_META;
-+              goto leave;
-+      }
-+
-+      status = __ocfs2_claim_clusters(osb, handle, data_ac, 1,
-+                                      clusters_to_add, &bit_off, &num_bits);
-+      if (status < 0) {
-+              if (status != -ENOSPC)
-+                      mlog_errno(status);
-+              goto leave;
-+      }
-+
-+      BUG_ON(num_bits > clusters_to_add);
-+
-+      /* reserve our write early -- insert_extent may update the inode */
-+      status = ocfs2_journal_access(handle, inode, root_bh,
-+                                    OCFS2_JOURNAL_ACCESS_WRITE);
-+      if (status < 0) {
-+              mlog_errno(status);
-+              goto leave;
-+      }
-+
-+      block = ocfs2_clusters_to_blocks(osb->sb, bit_off);
-+      mlog(0, "Allocating %u clusters at block %u for inode %llu\n",
-+           num_bits, bit_off, (unsigned long long)OCFS2_I(inode)->ip_blkno);
-+      status = ocfs2_insert_extent(osb, handle, inode, root_bh,
-+                                   *logical_offset, block, num_bits,
-+                                   flags, meta_ac, type);
-+      if (status < 0) {
-+              mlog_errno(status);
-+              goto leave;
-+      }
-+
-+      status = ocfs2_journal_dirty(handle, root_bh);
-+      if (status < 0) {
-+              mlog_errno(status);
-+              goto leave;
-+      }
-+
-+      clusters_to_add -= num_bits;
-+      *logical_offset += num_bits;
-+
-+      if (clusters_to_add) {
-+              mlog(0, "need to alloc once more, wanted = %u\n",
-+                   clusters_to_add);
-+              status = -EAGAIN;
-+              reason = RESTART_TRANS;
-+      }
-+
-+leave:
-+      mlog_exit(status);
-+      if (reason_ret)
-+              *reason_ret = reason;
-+      return status;
-+}
-+
- static void ocfs2_make_right_split_rec(struct super_block *sb,
-                                      struct ocfs2_extent_rec *split_rec,
-                                      u32 cpos,
---- a/fs/ocfs2/alloc.h
-+++ b/fs/ocfs2/alloc.h
-@@ -41,6 +41,23 @@ int ocfs2_insert_extent(struct ocfs2_sup
-                       u8 flags,
-                       struct ocfs2_alloc_context *meta_ac,
-                       enum ocfs2_extent_tree_type et_type);
-+enum ocfs2_alloc_restarted {
-+      RESTART_NONE = 0,
-+      RESTART_TRANS,
-+      RESTART_META
-+};
-+int ocfs2_add_clusters_in_btree(struct ocfs2_super *osb,
-+                              struct inode *inode,
-+                              u32 *logical_offset,
-+                              u32 clusters_to_add,
-+                              int mark_unwritten,
-+                              struct buffer_head *root_bh,
-+                              struct ocfs2_extent_list *root_el,
-+                              handle_t *handle,
-+                              struct ocfs2_alloc_context *data_ac,
-+                              struct ocfs2_alloc_context *meta_ac,
-+                              enum ocfs2_alloc_restarted *reason_ret,
-+                              enum ocfs2_extent_tree_type type);
- struct ocfs2_cached_dealloc_ctxt;
- int ocfs2_mark_extent_written(struct inode *inode, struct buffer_head *root_bh,
-                             handle_t *handle, u32 cpos, u32 len, u32 phys,
---- a/fs/ocfs2/aops.c
-+++ b/fs/ocfs2/aops.c
-@@ -1255,10 +1255,10 @@ static int ocfs2_write_cluster(struct ad
-                * any additional semaphores or cluster locks.
-                */
-               tmp_pos = cpos;
--              ret = ocfs2_do_extend_allocation(OCFS2_SB(inode->i_sb), inode,
--                                               &tmp_pos, 1, 0, wc->w_di_bh,
--                                               wc->w_handle, data_ac,
--                                               meta_ac, NULL);
-+              ret = ocfs2_add_inode_data(OCFS2_SB(inode->i_sb), inode,
-+                                         &tmp_pos, 1, 0, wc->w_di_bh,
-+                                         wc->w_handle, data_ac,
-+                                         meta_ac, NULL);
-               /*
-                * This shouldn't happen because we must have already
-                * calculated the correct meta data allocation required. The
---- a/fs/ocfs2/dir.c
-+++ b/fs/ocfs2/dir.c
-@@ -1383,9 +1383,9 @@ static int ocfs2_do_extend_dir(struct su
-       if (extend) {
-               u32 offset = OCFS2_I(dir)->ip_clusters;
--              status = ocfs2_do_extend_allocation(OCFS2_SB(sb), dir, &offset,
--                                                  1, 0, parent_fe_bh, handle,
--                                                  data_ac, meta_ac, NULL);
-+              status = ocfs2_add_inode_data(OCFS2_SB(sb), dir, &offset,
-+                                            1, 0, parent_fe_bh, handle,
-+                                            data_ac, meta_ac, NULL);
-               BUG_ON(status == -EAGAIN);
-               if (status < 0) {
-                       mlog_errno(status);
---- a/fs/ocfs2/file.c
-+++ b/fs/ocfs2/file.c
-@@ -488,7 +488,7 @@ bail:
- }
- /*
-- * extend allocation only here.
-+ * extend file allocation only here.
-  * we'll update all the disk stuff, and oip->alloc_size
-  *
-  * expect stuff to be locked, a transaction started and enough data /
-@@ -497,107 +497,25 @@ bail:
-  * Will return -EAGAIN, and a reason if a restart is needed.
-  * If passed in, *reason will always be set, even in error.
-  */
--int ocfs2_do_extend_allocation(struct ocfs2_super *osb,
--                             struct inode *inode,
--                             u32 *logical_offset,
--                             u32 clusters_to_add,
--                             int mark_unwritten,
--                             struct buffer_head *fe_bh,
--                             handle_t *handle,
--                             struct ocfs2_alloc_context *data_ac,
--                             struct ocfs2_alloc_context *meta_ac,
--                             enum ocfs2_alloc_restarted *reason_ret)
-+int ocfs2_add_inode_data(struct ocfs2_super *osb,
-+                       struct inode *inode,
-+                       u32 *logical_offset,
-+                       u32 clusters_to_add,
-+                       int mark_unwritten,
-+                       struct buffer_head *fe_bh,
-+                       handle_t *handle,
-+                       struct ocfs2_alloc_context *data_ac,
-+                       struct ocfs2_alloc_context *meta_ac,
-+                       enum ocfs2_alloc_restarted *reason_ret)
- {
--      int status = 0;
--      int free_extents;
-       struct ocfs2_dinode *fe = (struct ocfs2_dinode *) fe_bh->b_data;
--      enum ocfs2_alloc_restarted reason = RESTART_NONE;
--      u32 bit_off, num_bits;
--      u64 block;
--      u8 flags = 0;
--
--      BUG_ON(!clusters_to_add);
--
--      if (mark_unwritten)
--              flags = OCFS2_EXT_UNWRITTEN;
--
--      free_extents = ocfs2_num_free_extents(osb, inode, fe_bh,
--                                            OCFS2_DINODE_EXTENT);
--      if (free_extents < 0) {
--              status = free_extents;
--              mlog_errno(status);
--              goto leave;
--      }
--
--      /* there are two cases which could cause us to EAGAIN in the
--       * we-need-more-metadata case:
--       * 1) we haven't reserved *any*
--       * 2) we are so fragmented, we've needed to add metadata too
--       *    many times. */
--      if (!free_extents && !meta_ac) {
--              mlog(0, "we haven't reserved any metadata!\n");
--              status = -EAGAIN;
--              reason = RESTART_META;
--              goto leave;
--      } else if ((!free_extents)
--                 && (ocfs2_alloc_context_bits_left(meta_ac)
--                     < ocfs2_extend_meta_needed(&fe->id2.i_list))) {
--              mlog(0, "filesystem is really fragmented...\n");
--              status = -EAGAIN;
--              reason = RESTART_META;
--              goto leave;
--      }
--
--      status = __ocfs2_claim_clusters(osb, handle, data_ac, 1,
--                                      clusters_to_add, &bit_off, &num_bits);
--      if (status < 0) {
--              if (status != -ENOSPC)
--                      mlog_errno(status);
--              goto leave;
--      }
--
--      BUG_ON(num_bits > clusters_to_add);
--
--      /* reserve our write early -- insert_extent may update the inode */
--      status = ocfs2_journal_access(handle, inode, fe_bh,
--                                    OCFS2_JOURNAL_ACCESS_WRITE);
--      if (status < 0) {
--              mlog_errno(status);
--              goto leave;
--      }
--
--      block = ocfs2_clusters_to_blocks(osb->sb, bit_off);
--      mlog(0, "Allocating %u clusters at block %u for inode %llu\n",
--           num_bits, bit_off, (unsigned long long)OCFS2_I(inode)->ip_blkno);
--      status = ocfs2_insert_extent(osb, handle, inode, fe_bh,
--                                   *logical_offset, block, num_bits,
--                                   flags, meta_ac, OCFS2_DINODE_EXTENT);
--      if (status < 0) {
--              mlog_errno(status);
--              goto leave;
--      }
-+      struct ocfs2_extent_list *el = &fe->id2.i_list;
--      status = ocfs2_journal_dirty(handle, fe_bh);
--      if (status < 0) {
--              mlog_errno(status);
--              goto leave;
--      }
--
--      clusters_to_add -= num_bits;
--      *logical_offset += num_bits;
--
--      if (clusters_to_add) {
--              mlog(0, "need to alloc once more, clusters = %u, wanted = "
--                   "%u\n", fe->i_clusters, clusters_to_add);
--              status = -EAGAIN;
--              reason = RESTART_TRANS;
--      }
--
--leave:
--      mlog_exit(status);
--      if (reason_ret)
--              *reason_ret = reason;
--      return status;
-+      return ocfs2_add_clusters_in_btree(osb, inode, logical_offset,
-+                                         clusters_to_add, mark_unwritten,
-+                                         fe_bh, el, handle,
-+                                         data_ac, meta_ac, reason_ret,
-+                                         OCFS2_DINODE_EXTENT);
- }
- static int __ocfs2_extend_allocation(struct inode *inode, u32 logical_start,
-@@ -676,16 +594,16 @@ restarted_transaction:
-       prev_clusters = OCFS2_I(inode)->ip_clusters;
--      status = ocfs2_do_extend_allocation(osb,
--                                          inode,
--                                          &logical_start,
--                                          clusters_to_add,
--                                          mark_unwritten,
--                                          bh,
--                                          handle,
--                                          data_ac,
--                                          meta_ac,
--                                          &why);
-+      status = ocfs2_add_inode_data(osb,
-+                                    inode,
-+                                    &logical_start,
-+                                    clusters_to_add,
-+                                    mark_unwritten,
-+                                    bh,
-+                                    handle,
-+                                    data_ac,
-+                                    meta_ac,
-+                                    &why);
-       if ((status < 0) && (status != -EAGAIN)) {
-               if (status != -ENOSPC)
-                       mlog_errno(status);
---- a/fs/ocfs2/file.h
-+++ b/fs/ocfs2/file.h
-@@ -31,6 +31,7 @@ extern const struct file_operations ocfs
- extern const struct inode_operations ocfs2_file_iops;
- extern const struct inode_operations ocfs2_special_file_iops;
- struct ocfs2_alloc_context;
-+enum ocfs2_alloc_restarted;
- struct ocfs2_file_private {
-       struct file             *fp_file;
-@@ -38,21 +39,16 @@ struct ocfs2_file_private {
-       struct ocfs2_lock_res   fp_flock;
- };
--enum ocfs2_alloc_restarted {
--      RESTART_NONE = 0,
--      RESTART_TRANS,
--      RESTART_META
--};
--int ocfs2_do_extend_allocation(struct ocfs2_super *osb,
--                             struct inode *inode,
--                             u32 *logical_offset,
--                             u32 clusters_to_add,
--                             int mark_unwritten,
--                             struct buffer_head *fe_bh,
--                             handle_t *handle,
--                             struct ocfs2_alloc_context *data_ac,
--                             struct ocfs2_alloc_context *meta_ac,
--                             enum ocfs2_alloc_restarted *reason_ret);
-+int ocfs2_add_inode_data(struct ocfs2_super *osb,
-+                       struct inode *inode,
-+                       u32 *logical_offset,
-+                       u32 clusters_to_add,
-+                       int mark_unwritten,
-+                       struct buffer_head *fe_bh,
-+                       handle_t *handle,
-+                       struct ocfs2_alloc_context *data_ac,
-+                       struct ocfs2_alloc_context *meta_ac,
-+                       enum ocfs2_alloc_restarted *reason_ret);
- int ocfs2_extend_no_holes(struct inode *inode, u64 new_i_size,
-                         u64 zero_to);
- int ocfs2_setattr(struct dentry *dentry, struct iattr *attr);
---- a/fs/ocfs2/namei.c
-+++ b/fs/ocfs2/namei.c
-@@ -1598,10 +1598,10 @@ static int ocfs2_symlink(struct inode *d
-               u32 offset = 0;
-               inode->i_op = &ocfs2_symlink_inode_operations;
--              status = ocfs2_do_extend_allocation(osb, inode, &offset, 1, 0,
--                                                  new_fe_bh,
--                                                  handle, data_ac, NULL,
--                                                  NULL);
-+              status = ocfs2_add_inode_data(osb, inode, &offset, 1, 0,
-+                                            new_fe_bh,
-+                                            handle, data_ac, NULL,
-+                                            NULL);
-               if (status < 0) {
-                       if (status != -ENOSPC && status != -EINTR) {
-                               mlog(ML_ERROR,