summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mk/modules.mk8
-rw-r--r--mk/tools.mk2
-rw-r--r--package/cpufrequtils/Makefile1
-rw-r--r--package/oprofile/Makefile1
-rw-r--r--target/foxboard/kernel.config15
-rw-r--r--target/foxboard/tools/e100boot/Makefile5
-rw-r--r--target/linux/config/Config.in.debug1
-rw-r--r--target/linux/config/Config.in.misc1
-rw-r--r--target/linux/patches/2.6.33.1/aufs2.patch24455
-rw-r--r--target/linux/patches/2.6.33.1/bsd-compatibility.patch2513
-rw-r--r--target/linux/patches/2.6.33.1/cc-abstract.patch14
-rw-r--r--target/linux/patches/2.6.33.1/cris-initrd.patch14
-rw-r--r--target/linux/patches/2.6.33.1/cygwin-compat.patch14
-rw-r--r--target/linux/patches/2.6.33.1/exmap.patch11
-rw-r--r--target/linux/patches/2.6.33.1/freebsd-compat.patch11
-rw-r--r--target/linux/patches/2.6.33.1/mtd-root.patch62
-rw-r--r--target/linux/patches/2.6.33.1/ocf.patch23653
-rw-r--r--target/linux/patches/2.6.33.1/startup.patch20
-rw-r--r--target/linux/patches/2.6.33.1/swconfig.patch1075
-rw-r--r--target/linux/patches/2.6.33.1/yaffs2.patch15066
-rw-r--r--target/linux/patches/2.6.33.2/aufs2.patch24455
-rw-r--r--target/linux/patches/2.6.33.2/bsd-compatibility.patch2513
-rw-r--r--target/linux/patches/2.6.33.2/cc-abstract.patch14
-rw-r--r--target/linux/patches/2.6.33.2/cris-initrd.patch14
-rw-r--r--target/linux/patches/2.6.33.2/cris-sound.patch12
-rw-r--r--target/linux/patches/2.6.33.2/cygwin-compat.patch14
-rw-r--r--target/linux/patches/2.6.33.2/exmap.patch11
-rw-r--r--target/linux/patches/2.6.33.2/freebsd-compat.patch11
-rw-r--r--target/linux/patches/2.6.33.2/mtd-root.patch62
-rw-r--r--target/linux/patches/2.6.33.2/ocf.patch23653
-rw-r--r--target/linux/patches/2.6.33.2/startup.patch20
-rw-r--r--target/linux/patches/2.6.33.2/swconfig.patch1075
-rw-r--r--target/linux/patches/2.6.33.2/yaffs2.patch15066
-rw-r--r--target/linux/patches/2.6.33.3/aufs2.patch24455
-rw-r--r--target/linux/patches/2.6.33.3/bsd-compatibility.patch2513
-rw-r--r--target/linux/patches/2.6.33.3/cc-abstract.patch14
-rw-r--r--target/linux/patches/2.6.33.3/cris-initrd.patch14
-rw-r--r--target/linux/patches/2.6.33.3/cygwin-compat.patch14
-rw-r--r--target/linux/patches/2.6.33.3/exmap.patch11
-rw-r--r--target/linux/patches/2.6.33.3/freebsd-compat.patch11
-rw-r--r--target/linux/patches/2.6.33.3/mtd-root.patch62
-rw-r--r--target/linux/patches/2.6.33.3/ocf.patch23653
-rw-r--r--target/linux/patches/2.6.33.3/startup.patch20
-rw-r--r--target/linux/patches/2.6.33.3/yaffs2.patch15066
-rw-r--r--target/linux/patches/2.6.33/aufs2.patch24455
-rw-r--r--target/linux/patches/2.6.33/bsd-compatibility.patch2513
-rw-r--r--target/linux/patches/2.6.33/cc-abstract.patch14
-rw-r--r--target/linux/patches/2.6.33/cris-initrd.patch14
-rw-r--r--target/linux/patches/2.6.33/cris-sound.patch12
-rw-r--r--target/linux/patches/2.6.33/cygwin-compat.patch14
-rw-r--r--target/linux/patches/2.6.33/exmap.patch11
-rw-r--r--target/linux/patches/2.6.33/freebsd-compat.patch11
-rw-r--r--target/linux/patches/2.6.33/mtd-root.patch62
-rw-r--r--target/linux/patches/2.6.33/ocf.patch23653
-rw-r--r--target/linux/patches/2.6.33/startup.patch20
-rw-r--r--target/linux/patches/2.6.33/swconfig.patch1075
-rw-r--r--target/linux/patches/2.6.33/yaffs2.patch15066
-rw-r--r--target/linux/patches/2.6.34/cris-sound.patch (renamed from target/linux/patches/2.6.33.1/cris-sound.patch)0
-rw-r--r--target/tools/squashfs/Makefile5
59 files changed, 26 insertions, 266594 deletions
diff --git a/mk/modules.mk b/mk/modules.mk
index 4dba589a2..943225bdb 100644
--- a/mk/modules.mk
+++ b/mk/modules.mk
@@ -903,9 +903,13 @@ $(eval $(call KMOD_template,CRYPTO_FCRYPT,crypto-fcrypt,\
$(MODULES_DIR)/kernel/crypto/fcrypt \
,11))
+ZLIB:=lib/zlib_deflate/zlib_deflate
+ifeq ($(ADK_LINUX_CRIS_FOXBOARD),)
+ZLIB+=lib/zlib_inflate/zlib_inflate
+endif
+
$(eval $(call KMOD_template,CRYPTO_DEFLATE,crypto-deflate,\
- $(MODULES_DIR)/kernel/lib/zlib_deflate/zlib_deflate \
- $(MODULES_DIR)/kernel/lib/zlib_inflate/zlib_inflate \
+ $(foreach mod, $(ZLIB),$(MODULES_DIR)/kernel/$(mod)) \
$(MODULES_DIR)/kernel/crypto/deflate \
,10))
diff --git a/mk/tools.mk b/mk/tools.mk
index b91e478fd..8479dc699 100644
--- a/mk/tools.mk
+++ b/mk/tools.mk
@@ -1,3 +1,5 @@
+prepare: ${WRKDIST}/.prepared
+configure: ${WRKBUILD}/.configure_done
compile:
clean:
rm -rf $(WRKDIR)
diff --git a/package/cpufrequtils/Makefile b/package/cpufrequtils/Makefile
index 3e8af5585..16d1b5ea9 100644
--- a/package/cpufrequtils/Makefile
+++ b/package/cpufrequtils/Makefile
@@ -11,6 +11,7 @@ PKG_DESCR:= utilities for the Linux kernel cpufreq subsystem
PKG_SECTION:= utils
PKG_URL:= http://www.kernel.org/pub/linux/utils/kernel/cpufreq/cpufrequtils.html
PKG_SITES:= http://www.kernel.org/pub/linux/utils/kernel/cpufreq/
+PKG_TARGET_DEPENDS:= !foxboard
include $(TOPDIR)/mk/package.mk
diff --git a/package/oprofile/Makefile b/package/oprofile/Makefile
index c7373642e..108f78db2 100644
--- a/package/oprofile/Makefile
+++ b/package/oprofile/Makefile
@@ -15,6 +15,7 @@ PKG_URL:= http://oprofile.sourceforge.net
PKG_SITES:= ${MASTER_SITE_SOURCEFORGE:=oprofile/}
CFLINE_OPROFILE:= select BUSYBOX_EXPR
+PKG_TARGET_DEPENDS:= !foxboard
include $(TOPDIR)/mk/package.mk
diff --git a/target/foxboard/kernel.config b/target/foxboard/kernel.config
index 3d6f17b3f..baf4cdef1 100644
--- a/target/foxboard/kernel.config
+++ b/target/foxboard/kernel.config
@@ -1,11 +1,13 @@
#
# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.33
-# Mon Mar 22 13:36:55 2010
+# Linux kernel version: 2.6.34
+# Fri Jul 30 12:07:37 2010
#
CONFIG_MMU=y
CONFIG_ZONE_DMA=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_TIME=y
+CONFIG_ARCH_USES_GETTIMEOFFSET=y
CONFIG_GENERIC_IOMAP=y
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
@@ -47,7 +49,6 @@ CONFIG_RCU_FANOUT=32
# CONFIG_TREE_RCU_TRACE is not set
# CONFIG_IKCONFIG is not set
CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_GROUP_SCHED is not set
# CONFIG_CGROUPS is not set
# CONFIG_SYSFS_DEPRECATED_V2 is not set
# CONFIG_RELAY is not set
@@ -231,7 +232,6 @@ CONFIG_NET=y
# Networking options
#
CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
CONFIG_UNIX=y
# CONFIG_NET_KEY is not set
CONFIG_INET=y
@@ -466,6 +466,7 @@ CONFIG_HAVE_IDE=y
#
# SCSI device support
#
+CONFIG_SCSI_MOD=y
# CONFIG_RAID_ATTRS is not set
# CONFIG_SCSI is not set
# CONFIG_SCSI_DMA is not set
@@ -510,6 +511,7 @@ CONFIG_USB_CATC=m
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_RTL8150 is not set
# CONFIG_USB_USBNET is not set
+# CONFIG_USB_IPHETH is not set
# CONFIG_WAN is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
@@ -545,6 +547,7 @@ CONFIG_USB_CATC=m
#
# Non-8250 serial port support
#
+# CONFIG_SERIAL_TIMBERDALE is not set
CONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
# CONFIG_LEGACY_PTYS is not set
@@ -623,6 +626,7 @@ CONFIG_MISC_FILESYSTEMS=y
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_JFFS2_FS is not set
+# CONFIG_LOGFS is not set
# CONFIG_CRAMFS is not set
CONFIG_SQUASHFS=y
# CONFIG_SQUASHFS_EMBEDDED is not set
@@ -658,7 +662,6 @@ CONFIG_USB=y
# CONFIG_USB_DEVICEFS is not set
# CONFIG_USB_DEVICE_CLASS is not set
# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_OTG is not set
# CONFIG_USB_OTG_WHITELIST is not set
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
# CONFIG_USB_MON is not set
@@ -714,7 +717,6 @@ CONFIG_USB=y
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_LEGOTOWER is not set
# CONFIG_USB_LCD is not set
-# CONFIG_USB_BERRY_CHARGE is not set
# CONFIG_USB_LED is not set
# CONFIG_USB_CYPRESS_CY7C63 is not set
# CONFIG_USB_CYTHERM is not set
@@ -726,7 +728,6 @@ CONFIG_USB=y
# CONFIG_USB_IOWARRIOR is not set
# CONFIG_USB_TEST is not set
# CONFIG_USB_ISIGHTFW is not set
-# CONFIG_USB_VST is not set
# CONFIG_USB_GADGET is not set
#
diff --git a/target/foxboard/tools/e100boot/Makefile b/target/foxboard/tools/e100boot/Makefile
index d807f2349..bec2b4302 100644
--- a/target/foxboard/tools/e100boot/Makefile
+++ b/target/foxboard/tools/e100boot/Makefile
@@ -17,8 +17,9 @@ $(WRKBUILD)/.compiled: ${WRKDIST}/.prepared
$(MAKE) -C $(WRKBUILD)
touch $@
-$(WRKBUILD)/.installed: $(WRKBUILD)/.compiled
+$(BIN_DIR)/etrax100boot: $(WRKBUILD)/.compiled
$(INSTALL_BIN) $(WRKBUILD)/sbl/e100boot.stripped $(BIN_DIR)/etrax100boot
- touch $@
+
+install: $(BIN_DIR)/etrax100boot
include $(TOPDIR)/mk/tools.mk
diff --git a/target/linux/config/Config.in.debug b/target/linux/config/Config.in.debug
index eedb9a97c..613609153 100644
--- a/target/linux/config/Config.in.debug
+++ b/target/linux/config/Config.in.debug
@@ -59,6 +59,7 @@ config ADK_KPACKAGE_KMOD_OPROFILE
tristate
prompt "kernel support for oprofile"
select ADK_KERNEL_PROFILING
+ depends on !ADK_LINUX_CRIS_FOXBOARD
default n
help
use oprofile package to make use of the kernel support.
diff --git a/target/linux/config/Config.in.misc b/target/linux/config/Config.in.misc
index 987fe40cc..bb5097351 100644
--- a/target/linux/config/Config.in.misc
+++ b/target/linux/config/Config.in.misc
@@ -31,6 +31,7 @@ config ADK_KPACKAGE_KMOD_SCx200_ACB
prompt "kmod-i2c-geode.................... I2C driver for Geode"
tristate
depends on ADK_KPACKAGE_KMOD_I2C
+ depends on ADK_LINUX_X86_ALIX1C || ADK_LINUX_X86_ALIX2D || ADK_LINUX_X86_ALIX2D13
default n
help
I2C driver for Geode boards.
diff --git a/target/linux/patches/2.6.33.1/aufs2.patch b/target/linux/patches/2.6.33.1/aufs2.patch
deleted file mode 100644
index 6c40cfb81..000000000
--- a/target/linux/patches/2.6.33.1/aufs2.patch
+++ /dev/null
@@ -1,24455 +0,0 @@
-diff -Nur linux-2.6.31.5.orig/Documentation/ABI/testing/debugfs-aufs linux-2.6.31.5/Documentation/ABI/testing/debugfs-aufs
---- linux-2.6.31.5.orig/Documentation/ABI/testing/debugfs-aufs 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.31.5/Documentation/ABI/testing/debugfs-aufs 2009-11-15 22:02:37.000000000 +0100
-@@ -0,0 +1,40 @@
-+What: /debug/aufs/si_<id>/
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05@yahoo.co.jp>
-+Description:
-+ Under /debug/aufs, a directory named si_<id> is created
-+ per aufs mount, where <id> is a unique id generated
-+ internally.
-+
-+What: /debug/aufs/si_<id>/xib
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05@yahoo.co.jp>
-+Description:
-+ It shows the consumed blocks by xib (External Inode Number
-+ Bitmap), its block size and file size.
-+ When the aufs mount option 'noxino' is specified, it
-+ will be empty. About XINO files, see
-+ Documentation/filesystems/aufs/aufs.5 in detail.
-+
-+What: /debug/aufs/si_<id>/xino0, xino1 ... xinoN
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05@yahoo.co.jp>
-+Description:
-+ It shows the consumed blocks by xino (External Inode Number
-+ Translation Table), its link count, block size and file
-+ size.
-+ When the aufs mount option 'noxino' is specified, it
-+ will be empty. About XINO files, see
-+ Documentation/filesystems/aufs/aufs.5 in detail.
-+
-+What: /debug/aufs/si_<id>/xigen
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05@yahoo.co.jp>
-+Description:
-+ It shows the consumed blocks by xigen (External Inode
-+ Generation Table), its block size and file size.
-+ If CONFIG_AUFS_EXPORT is disabled, this entry will not
-+ be created.
-+ When the aufs mount option 'noxino' is specified, it
-+ will be empty. About XINO files, see
-+ Documentation/filesystems/aufs/aufs.5 in detail.
-diff -Nur linux-2.6.31.5.orig/Documentation/ABI/testing/sysfs-aufs linux-2.6.31.5/Documentation/ABI/testing/sysfs-aufs
---- linux-2.6.31.5.orig/Documentation/ABI/testing/sysfs-aufs 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.31.5/Documentation/ABI/testing/sysfs-aufs 2009-11-15 22:02:37.000000000 +0100
-@@ -0,0 +1,25 @@
-+What: /sys/fs/aufs/si_<id>/
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05@yahoo.co.jp>
-+Description:
-+ Under /sys/fs/aufs, a directory named si_<id> is created
-+ per aufs mount, where <id> is a unique id generated
-+ internally.
-+
-+What: /sys/fs/aufs/si_<id>/br0, br1 ... brN
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05@yahoo.co.jp>
-+Description:
-+ It shows the abolute path of a member directory (which
-+ is called branch) in aufs, and its permission.
-+
-+What: /sys/fs/aufs/si_<id>/xi_path
-+Date: March 2009
-+Contact: J. R. Okajima <hooanon05@yahoo.co.jp>
-+Description:
-+ It shows the abolute path of XINO (External Inode Number
-+ Bitmap, Translation Table and Generation Table) file
-+ even if it is the default path.
-+ When the aufs mount option 'noxino' is specified, it
-+ will be empty. About XINO files, see
-+ Documentation/filesystems/aufs/aufs.5 in detail.
-diff -Nur linux-2.6.31.5.orig/fs/aufs/aufs.h linux-2.6.31.5/fs/aufs/aufs.h
---- linux-2.6.31.5.orig/fs/aufs/aufs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.31.5/fs/aufs/aufs.h 2009-11-15 22:02:37.000000000 +0100
-@@ -0,0 +1,51 @@
-+/*
-+ * Copyright (C) 2005-2009 Junjiro R. Okajima
-+ *
-+ * This program, aufs is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+/*
-+ * all header files
-+ */
-+
-+#ifndef __AUFS_H__
-+#define __AUFS_H__
-+
-+#ifdef __KERNEL__
-+
-+#include "debug.h"
-+
-+#include "branch.h"
-+#include "cpup.h"
-+#include "dcsub.h"
-+#include "dbgaufs.h"
-+#include "dentry.h"
-+#include "dir.h"
-+#include "file.h"
-+#include "fstype.h"
-+#include "inode.h"
-+#include "loop.h"
-+#include "module.h"
-+#include "opts.h"
-+#include "rwsem.h"
-+#include "spl.h"
-+#include "super.h"
-+#include "sysaufs.h"
-+#include "vfsub.h"
-+#include "whout.h"
-+#include "wkq.h"
-+
-+#endif /* __KERNEL__ */
-+#endif /* __AUFS_H__ */
-diff -Nur linux-2.6.31.5.orig/fs/aufs/branch.c linux-2.6.31.5/fs/aufs/branch.c
---- linux-2.6.31.5.orig/fs/aufs/branch.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.31.5/fs/aufs/branch.c 2009-11-15 22:02:37.000000000 +0100
-@@ -0,0 +1,974 @@
-+/*
-+ * Copyright (C) 2005-2009 Junjiro R. Okajima
-+ *
-+ * This program, aufs is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+/*
-+ * branch management
-+ */
-+
-+#include <linux/file.h>
-+#include "aufs.h"
-+
-+/*
-+ * free a single branch
-+ */
-+static void au_br_do_free(struct au_branch *br)
-+{
-+ int i;
-+ struct au_wbr *wbr;
-+
-+ if (br->br_xino.xi_file)
-+ fput(br->br_xino.xi_file);
-+ mutex_destroy(&br->br_xino.xi_nondir_mtx);
-+
-+ AuDebugOn(atomic_read(&br->br_count));
-+
-+ wbr = br->br_wbr;
-+ if (wbr) {
-+ for (i = 0; i < AuBrWh_Last; i++)
-+ dput(wbr->wbr_wh[i]);
-+ AuDebugOn(atomic_read(&wbr->wbr_wh_running));
-+ AuRwDestroy(&wbr->wbr_wh_rwsem);
-+ }
-+
-+ /* some filesystems acquire extra lock */
-+ lockdep_off();
-+ mntput(br->br_mnt);
-+ lockdep_on();
-+
-+ kfree(wbr);
-+ kfree(br);
-+}
-+
-+/*
-+ * frees all branches
-+ */
-+void au_br_free(struct au_sbinfo *sbinfo)
-+{
-+ aufs_bindex_t bmax;
-+ struct au_branch **br;
-+
-+ AuRwMustWriteLock(&sbinfo->si_rwsem);
-+
-+ bmax = sbinfo->si_bend + 1;
-+ br = sbinfo->si_branch;
-+ while (bmax--)
-+ au_br_do_free(*br++);
-+}
-+
-+/*
-+ * find the index of a branch which is specified by @br_id.
-+ */
-+int au_br_index(struct super_block *sb, aufs_bindex_t br_id)
-+{
-+ aufs_bindex_t bindex, bend;
-+
-+ bend = au_sbend(sb);
-+ for (bindex = 0; bindex <= bend; bindex++)
-+ if (au_sbr_id(sb, bindex) == br_id)
-+ return bindex;
-+ return -1;
-+}
-+
-+/* ---------------------------------------------------------------------- */
-+
-+/*
-+ * add a branch
-+ */
-+
-+static int test_overlap(struct super_block *sb, struct dentry *h_d1,
-+ struct dentry *h_d2)
-+{
-+ if (unlikely(h_d1 == h_d2))
-+ return 1;
-+ return !!au_test_subdir(h_d1, h_d2)
-+ || !!au_test_subdir(h_d2, h_d1)
-+ || au_test_loopback_overlap(sb, h_d1, h_d2)
-+ || au_test_loopback_overlap(sb, h_d2, h_d1);
-+}
-+
-+/*
-+ * returns a newly allocated branch. @new_nbranch is a number of branches
-+ * after adding a branch.
-+ */
-+static struct au_branch *au_br_alloc(struct super_block *sb, int new_nbranch,
-+ int perm)
-+{
-+ struct au_branch *add_branch;
-+ struct dentry *root;
-+
-+ root = sb->s_root;
-+ add_branch = kmalloc(sizeof(*add_branch), GFP_NOFS);
-+ if (unlikely(!add_branch))
-+ goto out;
-+
-+ add_branch->br_wbr = NULL;
-+ if (au_br_writable(perm)) {
-+ /* may be freed separately at changing the branch permission */
-+ add_branch->br_wbr = kmalloc(sizeof(*add_branch->br_wbr),
-+ GFP_NOFS);
-+ if (unlikely(!add_branch->br_wbr))
-+ goto out_br;
-+ }
-+
-+ if (unlikely(au_sbr_realloc(au_sbi(sb), new_nbranch)
-+ || au_di_realloc(au_di(root), new_nbranch)
-+ || au_ii_realloc(au_ii(root->d_inode), new_nbranch)))
-+ goto out_wbr;
-+ return add_branch; /* success */
-+
-+ out_wbr:
-+ kfree(add_branch->br_wbr);
-+ out_br:
-+ kfree(add_branch);
-+ out:
-+ return ERR_PTR(-ENOMEM);
-+}
-+
-+/*
-+ * test if the branch permission is legal or not.
-+ */
-+static int test_br(struct inode *inode, int brperm, char *path)
-+{
-+ int err;
-+
-+ err = 0;
-+ if (unlikely(au_br_writable(brperm) && IS_RDONLY(inode))) {
-+ AuErr("write permission for readonly mount or inode, %s\n",
-+ path);
-+ err = -EINVAL;
-+ }
-+
-+ return err;
-+}
-+
-+/*
-+ * returns:
-+ * 0: success, the caller will add it
-+ * plus: success, it is already unified, the caller should ignore it
-+ * minus: error
-+ */
-+static int test_add(struct super_block *sb, struct au_opt_add *add, int remount)
-+{
-+ int err;
-+ aufs_bindex_t bend, bindex;
-+ struct dentry *root;
-+ struct inode *inode, *h_inode;
-+
-+ root = sb->s_root;
-+ bend = au_sbend(sb);
-+ if (unlikely(bend >= 0
-+ && au_find_dbindex(root, add->path.dentry) >= 0)) {
-+ err = 1;
-+ if (!remount) {
-+ err = -EINVAL;
-+ AuErr("%s duplicated\n", add->pathname);
-+ }
-+ goto out;
-+ }
-+
-+ err = -ENOSPC; /* -E2BIG; */
-+ if (unlikely(AUFS_BRANCH_MAX <= add->bindex
-+ || AUFS_BRANCH_MAX - 1 <= bend)) {
-+ AuErr("number of branches exceeded %s\n", add->pathname);
-+ goto out;
-+ }
-+
-+ err = -EDOM;
-+ if (unlikely(add->bindex < 0 || bend + 1 < add->bindex)) {
-+ AuErr("bad index %d\n", add->bindex);
-+ goto out;
-+ }
-+
-+ inode = add->path.dentry->d_inode;
-+ err = -ENOENT;
-+ if (unlikely(!inode->i_nlink)) {
-+ AuErr("no existence %s\n", add->pathname);
-+ goto out;
-+ }
-+
-+ err = -EINVAL;
-+ if (unlikely(inode->i_sb == sb)) {
-+ AuErr("%s must be outside\n", add->pathname);
-+ goto out;
-+ }
-+
-+ if (unlikely(au_test_fs_unsuppoted(inode->i_sb))) {
-+ AuErr("unsupported filesystem, %s (%s)\n",
-+ add->pathname, au_sbtype(inode->i_sb));
-+ goto out;
-+ }
-+
-+ err = test_br(add->path.dentry->d_inode, add->perm, add->pathname);
-+ if (unlikely(err))
-+ goto out;
-+
-+ if (bend < 0)
-+ return 0; /* success */
-+
-+ err = -EINVAL;
-+ for (bindex = 0; bindex <= bend; bindex++)
-+ if (unlikely(test_overlap(sb, add->path.dentry,
-+ au_h_dptr(root, bindex)))) {
-+ AuErr("%s is overlapped\n", add->pathname);
-+ goto out;
-+ }
-+
-+ err = 0;
-+ if (au_opt_test(au_mntflags(sb), WARN_PERM)) {
-+ h_inode = au_h_dptr(root, 0)->d_inode;
-+ if ((h_inode->i_mode & S_IALLUGO) != (inode->i_mode & S_IALLUGO)
-+ || h_inode->i_uid != inode->i_uid
-+ || h_inode->i_gid != inode->i_gid)
-+ AuWarn("uid/gid/perm %s %u/%u/0%o, %u/%u/0%o\n",
-+ add->pathname,
-+ inode->i_uid, inode->i_gid,
-+ (inode->i_mode & S_IALLUGO),
-+ h_inode->i_uid, h_inode->i_gid,
-+ (h_inode->i_mode & S_IALLUGO));
-+ }
-+
-+ out:
-+ return err;
-+}
-+
-+/*
-+ * initialize or clean the whiteouts for an adding branch
-+ */
-+static int au_br_init_wh(struct super_block *sb, struct au_branch *br,
-+ int new_perm, struct dentry *h_root)
-+{
-+ int err, old_perm;
-+ aufs_bindex_t bindex;
-+ struct mutex *h_mtx;
-+ struct au_wbr *wbr;
-+ struct au_hinode *hdir;
-+
-+ wbr = br->br_wbr;
-+ old_perm = br->br_perm;
-+ br->br_perm = new_perm;
-+ hdir = NULL;
-+ h_mtx = NULL;
-+ bindex = au_br_index(sb, br->br_id);
-+ if (0 <= bindex) {
-+ hdir = au_hi(sb->s_root->d_inode, bindex);
-+ au_hin_imtx_lock_nested(hdir, AuLsc_I_PARENT);
-+ } else {
-+ h_mtx = &h_root->d_inode->i_mutex;
-+ mutex_lock_nested(h_mtx, AuLsc_I_PARENT);
-+ }
-+ if (!wbr)
-+ err = au_wh_init(h_root, br, sb);
-+ else {
-+ wbr_wh_write_lock(wbr);
-+ err = au_wh_init(h_root, br, sb);
-+ wbr_wh_write_unlock(wbr);
-+ }
-+ if (hdir)
-+ au_hin_imtx_unlock(hdir);
-+ else
-+ mutex_unlock(h_mtx);
-+ br->br_perm = old_perm;
-+
-+ if (!err && wbr && !au_br_writable(new_perm)) {
-+ kfree(wbr);
-+ br->br_wbr = NULL;
-+ }
-+
-+ return err;
-+}
-+
-+static int au_wbr_init(struct au_branch *br, struct super_block *sb,
-+ int perm, struct path *path)
-+{
-+ int err;
-+ struct au_wbr *wbr;
-+
-+ wbr = br->br_wbr;