Released version v48 v48
authorPali Rohár <pali.rohar@gmail.com>
Mon, 22 Aug 2011 12:45:25 +0000 (14:45 +0200)
committerPali Rohár <pali.rohar@gmail.com>
Mon, 22 Aug 2011 12:45:25 +0000 (14:45 +0200)
kernel-power-2.6.28/.gitignore [deleted file]
kernel-power-2.6.28/debian/changelog
kernel-power-2.6.28/debian/control
kernel-power-2.6.28/debian/kernel-power-flasher.preinst
kernel-power-2.6.28/debian/madde.patch
kernel-power-2.6.28/debian/patches/ext4-data-corruption.diff
kernel-power-2.6.28/debian/rules

diff --git a/kernel-power-2.6.28/.gitignore b/kernel-power-2.6.28/.gitignore
deleted file mode 100644 (file)
index 01e9800..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-#
-# NOTE! Don't add files that are generated in specific
-# subdirectories here. Add them in the ".gitignore" file
-# in that subdirectory instead.
-#
-# NOTE! Please use 'git-ls-files -i --exclude-standard'
-# command after changing this file, to see if there are
-# any tracked files which get ignored after the change.
-#
-# Normal rules
-#
-.*
-*.o
-*.o.*
-*.a
-*.s
-*.ko
-*.so
-*.so.dbg
-*.mod.c
-*.i
-*.lst
-*.symtypes
-*.order
-*.elf
-*.bin
-*.gz
-
-#
-# Top-level generic files
-#
-tags
-TAGS
-vmlinux
-System.map
-Module.markers
-Module.symvers
-!.gitignore
-!.mailmap
-
-#
-# Generated include files
-#
-include/asm
-include/asm-*/asm-offsets.h
-include/config
-include/linux/autoconf.h
-include/linux/compile.h
-include/linux/version.h
-include/linux/utsrelease.h
-include/linux/bounds.h
-
-# stgit generated dirs
-patches-*
-
-# quilt's files
-#patches
-#series
-
-# cscope files
-cscope.*
-ncscope.*
-
-*.orig
-*~
-\#*#
-
-# kernel-power tree
-.mailmap
-COPYING
-CREDITS
-Documentation
-Kbuild
-MAINTAINERS
-Makefile
-README
-REPORTING-BUGS
-arch
-block
-crypto
-drivers
-firmware
-fs
-include
-init
-ipc
-kernel
-lib
-mm
-net
-samples
-scripts
-security
-sound
-usr
-virt
index c3d1d95..f3d5501 100644 (file)
@@ -14,6 +14,8 @@ kernel-power (1:2.6.28-10power48) fremantle; urgency=low
   * enabled nilfs2 kernel module
   * enabled xts kernel module
   * fixed class 10 microSD card
   * enabled nilfs2 kernel module
   * enabled xts kernel module
   * fixed class 10 microSD card
+  * disabled patch i2c-battery.diff
+  * disabled board-rx51-peripherals.diff (disabled autoloading bq27x00_battery module)
 
  -- Pali Rohár <pali.rohar@gmail.com>  Sat, 09 Jul 2011 16:03:55 +0200
 
 
  -- Pali Rohár <pali.rohar@gmail.com>  Sat, 09 Jul 2011 16:03:55 +0200
 
index ac43331..99c601c 100644 (file)
@@ -236,7 +236,7 @@ Description: Linux kernel modules for debugging (kernel power 2.6.28.10)
 
 Package: kernel-power-debug
 Architecture: armel
 
 Package: kernel-power-debug
 Architecture: armel
-Description: Linux kernel debug symblos for kernel power 2.6.28.10
+Description: Linux kernel debug symblos (kernel power 2.6.28.10)
  This packages provides vmlinux file for the kernel and
  kernel modules related to debugging.
 
  This packages provides vmlinux file for the kernel and
  kernel modules related to debugging.
 
index 21f5256..e6d53cf 100644 (file)
@@ -1,6 +1,7 @@
 #!/bin/sh
 
 test "$1" = install || exit 0 # upgrades are fine
 #!/bin/sh
 
 test "$1" = install || exit 0 # upgrades are fine
+echo "Confirm information text on screen"
 f=/tmp/kernel-power-msg
 cat > $f <<EOF
 This will install Linux kernel for power user,
 f=/tmp/kernel-power-msg
 cat > $f <<EOF
 This will install Linux kernel for power user,
index b7be1c8..573e32e 100644 (file)
@@ -12,12 +12,12 @@ index ac43331..ec1431c 100644
  Standards-Version: 3.8.0
  
 diff --git a/kernel-power-2.6.28/debian/patches/series b/kernel-power-2.6.28/debian/patches/series
  Standards-Version: 3.8.0
  
 diff --git a/kernel-power-2.6.28/debian/patches/series b/kernel-power-2.6.28/debian/patches/series
-index 6f53deb..8917eb7 100644
+index f4f3d98..74a1598 100644
 --- a/kernel-power-2.6.28/debian/patches/series
 +++ b/kernel-power-2.6.28/debian/patches/series
 --- a/kernel-power-2.6.28/debian/patches/series
 +++ b/kernel-power-2.6.28/debian/patches/series
-@@ -4,6 +4,7 @@ nokia-20100903+0m5.diff
- nokia-20101501+0m5.diff
+@@ -6,6 +6,7 @@ nokia-20101501+0m5.diff
  nokia-20103103+0m5.diff
  nokia-20103103+0m5.diff
+ #nokia-20103103+0m5_usb.diff
  2.6.28.10.diff
 +madde.diff
  rx51_defconfig.diff
  2.6.28.10.diff
 +madde.diff
  rx51_defconfig.diff
@@ -36,7 +36,7 @@ index 6510f9e..51515ac 100755
  RELEASE := $(shell dpkg-parsechangelog | sed -ne 's/^Version: 1:\(.*\)/\1/p' | sed 's/-10/.10-/')
  REVISION := $(shell echo "$(RELEASE)" | sed 's/.*\./\./')
  EXTRAVERSION := EXTRAVERSION=$(REVISION)
  RELEASE := $(shell dpkg-parsechangelog | sed -ne 's/^Version: 1:\(.*\)/\1/p' | sed 's/-10/.10-/')
  REVISION := $(shell echo "$(RELEASE)" | sed 's/.*\./\./')
  EXTRAVERSION := EXTRAVERSION=$(REVISION)
-@@ -86,7 +88,10 @@ install-kernel:
+@@ -78,7 +80,10 @@ install-kernel:
        dh_testdir
        dh_testroot
        mkdir -p $(CURDIR)/debian/$(KERNEL_PACKAGE)/boot
        dh_testdir
        dh_testroot
        mkdir -p $(CURDIR)/debian/$(KERNEL_PACKAGE)/boot
@@ -48,7 +48,7 @@ index 6510f9e..51515ac 100755
        chmod 644 $(CURDIR)/debian/$(KERNEL_PACKAGE)/boot/zImage-$(RELEASE).fiasco
  
  install-bootimg:
        chmod 644 $(CURDIR)/debian/$(KERNEL_PACKAGE)/boot/zImage-$(RELEASE).fiasco
  
  install-bootimg:
-@@ -115,9 +120,9 @@ install-debug: install-modules
+@@ -107,9 +112,9 @@ install-debug: install-modules
        mkdir -p $(CURDIR)/debian/$(DEBUG_PACKAGE)/lib/modules/$(RELEASE)
        install -m644 $(KSRC)/vmlinux $(CURDIR)/debian/$(DEBUG_PACKAGE)/usr/lib/debug/vmlinux-$(RELEASE)
        for f in $$(find $(CURDIR)/debian/$(MODULES_PACKAGE) -name "*.ko"); do \
        mkdir -p $(CURDIR)/debian/$(DEBUG_PACKAGE)/lib/modules/$(RELEASE)
        install -m644 $(KSRC)/vmlinux $(CURDIR)/debian/$(DEBUG_PACKAGE)/usr/lib/debug/vmlinux-$(RELEASE)
        for f in $$(find $(CURDIR)/debian/$(MODULES_PACKAGE) -name "*.ko"); do \
@@ -61,7 +61,7 @@ index 6510f9e..51515ac 100755
        done
  
  install-modules-debug: install-debug
        done
  
  install-modules-debug: install-debug
-@@ -134,7 +139,7 @@ install-modules:
+@@ -126,7 +131,7 @@ install-modules:
        mkdir -p $(CURDIR)/debian/$(MODULES_PACKAGE)/etc/modprobe.d
        for f in $$(find $(KSRC) -name "*.ko"); do \
                install -c -m644 $$f $(CURDIR)/debian/$(MODULES_PACKAGE)/lib/modules/$(RELEASE)/$$(basename $$f); \
        mkdir -p $(CURDIR)/debian/$(MODULES_PACKAGE)/etc/modprobe.d
        for f in $$(find $(KSRC) -name "*.ko"); do \
                install -c -m644 $$f $(CURDIR)/debian/$(MODULES_PACKAGE)/lib/modules/$(RELEASE)/$$(basename $$f); \
@@ -70,7 +70,7 @@ index 6510f9e..51515ac 100755
        done
        install -m644 $(CURDIR)/debian/blacklist $(CURDIR)/debian/$(MODULES_PACKAGE)/etc/modprobe.d
  
        done
        install -m644 $(CURDIR)/debian/blacklist $(CURDIR)/debian/$(MODULES_PACKAGE)/etc/modprobe.d
  
-@@ -227,9 +232,6 @@ endif
+@@ -219,9 +224,6 @@ endif
        dh_testroot
        dh_installchangelogs -s
        dh_installdocs -s
        dh_testroot
        dh_installchangelogs -s
        dh_installdocs -s
index 64cb839..6222dda 100644 (file)
-diff -uprN linux-2.6.28.orig/Documentation/filesystems/ext4.txt linux-2.6.28/Documentation/filesystems/ext4.txt\r
---- linux-2.6.28.orig/Documentation/filesystems/ext4.txt       2009-05-02 20:54:43.000000000 +0200\r
-+++ linux-2.6.28/Documentation/filesystems/ext4.txt    2009-05-23 16:05:41.000000000 +0200\r
-@@ -76,7 +76,7 @@ Note: More extensive information for get\r
- * extent format more robust in face of on-disk corruption due to magics,\r
- * internal redunancy in tree\r
- * improved file allocation (multi-block alloc)\r
--* fix 32000 subdirectory limit\r
-+* lift 32000 subdirectory limit imposed by i_links_count[1]\r
- * nsec timestamps for mtime, atime, ctime, create time\r
- * inode version field on disk (NFSv4, Lustre)\r
- * reduced e2fsck time via uninit_bg feature\r
-@@ -91,6 +91,9 @@ Note: More extensive information for get\r
- * efficent new ordered mode in JBD2 and ext4(avoid using buffer head to force\r
-   the ordering)\r
\r
-+[1] Filesystems with a block size of 1k may see a limit imposed by the\r
-+directory hash tree having a maximum depth of two.\r
-+\r
- 2.2 Candidate features for future inclusion\r
\r
- * Online defrag (patches available but not well tested)\r
-diff -uprN linux-2.6.28.orig/fs/ext4/balloc.c linux-2.6.28/fs/ext4/balloc.c\r
---- linux-2.6.28.orig/fs/ext4/balloc.c 2009-05-02 20:54:43.000000000 +0200\r
-+++ linux-2.6.28/fs/ext4/balloc.c      2009-05-23 16:05:41.000000000 +0200\r
-@@ -608,7 +608,9 @@ int ext4_claim_free_blocks(struct ext4_s\r
-  */\r
- int ext4_should_retry_alloc(struct super_block *sb, int *retries)\r
- {\r
--      if (!ext4_has_free_blocks(EXT4_SB(sb), 1) || (*retries)++ > 3)\r
-+      if (!ext4_has_free_blocks(EXT4_SB(sb), 1) ||\r
-+          (*retries)++ > 3 ||\r
-+          !EXT4_SB(sb)->s_journal)\r
-               return 0;\r
\r
-       jbd_debug(1, "%s: retrying operation after ENOSPC\n", sb->s_id);\r
-diff -uprN linux-2.6.28.orig/fs/ext4/ext4.h linux-2.6.28/fs/ext4/ext4.h\r
---- linux-2.6.28.orig/fs/ext4/ext4.h   2009-05-02 20:54:43.000000000 +0200\r
-+++ linux-2.6.28/fs/ext4/ext4.h        2009-05-23 16:05:41.000000000 +0200\r
-@@ -248,6 +248,30 @@ struct flex_groups {\r
- #define EXT4_FL_USER_VISIBLE          0x000BDFFF /* User visible flags */\r
- #define EXT4_FL_USER_MODIFIABLE               0x000B80FF /* User modifiable flags */\r
\r
-+/* Flags that should be inherited by new inodes from their parent. */\r
-+#define EXT4_FL_INHERITED (EXT4_SECRM_FL | EXT4_UNRM_FL | EXT4_COMPR_FL |\\r
-+                         EXT4_SYNC_FL | EXT4_IMMUTABLE_FL | EXT4_APPEND_FL |\\r
-+                         EXT4_NODUMP_FL | EXT4_NOATIME_FL |\\r
-+                         EXT4_NOCOMPR_FL | EXT4_JOURNAL_DATA_FL |\\r
-+                         EXT4_NOTAIL_FL | EXT4_DIRSYNC_FL)\r
-+\r
-+/* Flags that are appropriate for regular files (all but dir-specific ones). */\r
-+#define EXT4_REG_FLMASK (~(EXT4_DIRSYNC_FL | EXT4_TOPDIR_FL))\r
-+\r
-+/* Flags that are appropriate for non-directories/regular files. */\r
-+#define EXT4_OTHER_FLMASK (EXT4_NODUMP_FL | EXT4_NOATIME_FL)\r
-+\r
-+/* Mask out flags that are inappropriate for the given type of inode. */\r
-+static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags)\r
-+{\r
-+      if (S_ISDIR(mode))\r
-+              return flags;\r
-+      else if (S_ISREG(mode))\r
-+              return flags & EXT4_REG_FLMASK;\r
-+      else\r
-+              return flags & EXT4_OTHER_FLMASK;\r
-+}\r
-+\r
- /*\r
-  * Inode dynamic state flags\r
-  */\r
-@@ -529,7 +556,7 @@ do {                                                                              \\r
- #define EXT4_MOUNT_NO_UID32           0x02000  /* Disable 32-bit UIDs */\r
- #define EXT4_MOUNT_XATTR_USER         0x04000 /* Extended user attributes */\r
- #define EXT4_MOUNT_POSIX_ACL          0x08000 /* POSIX Access Control Lists */\r
--#define EXT4_MOUNT_RESERVATION                0x10000 /* Preallocation */\r
-+#define EXT4_MOUNT_NO_AUTO_DA_ALLOC   0x10000 /* No auto delalloc mapping */\r
- #define EXT4_MOUNT_BARRIER            0x20000 /* Use block barriers */\r
- #define EXT4_MOUNT_NOBH                       0x40000 /* No bufferheads */\r
- #define EXT4_MOUNT_QUOTA              0x80000 /* Some quota option set */\r
-diff -uprN linux-2.6.28.orig/fs/ext4/extents.c linux-2.6.28/fs/ext4/extents.c\r
---- linux-2.6.28.orig/fs/ext4/extents.c        2009-05-02 20:54:43.000000000 +0200\r
-+++ linux-2.6.28/fs/ext4/extents.c     2009-05-23 16:05:41.000000000 +0200\r
-@@ -1120,7 +1120,8 @@ ext4_ext_search_right(struct inode *inod\r
-       struct ext4_extent_idx *ix;\r
-       struct ext4_extent *ex;\r
-       ext4_fsblk_t block;\r
--      int depth, ee_len;\r
-+      int depth;      /* Note, NOT eh_depth; depth from top of tree */\r
-+      int ee_len;\r
\r
-       BUG_ON(path == NULL);\r
-       depth = path->p_depth;\r
-@@ -1179,7 +1180,8 @@ ext4_ext_search_right(struct inode *inod\r
-               if (bh == NULL)\r
-                       return -EIO;\r
-               eh = ext_block_hdr(bh);\r
--              if (ext4_ext_check_header(inode, eh, depth)) {\r
-+              /* subtract from p_depth to get proper eh_depth */\r
-+              if (ext4_ext_check_header(inode, eh, path->p_depth - depth)) {\r
-                       put_bh(bh);\r
-                       return -EIO;\r
-               }\r
-@@ -1740,11 +1742,13 @@ ext4_ext_put_in_cache(struct inode *inod\r
- {\r
-       struct ext4_ext_cache *cex;\r
-       BUG_ON(len == 0);\r
-+      spin_lock(&EXT4_I(inode)->i_block_reservation_lock);\r
-       cex = &EXT4_I(inode)->i_cached_extent;\r
-       cex->ec_type = type;\r
-       cex->ec_block = block;\r
-       cex->ec_len = len;\r
-       cex->ec_start = start;\r
-+      spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);\r
- }\r
\r
- /*\r
-@@ -1801,12 +1805,17 @@ ext4_ext_in_cache(struct inode *inode, e\r
-                       struct ext4_extent *ex)\r
- {\r
-       struct ext4_ext_cache *cex;\r
-+      int ret = EXT4_EXT_CACHE_NO;\r
\r
-+      /* \r
-+       * We borrow i_block_reservation_lock to protect i_cached_extent\r
-+       */\r
-+      spin_lock(&EXT4_I(inode)->i_block_reservation_lock);\r
-       cex = &EXT4_I(inode)->i_cached_extent;\r
\r
-       /* has cache valid data? */\r
-       if (cex->ec_type == EXT4_EXT_CACHE_NO)\r
--              return EXT4_EXT_CACHE_NO;\r
-+              goto errout;\r
\r
-       BUG_ON(cex->ec_type != EXT4_EXT_CACHE_GAP &&\r
-                       cex->ec_type != EXT4_EXT_CACHE_EXTENT);\r
-@@ -1817,11 +1826,11 @@ ext4_ext_in_cache(struct inode *inode, e\r
-               ext_debug("%u cached by %u:%u:%llu\n",\r
-                               block,\r
-                               cex->ec_block, cex->ec_len, cex->ec_start);\r
--              return cex->ec_type;\r
-+              ret = cex->ec_type;\r
-       }\r
--\r
--      /* not in cache */\r
--      return EXT4_EXT_CACHE_NO;\r
-+errout:\r
-+      spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);\r
-+      return ret;\r
- }\r
\r
- /*\r
-@@ -2777,6 +2786,8 @@ int ext4_ext_get_blocks(handle_t *handle\r
-                               if (allocated > max_blocks)\r
-                                       allocated = max_blocks;\r
-                               set_buffer_unwritten(bh_result);\r
-+                              bh_result->b_bdev = inode->i_sb->s_bdev;\r
-+                              bh_result->b_blocknr = newblock;\r
-                               goto out2;\r
-                       }\r
\r
-diff -uprN linux-2.6.28.orig/fs/ext4/ialloc.c linux-2.6.28/fs/ext4/ialloc.c\r
---- linux-2.6.28.orig/fs/ext4/ialloc.c 2009-05-02 20:54:43.000000000 +0200\r
-+++ linux-2.6.28/fs/ext4/ialloc.c      2009-05-23 16:05:41.000000000 +0200\r
-@@ -188,7 +188,7 @@ void ext4_free_inode(handle_t *handle, s\r
-       struct ext4_group_desc *gdp;\r
-       struct ext4_super_block *es;\r
-       struct ext4_sb_info *sbi;\r
--      int fatal = 0, err;\r
-+      int fatal = 0, err, cleared;\r
-       ext4_group_t flex_group;\r
\r
-       if (atomic_read(&inode->i_count) > 1) {\r
-@@ -243,8 +243,10 @@ void ext4_free_inode(handle_t *handle, s\r
-               goto error_return;\r
\r
-       /* Ok, now we can actually update the inode bitmaps.. */\r
--      if (!ext4_clear_bit_atomic(sb_bgl_lock(sbi, block_group),\r
--                                      bit, bitmap_bh->b_data))\r
-+      spin_lock(sb_bgl_lock(sbi, block_group));\r
-+      cleared = ext4_clear_bit(bit, bitmap_bh->b_data);\r
-+      spin_unlock(sb_bgl_lock(sbi, block_group));\r
-+      if (!cleared)\r
-               ext4_error(sb, "ext4_free_inode",\r
-                          "bit already cleared for inode %lu", ino);\r
-       else {\r
-@@ -686,6 +688,7 @@ struct inode *ext4_new_inode(handle_t *h\r
-       struct inode *ret;\r
-       ext4_group_t i;\r
-       int free = 0;\r
-+      static int once = 1;\r
-       ext4_group_t flex_group;\r
\r
-       /* Cannot create files in a deleted directory */\r
-@@ -705,10 +708,12 @@ struct inode *ext4_new_inode(handle_t *h\r
-               ret2 = find_group_flex(sb, dir, &group);\r
-               if (ret2 == -1) {\r
-                       ret2 = find_group_other(sb, dir, &group);\r
--                      if (ret2 == 0 && printk_ratelimit())\r
-+                      if (ret2 == 0 && once) {\r
-+                              once = 0;\r
-                               printk(KERN_NOTICE "ext4: find_group_flex "\r
-                                      "failed, fallback succeeded dir %lu\n",\r
-                                      dir->i_ino);\r
-+                      }\r
-               }\r
-               goto got_group;\r
-       }\r
-@@ -862,16 +867,12 @@ got:\r
-       ei->i_disksize = 0;\r
\r
-       /*\r
--       * Don't inherit extent flag from directory. We set extent flag on\r
--       * newly created directory and file only if -o extent mount option is\r
--       * specified\r
-+       * Don't inherit extent flag from directory, amongst others. We set\r
-+       * extent flag on newly created directory and file only if -o extent\r
-+       * mount option is specified\r
-        */\r
--      ei->i_flags = EXT4_I(dir)->i_flags & ~(EXT4_INDEX_FL|EXT4_EXTENTS_FL);\r
--      if (S_ISLNK(mode))\r
--              ei->i_flags &= ~(EXT4_IMMUTABLE_FL|EXT4_APPEND_FL);\r
--      /* dirsync only applies to directories */\r
--      if (!S_ISDIR(mode))\r
--              ei->i_flags &= ~EXT4_DIRSYNC_FL;\r
-+      ei->i_flags =\r
-+              ext4_mask_flags(mode, EXT4_I(dir)->i_flags & EXT4_FL_INHERITED);\r
-       ei->i_file_acl = 0;\r
-       ei->i_dtime = 0;\r
-       ei->i_block_group = group;\r
-diff -uprN linux-2.6.28.orig/fs/ext4/inode.c linux-2.6.28/fs/ext4/inode.c\r
---- linux-2.6.28.orig/fs/ext4/inode.c  2009-05-02 20:54:43.000000000 +0200\r
-+++ linux-2.6.28/fs/ext4/inode.c       2009-05-23 16:05:41.000000000 +0200\r
-@@ -1052,6 +1059,7 @@ int ext4_get_blocks_wrap(handle_t *handl\r
-       int retval;\r
\r
-       clear_buffer_mapped(bh);\r
-+      clear_buffer_unwritten(bh);\r
\r
-       /*\r
-        * Try to see if we can get  the block without requesting\r
-@@ -1082,6 +1090,18 @@ int ext4_get_blocks_wrap(handle_t *handl\r
-               return retval;\r
\r
-       /*\r
-+       * When we call get_blocks without the create flag, the\r
-+       * BH_Unwritten flag could have gotten set if the blocks\r
-+       * requested were part of a uninitialized extent.  We need to\r
-+       * clear this flag now that we are committed to convert all or\r
-+       * part of the uninitialized extent to be an initialized\r
-+       * extent.  This is because we need to avoid the combination\r
-+       * of BH_Unwritten and BH_Mapped flags being simultaneously\r
-+       * set on the buffer_head.\r
-+       */\r
-+      clear_buffer_unwritten(bh);\r
-+\r
-+      /*\r
-        * New blocks allocate and/or writing to uninitialized extent\r
-        * will possibly result in updating i_data, so we take\r
-        * the write lock of i_data_sem, and call get_blocks()\r
-@@ -2180,6 +2200,10 @@ static int ext4_da_get_block_prep(struct\r
-                                 struct buffer_head *bh_result, int create)\r
- {\r
-       int ret = 0;\r
-+      sector_t invalid_block = ~((sector_t) 0xffff);\r
-+\r
-+      if (invalid_block < ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es))\r
-+              invalid_block = ~0;\r
\r
-       BUG_ON(create == 0);\r
-       BUG_ON(bh_result->b_size != inode->i_sb->s_blocksize);\r
-@@ -2201,11 +2225,18 @@ static int ext4_da_get_block_prep(struct\r
-                       /* not enough space to reserve */\r
-                       return ret;\r
\r
--              map_bh(bh_result, inode->i_sb, 0);\r
-+              map_bh(bh_result, inode->i_sb, invalid_block);\r
-               set_buffer_new(bh_result);\r
-               set_buffer_delay(bh_result);\r
-       } else if (ret > 0) {\r
-               bh_result->b_size = (ret << inode->i_blkbits);\r
-+              /*\r
-+               * With sub-block writes into unwritten extents\r
-+               * we also need to mark the buffer as new so that\r
-+               * the unwritten parts of the buffer gets correctly zeroed.\r
-+               */\r
-+              if (buffer_unwritten(bh_result))\r
-+                      set_buffer_new(bh_result);\r
-               ret = 0;\r
-       }\r
\r
-@@ -2493,7 +2524,7 @@ retry:\r
\r
-               ext4_journal_stop(handle);\r
\r
--              if (mpd.retval == -ENOSPC) {\r
-+              if ((mpd.retval == -ENOSPC) && sbi->s_journal) {\r
-                       /* commit the transaction which would\r
-                        * free blocks released in the transaction\r
-                        * and try again\r
-@@ -4167,11 +4243,9 @@ struct inode *ext4_iget(struct super_blo\r
-       ei->i_flags = le32_to_cpu(raw_inode->i_flags);\r
-       inode->i_blocks = ext4_inode_blocks(raw_inode, ei);\r
-       ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl_lo);\r
--      if (EXT4_SB(inode->i_sb)->s_es->s_creator_os !=\r
--          cpu_to_le32(EXT4_OS_HURD)) {\r
-+      if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_64BIT))\r
-               ei->i_file_acl |=\r
-                       ((__u64)le16_to_cpu(raw_inode->i_file_acl_high)) << 32;\r
--      }\r
-       inode->i_size = ext4_isize(raw_inode);\r
-       ei->i_disksize = inode->i_size;\r
-       inode->i_generation = le32_to_cpu(raw_inode->i_generation);\r
-@@ -4218,6 +4292,18 @@ struct inode *ext4_iget(struct super_blo\r
-                       (__u64)(le32_to_cpu(raw_inode->i_version_hi)) << 32;\r
-       }\r
\r
-+      if (ei->i_file_acl &&\r
-+          ((ei->i_file_acl < \r
-+            (le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block) +\r
-+             EXT4_SB(sb)->s_gdb_count)) ||\r
-+           (ei->i_file_acl >= ext4_blocks_count(EXT4_SB(sb)->s_es)))) {\r
-+              ext4_error(sb, __func__,\r
-+                         "bad extended attribute block %llu in inode #%lu",\r
-+                         ei->i_file_acl, inode->i_ino);\r
-+              ret = -EIO;\r
-+              goto bad_inode;\r
-+      }\r
-+\r
-       if (S_ISREG(inode->i_mode)) {\r
-               inode->i_op = &ext4_file_inode_operations;\r
-               inode->i_fop = &ext4_file_operations;\r
-@@ -4232,7 +4318,8 @@ struct inode *ext4_iget(struct super_blo\r
-                       inode->i_op = &ext4_symlink_inode_operations;\r
-                       ext4_set_aops(inode);\r
-               }\r
--      } else {\r
-+      } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||\r
-+            S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {\r
-               inode->i_op = &ext4_special_inode_operations;\r
-               if (raw_inode->i_block[0])\r
-                       init_special_inode(inode, inode->i_mode,\r
-@@ -4240,6 +4327,13 @@ struct inode *ext4_iget(struct super_blo\r
-               else\r
-                       init_special_inode(inode, inode->i_mode,\r
-                          new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));\r
-+      } else {\r
-+              brelse(bh);\r
-+              ret = -EIO;\r
-+              ext4_error(inode->i_sb, __func__, \r
-+                         "bogus i_mode (%o) for inode=%lu",\r
-+                         inode->i_mode, inode->i_ino);\r
-+              goto bad_inode;\r
-       }\r
-       brelse(iloc.bh);\r
-       ext4_set_inode_flags(inode);\r
-diff -uprN linux-2.6.28.orig/fs/ext4/ioctl.c linux-2.6.28/fs/ext4/ioctl.c\r
---- linux-2.6.28.orig/fs/ext4/ioctl.c  2009-05-02 20:54:43.000000000 +0200\r
-+++ linux-2.6.28/fs/ext4/ioctl.c       2009-05-23 16:05:41.000000000 +0200\r
-@@ -48,8 +48,7 @@ long ext4_ioctl(struct file *filp, unsig\r
-               if (err)\r
-                       return err;\r
\r
--              if (!S_ISDIR(inode->i_mode))\r
--                      flags &= ~EXT4_DIRSYNC_FL;\r
-+              flags = ext4_mask_flags(inode->i_mode, flags);\r
\r
-               err = -EPERM;\r
-               mutex_lock(&inode->i_mutex);\r
-diff -uprN linux-2.6.28.orig/fs/ext4/mballoc.c linux-2.6.28/fs/ext4/mballoc.c\r
---- linux-2.6.28.orig/fs/ext4/mballoc.c        2009-05-02 20:54:43.000000000 +0200\r
-+++ linux-2.6.28/fs/ext4/mballoc.c     2009-05-23 16:05:41.000000000 +0200\r
-@@ -1448,7 +1448,7 @@ static void ext4_mb_measure_extent(struc\r
-       struct ext4_free_extent *gex = &ac->ac_g_ex;\r
\r
-       BUG_ON(ex->fe_len <= 0);\r
--      BUG_ON(ex->fe_len >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));\r
-+      BUG_ON(ex->fe_len > EXT4_BLOCKS_PER_GROUP(ac->ac_sb));\r
-       BUG_ON(ex->fe_start >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));\r
-       BUG_ON(ac->ac_status != AC_STATUS_CONTINUE);\r
\r
-@@ -2692,7 +2692,7 @@ int ext4_mb_init(struct super_block *sb,\r
-       i = (sb->s_blocksize_bits + 2) * sizeof(unsigned int);\r
-       sbi->s_mb_maxs = kmalloc(i, GFP_KERNEL);\r
-       if (sbi->s_mb_maxs == NULL) {\r
--              kfree(sbi->s_mb_maxs);\r
-+              kfree(sbi->s_mb_offsets);\r
-               return -ENOMEM;\r
-       }\r
\r
-@@ -3289,7 +3289,7 @@ ext4_mb_normalize_request(struct ext4_al\r
-       }\r
-       BUG_ON(start + size <= ac->ac_o_ex.fe_logical &&\r
-                       start > ac->ac_o_ex.fe_logical);\r
--      BUG_ON(size <= 0 || size >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));\r
-+      BUG_ON(size <= 0 || size > EXT4_BLOCKS_PER_GROUP(ac->ac_sb));\r
\r
-       /* now prepare goal request */\r
\r
-@@ -3586,6 +3586,7 @@ static void ext4_mb_put_pa(struct ext4_a\r
-                       struct super_block *sb, struct ext4_prealloc_space *pa)\r
- {\r
-       unsigned long grp;\r
-+      ext4_fsblk_t grp_blk;\r
\r
-       if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0)\r
-               return;\r
-@@ -3600,8 +3601,12 @@ static void ext4_mb_put_pa(struct ext4_a\r
-       pa->pa_deleted = 1;\r
-       spin_unlock(&pa->pa_lock);\r
\r
--      /* -1 is to protect from crossing allocation group */\r
--      ext4_get_group_no_and_offset(sb, pa->pa_pstart - 1, &grp, NULL);\r
-+      grp_blk = pa->pa_pstart;\r
-+      /* If linear, pa_pstart may be in the next group when pa is used up */\r
-+      if (pa->pa_linear)\r
-+              grp_blk--;\r
-+\r
-+      ext4_get_group_no_and_offset(sb, grp_blk, &grp, NULL);\r
\r
-       /*\r
-        * possible race:\r
-@@ -4414,7 +4419,7 @@ static void ext4_mb_add_n_trim(struct ex\r
-                                               pa_inode_list) {\r
-               spin_lock(&tmp_pa->pa_lock);\r
-               if (tmp_pa->pa_deleted) {\r
--                      spin_unlock(&pa->pa_lock);\r
-+                      spin_unlock(&tmp_pa->pa_lock);\r
-                       continue;\r
-               }\r
-               if (!added && pa->pa_free < tmp_pa->pa_free) {\r
-diff -uprN linux-2.6.28.orig/fs/ext4/namei.c linux-2.6.28/fs/ext4/namei.c\r
---- linux-2.6.28.orig/fs/ext4/namei.c  2009-05-02 20:54:43.000000000 +0200\r
-+++ linux-2.6.28/fs/ext4/namei.c       2009-05-23 16:05:41.000000000 +0200\r
-@@ -1056,8 +1056,16 @@ static struct dentry *ext4_lookup(struct\r
-                       return ERR_PTR(-EIO);\r
-               }\r
-               inode = ext4_iget(dir->i_sb, ino);\r
--              if (IS_ERR(inode))\r
--                      return ERR_CAST(inode);\r
-+              if (unlikely(IS_ERR(inode))) {\r
-+                      if (PTR_ERR(inode) == -ESTALE) {\r
-+                              ext4_error(dir->i_sb, __func__,\r
-+                                              "deleted inode referenced: %u",\r
-+                                              ino);\r
-+                              return ERR_PTR(-EIO);\r
-+                      } else {\r
-+                              return ERR_CAST(inode);\r
-+                      }\r
-+              }\r
-       }\r
-       return d_splice_alias(inode, dentry);\r
- }\r
-@@ -2436,7 +2444,8 @@ static int ext4_rename(struct inode *old\r
-               ext4_mark_inode_dirty(handle, new_inode);\r
-               if (!new_inode->i_nlink)\r
-                       ext4_orphan_add(handle, new_inode);\r
--              force_da_alloc = 1;\r
-+              if (!test_opt(new_dir->i_sb, NO_AUTO_DA_ALLOC))\r
-+                      force_da_alloc = 1;\r
-       }\r
-       retval = 0;\r
\r
-diff -uprN linux-2.6.28.orig/fs/ext4/super.c linux-2.6.28/fs/ext4/super.c\r
---- linux-2.6.28.orig/fs/ext4/super.c  2009-05-02 20:54:43.000000000 +0200\r
-+++ linux-2.6.28/fs/ext4/super.c       2009-05-23 16:05:41.000000000 +0200\r
-@@ -679,8 +679,6 @@ static int ext4_show_options(struct seq_\r
-       if (!test_opt(sb, POSIX_ACL) && (def_mount_opts & EXT4_DEFM_ACL))\r
-               seq_puts(seq, ",noacl");\r
- #endif\r
--      if (!test_opt(sb, RESERVATION))\r
--              seq_puts(seq, ",noreservation");\r
-       if (sbi->s_commit_interval) {\r
-               seq_printf(seq, ",commit=%u",\r
-                          (unsigned) (sbi->s_commit_interval / HZ));\r
-@@ -724,6 +722,9 @@ static int ext4_show_options(struct seq_\r
-       if (test_opt(sb, DATA_ERR_ABORT))\r
-               seq_puts(seq, ",data_err=abort");\r
\r
-+      if (test_opt(sb, NO_AUTO_DA_ALLOC))\r
-+              seq_puts(seq, ",auto_da_alloc=0");\r
-+\r
-       ext4_show_quota_options(seq, sb);\r
-       return 0;\r
- }\r
-@@ -849,7 +850,7 @@ enum {\r
-       Opt_resgid, Opt_resuid, Opt_sb, Opt_err_cont, Opt_err_panic, Opt_err_ro,\r
-       Opt_nouid32, Opt_debug, Opt_oldalloc, Opt_orlov,\r
-       Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl,\r
--      Opt_reservation, Opt_noreservation, Opt_noload, Opt_nobh, Opt_bh,\r
-+      Opt_auto_da_alloc, Opt_noload, Opt_nobh, Opt_bh,\r
-       Opt_commit, Opt_journal_update, Opt_journal_inum, Opt_journal_dev,\r
-       Opt_journal_checksum, Opt_journal_async_commit,\r
-       Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback,\r
-@@ -883,8 +884,6 @@ static const match_table_t tokens = {\r
-       {Opt_nouser_xattr, "nouser_xattr"},\r
-       {Opt_acl, "acl"},\r
-       {Opt_noacl, "noacl"},\r
--      {Opt_reservation, "reservation"},\r
--      {Opt_noreservation, "noreservation"},\r
-       {Opt_noload, "noload"},\r
-       {Opt_nobh, "nobh"},\r
-       {Opt_bh, "bh"},\r
-@@ -919,6 +918,7 @@ static const match_table_t tokens = {\r
-       {Opt_delalloc, "delalloc"},\r
-       {Opt_nodelalloc, "nodelalloc"},\r
-       {Opt_inode_readahead_blks, "inode_readahead_blks=%u"},\r
-+      {Opt_auto_da_alloc, "auto_da_alloc=%u"},\r
-       {Opt_err, NULL},\r
- };\r
\r
-@@ -1049,12 +1049,6 @@ static int parse_options(char *options, \r
-                              "not supported\n");\r
-                       break;\r
- #endif\r
--              case Opt_reservation:\r
--                      set_opt(sbi->s_mount_opt, RESERVATION);\r
--                      break;\r
--              case Opt_noreservation:\r
--                      clear_opt(sbi->s_mount_opt, RESERVATION);\r
--                      break;\r
-               case Opt_journal_update:\r
-                       /* @@@ FIXME */\r
-                       /* Eventually we will want to be able to create\r
-@@ -1331,6 +1325,14 @@ set_qf_format:\r
-                               return 0;\r
-                       sbi->s_inode_readahead_blks = option;\r
-                       break;\r
-+              case Opt_auto_da_alloc:\r
-+                      if (match_int(&args[0], &option))\r
-+                              return 0;\r
-+                      if (option)\r
-+                              clear_opt(sbi->s_mount_opt, NO_AUTO_DA_ALLOC);\r
-+                      else\r
-+                              set_opt(sbi->s_mount_opt,NO_AUTO_DA_ALLOC);\r
-+                      break;\r
-               default:\r
-                       printk(KERN_ERR\r
-                              "EXT4-fs: Unrecognized mount option \"%s\" "\r
-@@ -1956,7 +1958,6 @@ static int ext4_fill_super(struct super_\r
-       sbi->s_resuid = le16_to_cpu(es->s_def_resuid);\r
-       sbi->s_resgid = le16_to_cpu(es->s_def_resgid);\r
\r
--      set_opt(sbi->s_mount_opt, RESERVATION);\r
-       set_opt(sbi->s_mount_opt, BARRIER);\r
\r
-       /*\r
-diff -uprN linux-2.6.28.orig/fs/jbd2/revoke.c linux-2.6.28/fs/jbd2/revoke.c\r
---- linux-2.6.28.orig/fs/jbd2/revoke.c 2009-05-02 20:54:43.000000000 +0200\r
-+++ linux-2.6.28/fs/jbd2/revoke.c      2009-05-23 16:05:41.000000000 +0200\r
-@@ -55,6 +55,25 @@\r
-  *                    need do nothing.\r
-  * RevokeValid set, Revoked set:\r
-  *                    buffer has been revoked.\r
-+ *\r
-+ * Locking rules:\r
-+ * We keep two hash tables of revoke records. One hashtable belongs to the\r
-+ * running transaction (is pointed to by journal->j_revoke), the other one\r
-+ * belongs to the committing transaction. Accesses to the second hash table\r
-+ * happen only from the kjournald and no other thread touches this table.  Also\r
-+ * journal_switch_revoke_table() which switches which hashtable belongs to the\r
-+ * running and which to the committing transaction is called only from\r
-+ * kjournald. Therefore we need no locks when accessing the hashtable belonging\r
-+ * to the committing transaction.\r
-+ *\r
-+ * All users operating on the hash table belonging to the running transaction\r
-+ * have a handle to the transaction. Therefore they are safe from kjournald\r
-+ * switching hash tables under them. For operations on the lists of entries in\r
-+ * the hash table j_revoke_lock is used.\r
-+ *\r
-+ * Finally, also replay code uses the hash tables but at this moment noone else\r
-+ * can touch them (filesystem isn't mounted yet) and hence no locking is\r
-+ * needed.\r
-  */\r
\r
- #ifndef __KERNEL__\r
-@@ -401,8 +420,6 @@ int jbd2_journal_revoke(handle_t *handle\r
-  * the second time we would still have a pending revoke to cancel.  So,\r
-  * do not trust the Revoked bit on buffers unless RevokeValid is also\r
-  * set.\r
-- *\r
-- * The caller must have the journal locked.\r
-  */\r
- int jbd2_journal_cancel_revoke(handle_t *handle, struct journal_head *jh)\r
- {\r
-@@ -480,10 +497,7 @@ void jbd2_journal_switch_revoke_table(jo\r
- /*\r
-  * Write revoke records to the journal for all entries in the current\r
-  * revoke hash, deleting the entries as we go.\r
-- *\r
-- * Called with the journal lock held.\r
-  */\r
--\r
- void jbd2_journal_write_revoke_records(journal_t *journal,\r
-                                 transaction_t *transaction)\r
- {\r
-diff -uprN linux-2.6.28.orig/fs/ocfs2/ocfs2_jbd_compat.h linux-2.6.28/fs/ocfs2/ocfs2_jbd_compat.h\r
---- linux-2.6.28.orig/fs/ocfs2/ocfs2_jbd_compat.h      2009-05-02 20:54:43.000000000 +0200\r
-+++ linux-2.6.28/fs/ocfs2/ocfs2_jbd_compat.h   2009-05-23 16:05:41.000000000 +0200\r
-@@ -60,7 +60,8 @@ static inline int jbd2_journal_file_inod\r
-       return 0;\r
- }\r
\r
--static inline int jbd2_journal_begin_ordered_truncate(struct jbd2_inode *inode,\r
-+static inline int jbd2_journal_begin_ordered_truncate(journal_t *journal,\r
-+                                                    struct jbd2_inode *inode,\r
-                                                     loff_t new_size)\r
- {\r
-       return 0;\r
+diff -uprN linux-2.6.28.orig/Documentation/filesystems/ext4.txt linux-2.6.28/Documentation/filesystems/ext4.txt
+--- linux-2.6.28.orig/Documentation/filesystems/ext4.txt       2009-05-02 20:54:43.000000000 +0200
++++ linux-2.6.28/Documentation/filesystems/ext4.txt    2009-05-23 16:05:41.000000000 +0200
+@@ -76,7 +76,7 @@ Note: More extensive information for get
+ * extent format more robust in face of on-disk corruption due to magics,
+ * internal redunancy in tree
+ * improved file allocation (multi-block alloc)
+-* fix 32000 subdirectory limit
++* lift 32000 subdirectory limit imposed by i_links_count[1]
+ * nsec timestamps for mtime, atime, ctime, create time
+ * inode version field on disk (NFSv4, Lustre)
+ * reduced e2fsck time via uninit_bg feature
+@@ -91,6 +91,9 @@ Note: More extensive information for get
+ * efficent new ordered mode in JBD2 and ext4(avoid using buffer head to force
+   the ordering)
++[1] Filesystems with a block size of 1k may see a limit imposed by the
++directory hash tree having a maximum depth of two.
++
+ 2.2 Candidate features for future inclusion
+ * Online defrag (patches available but not well tested)
+diff -uprN linux-2.6.28.orig/fs/ext4/balloc.c linux-2.6.28/fs/ext4/balloc.c
+--- linux-2.6.28.orig/fs/ext4/balloc.c 2009-05-02 20:54:43.000000000 +0200
++++ linux-2.6.28/fs/ext4/balloc.c      2009-05-23 16:05:41.000000000 +0200
+@@ -608,7 +608,9 @@ int ext4_claim_free_blocks(struct ext4_s
+  */
+ int ext4_should_retry_alloc(struct super_block *sb, int *retries)
+ {
+-      if (!ext4_has_free_blocks(EXT4_SB(sb), 1) || (*retries)++ > 3)
++      if (!ext4_has_free_blocks(EXT4_SB(sb), 1) ||
++          (*retries)++ > 3 ||
++          !EXT4_SB(sb)->s_journal)
+               return 0;
+       jbd_debug(1, "%s: retrying operation after ENOSPC\n", sb->s_id);
+diff -uprN linux-2.6.28.orig/fs/ext4/ext4.h linux-2.6.28/fs/ext4/ext4.h
+--- linux-2.6.28.orig/fs/ext4/ext4.h   2009-05-02 20:54:43.000000000 +0200
++++ linux-2.6.28/fs/ext4/ext4.h        2009-05-23 16:05:41.000000000 +0200
+@@ -248,6 +248,30 @@ struct flex_groups {
+ #define EXT4_FL_USER_VISIBLE          0x000BDFFF /* User visible flags */
+ #define EXT4_FL_USER_MODIFIABLE               0x000B80FF /* User modifiable flags */
++/* Flags that should be inherited by new inodes from their parent. */
++#define EXT4_FL_INHERITED (EXT4_SECRM_FL | EXT4_UNRM_FL | EXT4_COMPR_FL |\
++                         EXT4_SYNC_FL | EXT4_IMMUTABLE_FL | EXT4_APPEND_FL |\
++                         EXT4_NODUMP_FL | EXT4_NOATIME_FL |\
++                         EXT4_NOCOMPR_FL | EXT4_JOURNAL_DATA_FL |\
++                         EXT4_NOTAIL_FL | EXT4_DIRSYNC_FL)
++
++/* Flags that are appropriate for regular files (all but dir-specific ones). */
++#define EXT4_REG_FLMASK (~(EXT4_DIRSYNC_FL | EXT4_TOPDIR_FL))
++
++/* Flags that are appropriate for non-directories/regular files. */
++#define EXT4_OTHER_FLMASK (EXT4_NODUMP_FL | EXT4_NOATIME_FL)
++
++/* Mask out flags that are inappropriate for the given type of inode. */
++static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags)
++{
++      if (S_ISDIR(mode))
++              return flags;
++      else if (S_ISREG(mode))
++              return flags & EXT4_REG_FLMASK;
++      else
++              return flags & EXT4_OTHER_FLMASK;
++}
++
+ /*
+  * Inode dynamic state flags
+  */
+@@ -529,7 +556,7 @@ do {                                                                              \
+ #define EXT4_MOUNT_NO_UID32           0x02000  /* Disable 32-bit UIDs */
+ #define EXT4_MOUNT_XATTR_USER         0x04000 /* Extended user attributes */
+ #define EXT4_MOUNT_POSIX_ACL          0x08000 /* POSIX Access Control Lists */
+-#define EXT4_MOUNT_RESERVATION                0x10000 /* Preallocation */
++#define EXT4_MOUNT_NO_AUTO_DA_ALLOC   0x10000 /* No auto delalloc mapping */
+ #define EXT4_MOUNT_BARRIER            0x20000 /* Use block barriers */
+ #define EXT4_MOUNT_NOBH                       0x40000 /* No bufferheads */
+ #define EXT4_MOUNT_QUOTA              0x80000 /* Some quota option set */
+diff -uprN linux-2.6.28.orig/fs/ext4/extents.c linux-2.6.28/fs/ext4/extents.c
+--- linux-2.6.28.orig/fs/ext4/extents.c        2009-05-02 20:54:43.000000000 +0200
++++ linux-2.6.28/fs/ext4/extents.c     2009-05-23 16:05:41.000000000 +0200
+@@ -1120,7 +1120,8 @@ ext4_ext_search_right(struct inode *inod
+       struct ext4_extent_idx *ix;
+       struct ext4_extent *ex;
+       ext4_fsblk_t block;
+-      int depth, ee_len;
++      int depth;      /* Note, NOT eh_depth; depth from top of tree */
++      int ee_len;
+       BUG_ON(path == NULL);
+       depth = path->p_depth;
+@@ -1179,7 +1180,8 @@ ext4_ext_search_right(struct inode *inod
+               if (bh == NULL)
+                       return -EIO;
+               eh = ext_block_hdr(bh);
+-              if (ext4_ext_check_header(inode, eh, depth)) {
++              /* subtract from p_depth to get proper eh_depth */
++              if (ext4_ext_check_header(inode, eh, path->p_depth - depth)) {
+                       put_bh(bh);
+                       return -EIO;
+               }
+@@ -1740,11 +1742,13 @@ ext4_ext_put_in_cache(struct inode *inod
+ {
+       struct ext4_ext_cache *cex;
+       BUG_ON(len == 0);
++      spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
+       cex = &EXT4_I(inode)->i_cached_extent;
+       cex->ec_type = type;
+       cex->ec_block = block;
+       cex->ec_len = len;
+       cex->ec_start = start;
++      spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
+ }
+ /*
+@@ -1801,12 +1805,17 @@ ext4_ext_in_cache(struct inode *inode, e
+                       struct ext4_extent *ex)
+ {
+       struct ext4_ext_cache *cex;
++      int ret = EXT4_EXT_CACHE_NO;
++      /* 
++       * We borrow i_block_reservation_lock to protect i_cached_extent
++       */
++      spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
+       cex = &EXT4_I(inode)->i_cached_extent;
+       /* has cache valid data? */
+       if (cex->ec_type == EXT4_EXT_CACHE_NO)
+-              return EXT4_EXT_CACHE_NO;
++              goto errout;
+       BUG_ON(cex->ec_type != EXT4_EXT_CACHE_GAP &&
+                       cex->ec_type != EXT4_EXT_CACHE_EXTENT);
+@@ -1817,11 +1826,11 @@ ext4_ext_in_cache(struct inode *inode, e
+               ext_debug("%u cached by %u:%u:%llu\n",
+                               block,
+                               cex->ec_block, cex->ec_len, cex->ec_start);
+-              return cex->ec_type;
++              ret = cex->ec_type;
+       }
+-
+-      /* not in cache */
+-      return EXT4_EXT_CACHE_NO;
++errout:
++      spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
++      return ret;
+ }
+ /*
+@@ -2777,6 +2786,8 @@ int ext4_ext_get_blocks(handle_t *handle
+                               if (allocated > max_blocks)
+                                       allocated = max_blocks;
+                               set_buffer_unwritten(bh_result);
++                              bh_result->b_bdev = inode->i_sb->s_bdev;
++                              bh_result->b_blocknr = newblock;
+                               goto out2;
+                       }
+diff -uprN linux-2.6.28.orig/fs/ext4/ialloc.c linux-2.6.28/fs/ext4/ialloc.c
+--- linux-2.6.28.orig/fs/ext4/ialloc.c 2009-05-02 20:54:43.000000000 +0200
++++ linux-2.6.28/fs/ext4/ialloc.c      2009-05-23 16:05:41.000000000 +0200
+@@ -188,7 +188,7 @@ void ext4_free_inode(handle_t *handle, s
+       struct ext4_group_desc *gdp;
+       struct ext4_super_block *es;
+       struct ext4_sb_info *sbi;
+-      int fatal = 0, err;
++      int fatal = 0, err, cleared;
+       ext4_group_t flex_group;
+       if (atomic_read(&inode->i_count) > 1) {
+@@ -243,8 +243,10 @@ void ext4_free_inode(handle_t *handle, s
+               goto error_return;
+       /* Ok, now we can actually update the inode bitmaps.. */
+-      if (!ext4_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
+-                                      bit, bitmap_bh->b_data))
++      spin_lock(sb_bgl_lock(sbi, block_group));
++      cleared = ext4_clear_bit(bit, bitmap_bh->b_data);
++      spin_unlock(sb_bgl_lock(sbi, block_group));
++      if (!cleared)
+               ext4_error(sb, "ext4_free_inode",
+                          "bit already cleared for inode %lu", ino);
+       else {
+@@ -686,6 +688,7 @@ struct inode *ext4_new_inode(handle_t *h
+       struct inode *ret;
+       ext4_group_t i;
+       int free = 0;
++      static int once = 1;
+       ext4_group_t flex_group;
+       /* Cannot create files in a deleted directory */
+@@ -705,10 +708,12 @@ struct inode *ext4_new_inode(handle_t *h
+               ret2 = find_group_flex(sb, dir, &group);
+               if (ret2 == -1) {
+                       ret2 = find_group_other(sb, dir, &group);
+-                      if (ret2 == 0 && printk_ratelimit())
++                      if (ret2 == 0 && once) {
++                              once = 0;
+                               printk(KERN_NOTICE "ext4: find_group_flex "
+                                      "failed, fallback succeeded dir %lu\n",
+                                      dir->i_ino);
++                      }
+               }
+               goto got_group;
+       }
+@@ -862,16 +867,12 @@ got:
+       ei->i_disksize = 0;
+       /*
+-       * Don't inherit extent flag from directory. We set extent flag on
+-       * newly created directory and file only if -o extent mount option is
+-       * specified
++       * Don't inherit extent flag from directory, amongst others. We set
++       * extent flag on newly created directory and file only if -o extent
++       * mount option is specified
+        */
+-      ei->i_flags = EXT4_I(dir)->i_flags & ~(EXT4_INDEX_FL|EXT4_EXTENTS_FL);
+-      if (S_ISLNK(mode))
+-              ei->i_flags &= ~(EXT4_IMMUTABLE_FL|EXT4_APPEND_FL);
+-      /* dirsync only applies to directories */
+-      if (!S_ISDIR(mode))
+-              ei->i_flags &= ~EXT4_DIRSYNC_FL;
++      ei->i_flags =
++              ext4_mask_flags(mode, EXT4_I(dir)->i_flags & EXT4_FL_INHERITED);
+       ei->i_file_acl = 0;
+       ei->i_dtime = 0;
+       ei->i_block_group = group;
+diff -uprN linux-2.6.28.orig/fs/ext4/inode.c linux-2.6.28/fs/ext4/inode.c
+--- linux-2.6.28.orig/fs/ext4/inode.c  2009-05-02 20:54:43.000000000 +0200
++++ linux-2.6.28/fs/ext4/inode.c       2009-05-23 16:05:41.000000000 +0200
+@@ -1052,6 +1059,7 @@ int ext4_get_blocks_wrap(handle_t *handl
+       int retval;
+       clear_buffer_mapped(bh);
++      clear_buffer_unwritten(bh);
+       /*
+        * Try to see if we can get  the block without requesting
+@@ -1082,6 +1090,18 @@ int ext4_get_blocks_wrap(handle_t *handl
+               return retval;
+       /*
++       * When we call get_blocks without the create flag, the
++       * BH_Unwritten flag could have gotten set if the blocks
++       * requested were part of a uninitialized extent.  We need to
++       * clear this flag now that we are committed to convert all or
++       * part of the uninitialized extent to be an initialized
++       * extent.  This is because we need to avoid the combination
++       * of BH_Unwritten and BH_Mapped flags being simultaneously
++       * set on the buffer_head.
++       */
++      clear_buffer_unwritten(bh);
++
++      /*
+        * New blocks allocate and/or writing to uninitialized extent
+        * will possibly result in updating i_data, so we take
+        * the write lock of i_data_sem, and call get_blocks()
+@@ -2180,6 +2200,10 @@ static int ext4_da_get_block_prep(struct
+                                 struct buffer_head *bh_result, int create)
+ {
+       int ret = 0;
++      sector_t invalid_block = ~((sector_t) 0xffff);
++
++      if (invalid_block < ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es))
++              invalid_block = ~0;
+       BUG_ON(create == 0);
+       BUG_ON(bh_result->b_size != inode->i_sb->s_blocksize);
+@@ -2201,11 +2225,18 @@ static int ext4_da_get_block_prep(struct
+                       /* not enough space to reserve */
+                       return ret;
+-              map_bh(bh_result, inode->i_sb, 0);
++              map_bh(bh_result, inode->i_sb, invalid_block);
+               set_buffer_new(bh_result);
+               set_buffer_delay(bh_result);
+       } else if (ret > 0) {
+               bh_result->b_size = (ret << inode->i_blkbits);
++              /*
++               * With sub-block writes into unwritten extents
++               * we also need to mark the buffer as new so that
++               * the unwritten parts of the buffer gets correctly zeroed.
++               */
++              if (buffer_unwritten(bh_result))
++                      set_buffer_new(bh_result);
+               ret = 0;
+       }
+@@ -2493,7 +2524,7 @@ retry:
+               ext4_journal_stop(handle);
+-              if (mpd.retval == -ENOSPC) {
++              if ((mpd.retval == -ENOSPC) && sbi->s_journal) {
+                       /* commit the transaction which would
+                        * free blocks released in the transaction
+                        * and try again
+@@ -4167,11 +4243,9 @@ struct inode *ext4_iget(struct super_blo
+       ei->i_flags = le32_to_cpu(raw_inode->i_flags);
+       inode->i_blocks = ext4_inode_blocks(raw_inode, ei);
+       ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl_lo);
+-      if (EXT4_SB(inode->i_sb)->s_es->s_creator_os !=
+-          cpu_to_le32(EXT4_OS_HURD)) {
++      if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_64BIT))
+               ei->i_file_acl |=
+                       ((__u64)le16_to_cpu(raw_inode->i_file_acl_high)) << 32;
+-      }
+       inode->i_size = ext4_isize(raw_inode);
+       ei->i_disksize = inode->i_size;
+       inode->i_generation = le32_to_cpu(raw_inode->i_generation);
+@@ -4218,6 +4292,18 @@ struct inode *ext4_iget(struct super_blo
+                       (__u64)(le32_to_cpu(raw_inode->i_version_hi)) << 32;
+       }
++      if (ei->i_file_acl &&
++          ((ei->i_file_acl < 
++            (le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block) +
++             EXT4_SB(sb)->s_gdb_count)) ||
++           (ei->i_file_acl >= ext4_blocks_count(EXT4_SB(sb)->s_es)))) {
++              ext4_error(sb, __func__,
++                         "bad extended attribute block %llu in inode #%lu",
++                         ei->i_file_acl, inode->i_ino);
++              ret = -EIO;
++              goto bad_inode;
++      }
++
+       if (S_ISREG(inode->i_mode)) {
+               inode->i_op = &ext4_file_inode_operations;
+               inode->i_fop = &ext4_file_operations;
+@@ -4232,7 +4318,8 @@ struct inode *ext4_iget(struct super_blo
+                       inode->i_op = &ext4_symlink_inode_operations;
+                       ext4_set_aops(inode);
+               }
+-      } else {
++      } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
++            S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
+               inode->i_op = &ext4_special_inode_operations;
+               if (raw_inode->i_block[0])
+                       init_special_inode(inode, inode->i_mode,
+@@ -4240,6 +4327,13 @@ struct inode *ext4_iget(struct super_blo
+               else
+                       init_special_inode(inode, inode->i_mode,
+                          new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));
++      } else {
++              brelse(bh);
++              ret = -EIO;
++              ext4_error(inode->i_sb, __func__, 
++                         "bogus i_mode (%o) for inode=%lu",
++                         inode->i_mode, inode->i_ino);
++              goto bad_inode;
+       }
+       brelse(iloc.bh);
+       ext4_set_inode_flags(inode);
+diff -uprN linux-2.6.28.orig/fs/ext4/ioctl.c linux-2.6.28/fs/ext4/ioctl.c
+--- linux-2.6.28.orig/fs/ext4/ioctl.c  2009-05-02 20:54:43.000000000 +0200
++++ linux-2.6.28/fs/ext4/ioctl.c       2009-05-23 16:05:41.000000000 +0200
+@@ -48,8 +48,7 @@ long ext4_ioctl(struct file *filp, unsig
+               if (err)
+                       return err;
+-              if (!S_ISDIR(inode->i_mode))
+-                      flags &= ~EXT4_DIRSYNC_FL;
++              flags = ext4_mask_flags(inode->i_mode, flags);
+               err = -EPERM;
+               mutex_lock(&inode->i_mutex);
+diff -uprN linux-2.6.28.orig/fs/ext4/mballoc.c linux-2.6.28/fs/ext4/mballoc.c
+--- linux-2.6.28.orig/fs/ext4/mballoc.c        2009-05-02 20:54:43.000000000 +0200
++++ linux-2.6.28/fs/ext4/mballoc.c     2009-05-23 16:05:41.000000000 +0200
+@@ -1448,7 +1448,7 @@ static void ext4_mb_measure_extent(struc
+       struct ext4_free_extent *gex = &ac->ac_g_ex;
+       BUG_ON(ex->fe_len <= 0);
+-      BUG_ON(ex->fe_len >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
++      BUG_ON(ex->fe_len > EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
+       BUG_ON(ex->fe_start >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
+       BUG_ON(ac->ac_status != AC_STATUS_CONTINUE);
+@@ -2692,7 +2692,7 @@ int ext4_mb_init(struct super_block *sb,
+       i = (sb->s_blocksize_bits + 2) * sizeof(unsigned int);
+       sbi->s_mb_maxs = kmalloc(i, GFP_KERNEL);
+       if (sbi->s_mb_maxs == NULL) {
+-              kfree(sbi->s_mb_maxs);
++              kfree(sbi->s_mb_offsets);
+               return -ENOMEM;
+       }
+@@ -3289,7 +3289,7 @@ ext4_mb_normalize_request(struct ext4_al
+       }
+       BUG_ON(start + size <= ac->ac_o_ex.fe_logical &&
+                       start > ac->ac_o_ex.fe_logical);
+-      BUG_ON(size <= 0 || size >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
++      BUG_ON(size <= 0 || size > EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
+       /* now prepare goal request */
+@@ -3586,6 +3586,7 @@ static void ext4_mb_put_pa(struct ext4_a
+                       struct super_block *sb, struct ext4_prealloc_space *pa)
+ {
+       unsigned long grp;
++      ext4_fsblk_t grp_blk;
+       if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0)
+               return;
+@@ -3600,8 +3601,12 @@ static void ext4_mb_put_pa(struct ext4_a
+       pa->pa_deleted = 1;
+       spin_unlock(&pa->pa_lock);
+-      /* -1 is to protect from crossing allocation group */
+-      ext4_get_group_no_and_offset(sb, pa->pa_pstart - 1, &grp, NULL);
++      grp_blk = pa->pa_pstart;
++      /* If linear, pa_pstart may be in the next group when pa is used up */
++      if (pa->pa_linear)
++              grp_blk--;
++
++      ext4_get_group_no_and_offset(sb, grp_blk, &grp, NULL);
+       /*
+        * possible race:
+@@ -4414,7 +4419,7 @@ static void ext4_mb_add_n_trim(struct ex
+                                               pa_inode_list) {
+               spin_lock(&tmp_pa->pa_lock);
+               if (tmp_pa->pa_deleted) {
+-                      spin_unlock(&pa->pa_lock);
++                      spin_unlock(&tmp_pa->pa_lock);
+                       continue;
+               }
+               if (!added && pa->pa_free < tmp_pa->pa_free) {
+diff -uprN linux-2.6.28.orig/fs/ext4/namei.c linux-2.6.28/fs/ext4/namei.c
+--- linux-2.6.28.orig/fs/ext4/namei.c  2009-05-02 20:54:43.000000000 +0200
++++ linux-2.6.28/fs/ext4/namei.c       2009-05-23 16:05:41.000000000 +0200
+@@ -1056,8 +1056,16 @@ static struct dentry *ext4_lookup(struct
+                       return ERR_PTR(-EIO);
+               }
+               inode = ext4_iget(dir->i_sb, ino);
+-              if (IS_ERR(inode))
+-                      return ERR_CAST(inode);
++              if (unlikely(IS_ERR(inode))) {
++                      if (PTR_ERR(inode) == -ESTALE) {
++                              ext4_error(dir->i_sb, __func__,
++                                              "deleted inode referenced: %u",
++                                              ino);
++                              return ERR_PTR(-EIO);
++                      } else {
++                              return ERR_CAST(inode);
++                      }
++              }
+       }
+       return d_splice_alias(inode, dentry);
+ }
+@@ -2436,7 +2444,8 @@ static int ext4_rename(struct inode *old
+               ext4_mark_inode_dirty(handle, new_inode);
+               if (!new_inode->i_nlink)
+                       ext4_orphan_add(handle, new_inode);
+-              force_da_alloc = 1;
++              if (!test_opt(new_dir->i_sb, NO_AUTO_DA_ALLOC))
++                      force_da_alloc = 1;
+       }
+       retval = 0;
+diff -uprN linux-2.6.28.orig/fs/ext4/super.c linux-2.6.28/fs/ext4/super.c
+--- linux-2.6.28.orig/fs/ext4/super.c  2009-05-02 20:54:43.000000000 +0200
++++ linux-2.6.28/fs/ext4/super.c       2009-05-23 16:05:41.000000000 +0200
+@@ -679,8 +679,6 @@ static int ext4_show_options(struct seq_
+       if (!test_opt(sb, POSIX_ACL) && (def_mount_opts & EXT4_DEFM_ACL))
+               seq_puts(seq, ",noacl");
+ #endif
+-      if (!test_opt(sb, RESERVATION))
+-              seq_puts(seq, ",noreservation");
+       if (sbi->s_commit_interval) {
+               seq_printf(seq, ",commit=%u",
+                          (unsigned) (sbi->s_commit_interval / HZ));
+@@ -724,6 +722,9 @@ static int ext4_show_options(struct seq_
+       if (test_opt(sb, DATA_ERR_ABORT))
+               seq_puts(seq, ",data_err=abort");
++      if (test_opt(sb, NO_AUTO_DA_ALLOC))
++              seq_puts(seq, ",auto_da_alloc=0");
++
+       ext4_show_quota_options(seq, sb);
+       return 0;
+ }
+@@ -849,7 +850,7 @@ enum {
+       Opt_resgid, Opt_resuid, Opt_sb, Opt_err_cont, Opt_err_panic, Opt_err_ro,
+       Opt_nouid32, Opt_debug, Opt_oldalloc, Opt_orlov,
+       Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl,
+-      Opt_reservation, Opt_noreservation, Opt_noload, Opt_nobh, Opt_bh,
++      Opt_auto_da_alloc, Opt_noload, Opt_nobh, Opt_bh,
+       Opt_commit, Opt_journal_update, Opt_journal_inum, Opt_journal_dev,
+       Opt_journal_checksum, Opt_journal_async_commit,
+       Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback,
+@@ -883,8 +884,6 @@ static const match_table_t tokens = {
+       {Opt_nouser_xattr, "nouser_xattr"},
+       {Opt_acl, "acl"},
+       {Opt_noacl, "noacl"},
+-      {Opt_reservation, "reservation"},
+-      {Opt_noreservation, "noreservation"},
+       {Opt_noload, "noload"},
+       {Opt_nobh, "nobh"},
+       {Opt_bh, "bh"},
+@@ -919,6 +918,7 @@ static const match_table_t tokens = {
+       {Opt_delalloc, "delalloc"},
+       {Opt_nodelalloc, "nodelalloc"},
+       {Opt_inode_readahead_blks, "inode_readahead_blks=%u"},
++      {Opt_auto_da_alloc, "auto_da_alloc=%u"},
+       {Opt_err, NULL},
+ };
+@@ -1049,12 +1049,6 @@ static int parse_options(char *options, 
+                              "not supported\n");
+                       break;
+ #endif
+-              case Opt_reservation:
+-                      set_opt(sbi->s_mount_opt, RESERVATION);
+-                      break;
+-              case Opt_noreservation:
+-                      clear_opt(sbi->s_mount_opt, RESERVATION);
+-                      break;
+               case Opt_journal_update:
+                       /* @@@ FIXME */
+                       /* Eventually we will want to be able to create
+@@ -1331,6 +1325,14 @@ set_qf_format:
+                               return 0;
+                       sbi->s_inode_readahead_blks = option;
+                       break;
++              case Opt_auto_da_alloc:
++                      if (match_int(&args[0], &option))
++                              return 0;
++                      if (option)
++                              clear_opt(sbi->s_mount_opt, NO_AUTO_DA_ALLOC);
++                      else
++                              set_opt(sbi->s_mount_opt,NO_AUTO_DA_ALLOC);
++                      break;
+               default:
+                       printk(KERN_ERR
+                              "EXT4-fs: Unrecognized mount option \"%s\" "
+@@ -1956,7 +1958,6 @@ static int ext4_fill_super(struct super_
+       sbi->s_resuid = le16_to_cpu(es->s_def_resuid);
+       sbi->s_resgid = le16_to_cpu(es->s_def_resgid);
+-      set_opt(sbi->s_mount_opt, RESERVATION);
+       set_opt(sbi->s_mount_opt, BARRIER);
+       /*
+diff -uprN linux-2.6.28.orig/fs/jbd2/revoke.c linux-2.6.28/fs/jbd2/revoke.c
+--- linux-2.6.28.orig/fs/jbd2/revoke.c 2009-05-02 20:54:43.000000000 +0200
++++ linux-2.6.28/fs/jbd2/revoke.c      2009-05-23 16:05:41.000000000 +0200
+@@ -55,6 +55,25 @@
+  *                    need do nothing.
+  * RevokeValid set, Revoked set:
+  *                    buffer has been revoked.
++ *
++ * Locking rules:
++ * We keep two hash tables of revoke records. One hashtable belongs to the
++ * running transaction (is pointed to by journal->j_revoke), the other one
++ * belongs to the committing transaction. Accesses to the second hash table
++ * happen only from the kjournald and no other thread touches this table.  Also
++ * journal_switch_revoke_table() which switches which hashtable belongs to the
++ * running and which to the committing transaction is called only from
++ * kjournald. Therefore we need no locks when accessing the hashtable belonging
++ * to the committing transaction.
++ *
++ * All users operating on the hash table belonging to the running transaction
++ * have a handle to the transaction. Therefore they are safe from kjournald
++ * switching hash tables under them. For operations on the lists of entries in
++ * the hash table j_revoke_lock is used.
++ *
++ * Finally, also replay code uses the hash tables but at this moment noone else
++ * can touch them (filesystem isn't mounted yet) and hence no locking is
++ * needed.
+  */
+ #ifndef __KERNEL__
+@@ -401,8 +420,6 @@ int jbd2_journal_revoke(handle_t *handle
+  * the second time we would still have a pending revoke to cancel.  So,
+  * do not trust the Revoked bit on buffers unless RevokeValid is also
+  * set.
+- *
+- * The caller must have the journal locked.
+  */
+ int jbd2_journal_cancel_revoke(handle_t *handle, struct journal_head *jh)
+ {
+@@ -480,10 +497,7 @@ void jbd2_journal_switch_revoke_table(jo
+ /*
+  * Write revoke records to the journal for all entries in the current
+  * revoke hash, deleting the entries as we go.
+- *
+- * Called with the journal lock held.
+  */
+-
+ void jbd2_journal_write_revoke_records(journal_t *journal,
+                                 transaction_t *transaction)
+ {
+diff -uprN linux-2.6.28.orig/fs/ocfs2/ocfs2_jbd_compat.h linux-2.6.28/fs/ocfs2/ocfs2_jbd_compat.h
+--- linux-2.6.28.orig/fs/ocfs2/ocfs2_jbd_compat.h      2009-05-02 20:54:43.000000000 +0200
++++ linux-2.6.28/fs/ocfs2/ocfs2_jbd_compat.h   2009-05-23 16:05:41.000000000 +0200
+@@ -60,7 +60,8 @@ static inline int jbd2_journal_file_inod
+       return 0;
+ }
+-static inline int jbd2_journal_begin_ordered_truncate(struct jbd2_inode *inode,
++static inline int jbd2_journal_begin_ordered_truncate(journal_t *journal,
++                                                    struct jbd2_inode *inode,
+                                                     loff_t new_size)
+ {
+       return 0;
index ae15ee3..ab5831f 100755 (executable)
@@ -42,18 +42,14 @@ ifneq (,$(findstring parallel,$(DEB_BUILD_OPTIONS)))
 endif
 
 get-orig-source:
 endif
 
 get-orig-source:
-       wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.gz
+       wget http://repository.maemo.org/pool/maemo5.0/free/k/kernel/kernel_2.6.28.orig.tar.gz -O kernel-power_2.6.28.orig.tar.gz
 
 
-source-copy-stamp:
+source-stamp:
        dh_testdir
        dh_testdir
-       mkdir -p $(BUILDTMP)/$(SOURCE_PACKAGE)
-       $(MAKE) clean
-       tar cf - `echo * | sed -e 's/ debian//g;s/\.deb//g;s/\.gz//g;s/fiasco//g'` 2>/dev/null | ( cd $(BUILDTMP)/$(SOURCE_PACKAGE); umask 000; tar xspf - )
-       cd $(BUILDTMP)/$(SOURCE_PACKAGE) && ( QUILT_PATCHES=$(CURDIR)/debian/patches quilt push -a -q || test $$? = 2 )
-       touch $@
-
-source-stamp: source-copy-stamp
-       cd $(BUILDTMP) && cp -a $(SOURCE_PACKAGE) $(KSRC)
+       mkdir -p $(KSRC)
+       tar cf - `echo * | sed -e 's/ debian//g;s/\.deb//g;s/\.gz//g;s/fiasco//g'` 2>/dev/null | ( cd $(KSRC); umask 000; tar xspf - )
+       cd $(KSRC) && ( QUILT_PATCHES=$(CURDIR)/debian/patches quilt push -a -q || test $$? = 2 )
+       cd $(BUILDTMP) && tar --exclude=".pc" --bzip2 -cf $(SOURCE_PACKAGE)-$(RELEASE).tar.bz2 $(PACKAGE)
        touch $@
 
 configure-stamp: source-stamp
        touch $@
 
 configure-stamp: source-stamp
@@ -68,10 +64,6 @@ modules-stamp: configure-stamp
        $(MAKE) -C $(KSRC) $(NJOBS) $(EXTRAVERSION) modules
        touch $@
 
        $(MAKE) -C $(KSRC) $(NJOBS) $(EXTRAVERSION) modules
        touch $@
 
-kernel-source-stamp: source-copy-stamp
-       cd $(BUILDTMP) && tar --bzip2 -cf $(SOURCE_PACKAGE)-$(RELEASE).tar.bz2 $(SOURCE_PACKAGE)
-       touch $@
-
 headers: kernel-stamp modules-stamp
 
 clean:
 headers: kernel-stamp modules-stamp
 
 clean:
@@ -79,7 +71,7 @@ clean:
        dh_testroot
        rm -rf $(BUILDTMP)
        rm -f debian/files debian/$(FLASHER_PACKAGE).postinst debian/$(MODULES_PACKAGE).postinst debian/$(MODULES_PACKAGE).postrm
        dh_testroot
        rm -rf $(BUILDTMP)
        rm -f debian/files debian/$(FLASHER_PACKAGE).postinst debian/$(MODULES_PACKAGE).postinst debian/$(MODULES_PACKAGE).postrm
-       rm -f source-copy-stamp source-stamp configure-stamp kernel-stamp modules-stamp kernel-source-stamp
+       rm -f source-stamp configure-stamp kernel-stamp modules-stamp
        dh_clean
 
 install-kernel:
        dh_clean
 
 install-kernel:
@@ -170,7 +162,7 @@ install-headers:
        cp -a $(KSRC)/scripts $(CURDIR)/debian/$(HEADERS_PACKAGE)/usr/src/$(KBUILD_PACKAGE)
 #kbuild fixes
        cd $(CURDIR)/debian/$(HEADERS_PACKAGE)/usr/src/$(KBUILD_PACKAGE)/scripts && rm -f $(RM_SCRIPTS) && chmod a-x mkcompile_h
        cp -a $(KSRC)/scripts $(CURDIR)/debian/$(HEADERS_PACKAGE)/usr/src/$(KBUILD_PACKAGE)
 #kbuild fixes
        cd $(CURDIR)/debian/$(HEADERS_PACKAGE)/usr/src/$(KBUILD_PACKAGE)/scripts && rm -f $(RM_SCRIPTS) && chmod a-x mkcompile_h
-       find $(CURDIR)/debian/$(HEADERS_PACKAGE) -name ".gitignore" -delete
+       #find $(CURDIR)/debian/$(HEADERS_PACKAGE) -name ".gitignore" -delete
 
 install-libc-headers: source-stamp
        dh_testdir
 
 install-libc-headers: source-stamp
        dh_testdir
@@ -192,7 +184,7 @@ else
 build-arch:
 endif
 
 build-arch:
 endif
 
-build-indep: kernel-source-stamp
+build-indep: source-stamp
 
 build: build-arch build-indep
 
 
 build: build-arch build-indep