summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--target/linux/config/Config.in.fs15
-rw-r--r--target/linux/patches/3.14.4/yaffs2.patch20438
2 files changed, 20443 insertions, 10 deletions
diff --git a/target/linux/config/Config.in.fs b/target/linux/config/Config.in.fs
index c8eace4ad..446dee170 100644
--- a/target/linux/config/Config.in.fs
+++ b/target/linux/config/Config.in.fs
@@ -20,13 +20,6 @@ config ADK_KERNEL_YAFFS_YAFFS2
config ADK_KERNEL_YAFFS_AUTO_YAFFS2
boolean
-config ADK_KERNEL_YAFFS_CHECKPOINT_RESERVED_BLOCKS
- int
- default 0
-
-config ADK_KERNEL_YAFFS_SHORT_NAMES_IN_RAM
- boolean
-
config ADK_KERNEL_DNOTIFY
boolean
@@ -55,7 +48,6 @@ config ADK_KERNEL_JFFS2_ZLIB
menu "Filesystems"
-
config ADK_KERNEL_EXT2_FS
prompt "EXT2 filesystem support"
tristate
@@ -246,11 +238,14 @@ config ADK_KERNEL_SQUASHFS
config ADK_KERNEL_YAFFS_FS
prompt "YAFFS2 filesystem"
+ tristate
+ select ADK_KERNEL_MISC_FILESYSTEMS
+ select ADK_KERNEL_MTD
+ select ADK_KERNEL_MTD_BLOCK
select ADK_KERNEL_YAFFS_YAFFS1
select ADK_KERNEL_YAFFS_YAFFS2
select ADK_KERNEL_YAFFS_AUTO_YAFFS2
- select ADK_KERNEL_YAFFS_SHORT_NAMES_IN_RAM
- tristate
+ depends on ADK_KERNEL_VERSION_3_14_4
help
YAFFS2 filesystem for NAND devices
diff --git a/target/linux/patches/3.14.4/yaffs2.patch b/target/linux/patches/3.14.4/yaffs2.patch
new file mode 100644
index 000000000..190f395e9
--- /dev/null
+++ b/target/linux/patches/3.14.4/yaffs2.patch
@@ -0,0 +1,20438 @@
+diff -Nur linux-3.14.4.orig/fs/Kconfig linux-3.14.4/fs/Kconfig
+--- linux-3.14.4.orig/fs/Kconfig 2014-05-13 13:33:14.000000000 +0200
++++ linux-3.14.4/fs/Kconfig 2014-05-14 12:41:23.844791998 +0200
+@@ -189,6 +189,7 @@
+ source "fs/befs/Kconfig"
+ source "fs/bfs/Kconfig"
+ source "fs/efs/Kconfig"
++source "fs/yaffs2/Kconfig"
+ source "fs/jffs2/Kconfig"
+ # UBIFS File system configuration
+ source "fs/ubifs/Kconfig"
+diff -Nur linux-3.14.4.orig/fs/Kconfig.orig linux-3.14.4/fs/Kconfig.orig
+--- linux-3.14.4.orig/fs/Kconfig.orig 1970-01-01 01:00:00.000000000 +0100
++++ linux-3.14.4/fs/Kconfig.orig 2014-05-13 13:33:14.000000000 +0200
+@@ -0,0 +1,267 @@
++#
++# File system configuration
++#
++
++menu "File systems"
++
++# Use unaligned word dcache accesses
++config DCACHE_WORD_ACCESS
++ bool
++
++if BLOCK
++
++source "fs/ext2/Kconfig"
++source "fs/ext3/Kconfig"
++source "fs/ext4/Kconfig"
++
++config FS_XIP
++# execute in place
++ bool
++ depends on EXT2_FS_XIP
++ default y
++
++source "fs/jbd/Kconfig"
++source "fs/jbd2/Kconfig"
++
++config FS_MBCACHE
++# Meta block cache for Extended Attributes (ext2/ext3/ext4)
++ tristate
++ default y if EXT2_FS=y && EXT2_FS_XATTR
++ default y if EXT3_FS=y && EXT3_FS_XATTR
++ default y if EXT4_FS=y
++ default m if EXT2_FS_XATTR || EXT3_FS_XATTR || EXT4_FS
++
++source "fs/reiserfs/Kconfig"
++source "fs/jfs/Kconfig"
++
++source "fs/xfs/Kconfig"
++source "fs/gfs2/Kconfig"
++source "fs/ocfs2/Kconfig"
++source "fs/btrfs/Kconfig"
++source "fs/nilfs2/Kconfig"
++
++endif # BLOCK
++
++# Posix ACL utility routines
++#
++# Note: Posix ACLs can be implemented without these helpers. Never use
++# this symbol for ifdefs in core code.
++#
++config FS_POSIX_ACL
++ def_bool n
++
++config EXPORTFS
++ tristate
++
++config FILE_LOCKING
++ bool "Enable POSIX file locking API" if EXPERT
++ default y
++ help
++ This option enables standard file locking support, required
++ for filesystems like NFS and for the flock() system
++ call. Disabling this option saves about 11k.
++
++source "fs/notify/Kconfig"
++
++source "fs/quota/Kconfig"
++
++source "fs/autofs4/Kconfig"
++source "fs/fuse/Kconfig"
++
++menu "Caches"
++
++source "fs/fscache/Kconfig"
++source "fs/cachefiles/Kconfig"
++
++endmenu
++
++if BLOCK
++menu "CD-ROM/DVD Filesystems"
++
++source "fs/isofs/Kconfig"
++source "fs/udf/Kconfig"
++
++endmenu
++endif # BLOCK
++
++if BLOCK
++menu "DOS/FAT/NT Filesystems"
++
++source "fs/fat/Kconfig"
++source "fs/ntfs/Kconfig"
++
++endmenu
++endif # BLOCK
++
++menu "Pseudo filesystems"
++
++source "fs/proc/Kconfig"
++source "fs/sysfs/Kconfig"
++
++config TMPFS
++ bool "Tmpfs virtual memory file system support (former shm fs)"
++ depends on SHMEM
++ help
++ Tmpfs is a file system which keeps all files in virtual memory.
++
++ Everything in tmpfs is temporary in the sense that no files will be
++ created on your hard drive. The files live in memory and swap
++ space. If you unmount a tmpfs instance, everything stored therein is
++ lost.
++
++ See <file:Documentation/filesystems/tmpfs.txt> for details.
++
++config TMPFS_POSIX_ACL
++ bool "Tmpfs POSIX Access Control Lists"
++ depends on TMPFS
++ select TMPFS_XATTR
++ select FS_POSIX_ACL
++ help
++ POSIX Access Control Lists (ACLs) support additional access rights
++ for users and groups beyond the standard owner/group/world scheme,
++ and this option selects support for ACLs specifically for tmpfs
++ filesystems.
++
++ If you've selected TMPFS, it's possible that you'll also need
++ this option as there are a number of Linux distros that require
++ POSIX ACL support under /dev for certain features to work properly.
++ For example, some distros need this feature for ALSA-related /dev
++ files for sound to work properly. In short, if you're not sure,
++ say Y.
++
++ To learn more about Access Control Lists, visit the POSIX ACLs for
++ Linux website <http://acl.bestbits.at/>.
++
++config TMPFS_XATTR
++ bool "Tmpfs extended attributes"
++ depends on TMPFS
++ default n
++ help
++ Extended attributes are name:value pairs associated with inodes by
++ the kernel or by users (see the attr(5) manual page, or visit
++ <http://acl.bestbits.at/> for details).
++
++ Currently this enables support for the trusted.* and
++ security.* namespaces.
++
++ You need this for POSIX ACL support on tmpfs.
++
++ If unsure, say N.
++
++config HUGETLBFS
++ bool "HugeTLB file system support"
++ depends on X86 || IA64 || SPARC64 || (S390 && 64BIT) || \
++ SYS_SUPPORTS_HUGETLBFS || BROKEN
++ help
++ hugetlbfs is a filesystem backing for HugeTLB pages, based on
++ ramfs. For architectures that support it, say Y here and read
++ <file:Documentation/vm/hugetlbpage.txt> for details.
++
++ If unsure, say N.
++
++config HUGETLB_PAGE
++ def_bool HUGETLBFS
++
++source "fs/configfs/Kconfig"
++
++endmenu
++
++menuconfig MISC_FILESYSTEMS
++ bool "Miscellaneous filesystems"
++ default y
++ ---help---
++ Say Y here to get to see options for various miscellaneous
++ filesystems, such as filesystems that came from other
++ operating systems.
++
++ This option alone does not add any kernel code.
++
++ If you say N, all options in this submenu will be skipped and
++ disabled; if unsure, say Y here.
++
++if MISC_FILESYSTEMS
++
++source "fs/adfs/Kconfig"
++source "fs/affs/Kconfig"
++source "fs/ecryptfs/Kconfig"
++source "fs/hfs/Kconfig"
++source "fs/hfsplus/Kconfig"
++source "fs/befs/Kconfig"
++source "fs/bfs/Kconfig"
++source "fs/efs/Kconfig"
++source "fs/jffs2/Kconfig"
++# UBIFS File system configuration
++source "fs/ubifs/Kconfig"
++source "fs/logfs/Kconfig"
++source "fs/cramfs/Kconfig"
++source "fs/squashfs/Kconfig"
++source "fs/freevxfs/Kconfig"
++source "fs/minix/Kconfig"
++source "fs/omfs/Kconfig"
++source "fs/hpfs/Kconfig"
++source "fs/qnx4/Kconfig"
++source "fs/qnx6/Kconfig"
++source "fs/romfs/Kconfig"
++source "fs/pstore/Kconfig"
++source "fs/sysv/Kconfig"
++source "fs/ufs/Kconfig"
++source "fs/exofs/Kconfig"
++source "fs/f2fs/Kconfig"
++source "fs/efivarfs/Kconfig"
++
++endif # MISC_FILESYSTEMS
++
++source "fs/exofs/Kconfig.ore"
++
++menuconfig NETWORK_FILESYSTEMS
++ bool "Network File Systems"
++ default y
++ depends on NET
++ ---help---
++ Say Y here to get to see options for network filesystems and
++ filesystem-related networking code, such as NFS daemon and
++ RPCSEC security modules.
++
++ This option alone does not add any kernel code.
++
++ If you say N, all options in this submenu will be skipped and
++ disabled; if unsure, say Y here.
++
++if NETWORK_FILESYSTEMS
++
++source "fs/nfs/Kconfig"
++source "fs/nfsd/Kconfig"
++
++config LOCKD
++ tristate
++ depends on FILE_LOCKING
++
++config LOCKD_V4
++ bool
++ depends on NFSD_V3 || NFS_V3
++ depends on FILE_LOCKING
++ default y
++
++config NFS_ACL_SUPPORT
++ tristate
++ select FS_POSIX_ACL
++
++config NFS_COMMON
++ bool
++ depends on NFSD || NFS_FS
++ default y
++
++source "net/sunrpc/Kconfig"
++source "fs/ceph/Kconfig"
++source "fs/cifs/Kconfig"
++source "fs/ncpfs/Kconfig"
++source "fs/coda/Kconfig"
++source "fs/afs/Kconfig"
++source "fs/9p/Kconfig"
++
++endif # NETWORK_FILESYSTEMS
++
++source "fs/nls/Kconfig"
++source "fs/dlm/Kconfig"
++
++endmenu
+diff -Nur linux-3.14.4.orig/fs/Makefile linux-3.14.4/fs/Makefile
+--- linux-3.14.4.orig/fs/Makefile 2014-05-13 13:33:14.000000000 +0200
++++ linux-3.14.4/fs/Makefile 2014-05-14 12:41:23.868792075 +0200
+@@ -125,3 +125,4 @@
+ obj-$(CONFIG_CEPH_FS) += ceph/
+ obj-$(CONFIG_PSTORE) += pstore/
+ obj-$(CONFIG_EFIVAR_FS) += efivarfs/
++obj-$(CONFIG_YAFFS_FS) += yaffs2/
+diff -Nur linux-3.14.4.orig/fs/Makefile.orig linux-3.14.4/fs/Makefile.orig
+--- linux-3.14.4.orig/fs/Makefile.orig 1970-01-01 01:00:00.000000000 +0100
++++ linux-3.14.4/fs/Makefile.orig 2014-05-13 13:33:14.000000000 +0200
+@@ -0,0 +1,127 @@
++#
++# Makefile for the Linux filesystems.
++#
++# 14 Sep 2000, Christoph Hellwig <hch@infradead.org>
++# Rewritten to use lists instead of if-statements.
++#
++
++obj-y := open.o read_write.o file_table.o super.o \
++ char_dev.o stat.o exec.o pipe.o namei.o fcntl.o \
++ ioctl.o readdir.o select.o dcache.o inode.o \
++ attr.o bad_inode.o file.o filesystems.o namespace.o \
++ seq_file.o xattr.o libfs.o fs-writeback.o \
++ pnode.o splice.o sync.o utimes.o \
++ stack.o fs_struct.o statfs.o
++
++ifeq ($(CONFIG_BLOCK),y)
++obj-y += buffer.o bio.o block_dev.o direct-io.o mpage.o ioprio.o
++else
++obj-y += no-block.o
++endif
++
++obj-$(CONFIG_PROC_FS) += proc_namespace.o
++
++obj-$(CONFIG_BLK_DEV_INTEGRITY) += bio-integrity.o
++obj-y += notify/
++obj-$(CONFIG_EPOLL) += eventpoll.o
++obj-$(CONFIG_ANON_INODES) += anon_inodes.o
++obj-$(CONFIG_SIGNALFD) += signalfd.o
++obj-$(CONFIG_TIMERFD) += timerfd.o
++obj-$(CONFIG_EVENTFD) += eventfd.o
++obj-$(CONFIG_AIO) += aio.o
++obj-$(CONFIG_FILE_LOCKING) += locks.o
++obj-$(CONFIG_COMPAT) += compat.o compat_ioctl.o
++obj-$(CONFIG_BINFMT_AOUT) += binfmt_aout.o
++obj-$(CONFIG_BINFMT_EM86) += binfmt_em86.o
++obj-$(CONFIG_BINFMT_MISC) += binfmt_misc.o
++obj-$(CONFIG_BINFMT_SCRIPT) += binfmt_script.o
++obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o
++obj-$(CONFIG_COMPAT_BINFMT_ELF) += compat_binfmt_elf.o
++obj-$(CONFIG_BINFMT_ELF_FDPIC) += binfmt_elf_fdpic.o
++obj-$(CONFIG_BINFMT_SOM) += binfmt_som.o
++obj-$(CONFIG_BINFMT_FLAT) += binfmt_flat.o
++
++obj-$(CONFIG_FS_MBCACHE) += mbcache.o
++obj-$(CONFIG_FS_POSIX_ACL) += posix_acl.o
++obj-$(CONFIG_NFS_COMMON) += nfs_common/
++obj-$(CONFIG_COREDUMP) += coredump.o
++obj-$(CONFIG_SYSCTL) += drop_caches.o
++
++obj-$(CONFIG_FHANDLE) += fhandle.o
++
++obj-y += quota/
++
++obj-$(CONFIG_PROC_FS) += proc/
++obj-$(CONFIG_SYSFS) += sysfs/ kernfs/
++obj-$(CONFIG_CONFIGFS_FS) += configfs/
++obj-y += devpts/
++
++obj-$(CONFIG_PROFILING) += dcookies.o
++obj-$(CONFIG_DLM) += dlm/
++
++# Do not add any filesystems before this line
++obj-$(CONFIG_FSCACHE) += fscache/
++obj-$(CONFIG_REISERFS_FS) += reiserfs/
++obj-$(CONFIG_EXT3_FS) += ext3/ # Before ext2 so root fs can be ext3
++obj-$(CONFIG_EXT2_FS) += ext2/
++# We place ext4 after ext2 so plain ext2 root fs's are mounted using ext2
++# unless explicitly requested by rootfstype
++obj-$(CONFIG_EXT4_FS) += ext4/
++obj-$(CONFIG_JBD) += jbd/
++obj-$(CONFIG_JBD2) += jbd2/
++obj-$(CONFIG_CRAMFS) += cramfs/
++obj-$(CONFIG_SQUASHFS) += squashfs/
++obj-y += ramfs/
++obj-$(CONFIG_HUGETLBFS) += hugetlbfs/
++obj-$(CONFIG_CODA_FS) += coda/
++obj-$(CONFIG_MINIX_FS) += minix/
++obj-$(CONFIG_FAT_FS) += fat/
++obj-$(CONFIG_BFS_FS) += bfs/
++obj-$(CONFIG_ISO9660_FS) += isofs/
++obj-$(CONFIG_HFSPLUS_FS) += hfsplus/ # Before hfs to find wrapped HFS+
++obj-$(CONFIG_HFS_FS) += hfs/
++obj-$(CONFIG_ECRYPT_FS) += ecryptfs/
++obj-$(CONFIG_VXFS_FS) += freevxfs/
++obj-$(CONFIG_NFS_FS) += nfs/
++obj-$(CONFIG_EXPORTFS) += exportfs/
++obj-$(CONFIG_NFSD) += nfsd/
++obj-$(CONFIG_LOCKD) += lockd/
++obj-$(CONFIG_NLS) += nls/
++obj-$(CONFIG_SYSV_FS) += sysv/
++obj-$(CONFIG_CIFS) += cifs/
++obj-$(CONFIG_NCP_FS) += ncpfs/
++obj-$(CONFIG_HPFS_FS) += hpfs/
++obj-$(CONFIG_NTFS_FS) += ntfs/
++obj-$(CONFIG_UFS_FS) += ufs/
++obj-$(CONFIG_EFS_FS) += efs/
++obj-$(CONFIG_JFFS2_FS) += jffs2/
++obj-$(CONFIG_LOGFS) += logfs/
++obj-$(CONFIG_UBIFS_FS) += ubifs/
++obj-$(CONFIG_AFFS_FS) += affs/
++obj-$(CONFIG_ROMFS_FS) += romfs/
++obj-$(CONFIG_QNX4FS_FS) += qnx4/
++obj-$(CONFIG_QNX6FS_FS) += qnx6/
++obj-$(CONFIG_AUTOFS4_FS) += autofs4/
++obj-$(CONFIG_ADFS_FS) += adfs/
++obj-$(CONFIG_FUSE_FS) += fuse/
++obj-$(CONFIG_UDF_FS) += udf/
++obj-$(CONFIG_SUN_OPENPROMFS) += openpromfs/
++obj-$(CONFIG_OMFS_FS) += omfs/
++obj-$(CONFIG_JFS_FS) += jfs/
++obj-$(CONFIG_XFS_FS) += xfs/
++obj-$(CONFIG_9P_FS) += 9p/
++obj-$(CONFIG_AFS_FS) += afs/
++obj-$(CONFIG_NILFS2_FS) += nilfs2/
++obj-$(CONFIG_BEFS_FS) += befs/
++obj-$(CONFIG_HOSTFS) += hostfs/
++obj-$(CONFIG_HPPFS) += hppfs/
++obj-$(CONFIG_CACHEFILES) += cachefiles/
++obj-$(CONFIG_DEBUG_FS) += debugfs/
++obj-$(CONFIG_OCFS2_FS) += ocfs2/
++obj-$(CONFIG_BTRFS_FS) += btrfs/
++obj-$(CONFIG_GFS2_FS) += gfs2/
++obj-$(CONFIG_F2FS_FS) += f2fs/
++obj-y += exofs/ # Multiple modules
++obj-$(CONFIG_CEPH_FS) += ceph/
++obj-$(CONFIG_PSTORE) += pstore/
++obj-$(CONFIG_EFIVAR_FS) += efivarfs/
+diff -Nur linux-3.14.4.orig/fs/yaffs2/Kconfig linux-3.14.4/fs/yaffs2/Kconfig
+--- linux-3.14.4.orig/fs/yaffs2/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-3.14.4/fs/yaffs2/Kconfig 2014-05-14 12:41:23.868792075 +0200
+@@ -0,0 +1,171 @@
++#
++# yaffs file system configurations
++#
++
++config YAFFS_FS
++ tristate "yaffs2 file system support"
++ default n
++ depends on MTD_BLOCK
++ select YAFFS_YAFFS1
++ select YAFFS_YAFFS2
++ help
++ yaffs2, or Yet Another Flash File System, is a file system
++ optimised for NAND Flash chips.
++
++ To compile the yaffs2 file system support as a module, choose M
++ here: the module will be called yaffs2.
++
++ If unsure, say N.
++
++ Further information on yaffs2 is available at
++ <http://www.aleph1.co.uk/yaffs/>.
++
++config YAFFS_YAFFS1
++ bool "512 byte / page devices"
++ depends on YAFFS_FS
++ default y
++ help
++ Enable yaffs1 support -- yaffs for 512 byte / page devices
++
++ Not needed for 2K-page devices.
++
++ If unsure, say Y.
++
++config YAFFS_9BYTE_TAGS
++ bool "Use older-style on-NAND data format with pageStatus byte"
++ depends on YAFFS_YAFFS1
++ default n
++ help
++
++ Older-style on-NAND data format has a "pageStatus" byte to record
++ chunk/page state. This byte is zero when the page is discarded.
++ Choose this option if you have existing on-NAND data using this
++ format that you need to continue to support. New data written
++ also uses the older-style format. Note: Use of this option
++ generally requires that MTD's oob layout be adjusted to use the
++ older-style format. See notes on tags formats and MTD versions
++ in yaffs_mtdif1.c.
++
++ If unsure, say N.
++
++config YAFFS_DOES_ECC
++ bool "Lets yaffs do its own ECC"
++ depends on YAFFS_FS && YAFFS_YAFFS1 && !YAFFS_9BYTE_TAGS
++ default n
++ help
++ This enables yaffs to use its own ECC functions instead of using
++ the ones from the generic MTD-NAND driver.
++
++ If unsure, say N.
++
++config YAFFS_ECC_WRONG_ORDER
++ bool "Use the same ecc byte order as Steven Hill's nand_ecc.c"
++ depends on YAFFS_FS && YAFFS_DOES_ECC && !YAFFS_9BYTE_TAGS
++ default n
++ help
++ This makes yaffs_ecc.c use the same ecc byte order as Steven
++ Hill's nand_ecc.c. If not set, then you get the same ecc byte
++ order as SmartMedia.
++
++ If unsure, say N.
++
++config YAFFS_YAFFS2
++ bool "2048 byte (or larger) / page devices"
++ depends on YAFFS_FS
++ default y
++ help
++ Enable yaffs2 support -- yaffs for >= 2K bytes per page devices
++
++ If unsure, say Y.
++
++config YAFFS_AUTO_YAFFS2
++ bool "Autoselect yaffs2 format"
++ depends on YAFFS_YAFFS2
++ default y
++ help
++ Without this, you need to explicitely use yaffs2 as the file
++ system type. With this, you can say "yaffs" and yaffs or yaffs2
++ will be used depending on the device page size (yaffs on
++ 512-byte page devices, yaffs2 on 2K page devices).
++
++ If unsure, say Y.
++
++config YAFFS_DISABLE_TAGS_ECC
++ bool "Disable yaffs from doing ECC on tags by default"
++ depends on YAFFS_FS && YAFFS_YAFFS2
++ default n
++ help
++ This defaults yaffs to using its own ECC calculations on tags instead of
++ just relying on the MTD.
++ This behavior can also be overridden with tags_ecc_on and
++ tags_ecc_off mount options.
++
++ If unsure, say N.
++
++config YAFFS_ALWAYS_CHECK_CHUNK_ERASED
++ bool "Force chunk erase check"
++ depends on YAFFS_FS
++ default n
++ help
++ Normally yaffs only checks chunks before writing until an erased
++ chunk is found. This helps to detect any partially written
++ chunks that might have happened due to power loss.
++
++ Enabling this forces on the test that chunks are erased in flash
++ before writing to them. This takes more time but is potentially
++ a bit more secure.
++
++ Suggest setting Y during development and ironing out driver
++ issues etc. Suggest setting to N if you want faster writing.
++
++ If unsure, say Y.
++
++config YAFFS_EMPTY_LOST_AND_FOUND
++ bool "Empty lost and found on boot"
++ depends on YAFFS_FS
++ default n
++ help
++ If this is enabled then the contents of lost and found is
++ automatically dumped at mount.
++
++ If unsure, say N.
++
++config YAFFS_DISABLE_BLOCK_REFRESHING
++ bool "Disable yaffs2 block refreshing"
++ depends on YAFFS_FS
++ default n
++ help
++ If this is set, then block refreshing is disabled.
++ Block refreshing infrequently refreshes the oldest block in
++ a yaffs2 file system. This mechanism helps to refresh flash to
++ mitigate against data loss. This is particularly useful for MLC.
++
++ If unsure, say N.
++
++config YAFFS_DISABLE_BACKGROUND
++ bool "Disable yaffs2 background processing"
++ depends on YAFFS_FS
++ default n
++ help
++ If this is set, then background processing is disabled.
++ Background processing makes many foreground activities faster.
++
++ If unsure, say N.
++
++config YAFFS_DISABLE_BAD_BLOCK_MARKING
++ bool "Disable yaffs2 bad block marking"
++ depends on YAFFS_FS
++ default n
++ help
++ Useful during early flash bring up to prevent problems causing
++ lots of bad block marking.
++
++ If unsure, say N.
++
++config YAFFS_XATTR
++ bool "Enable yaffs2 xattr support"
++ depends on YAFFS_FS
++ default y
++ help
++ If this is set then yaffs2 will provide xattr support.
++ If unsure, say Y.
+diff -Nur linux-3.14.4.orig/fs/yaffs2/Makefile linux-3.14.4/fs/yaffs2/Makefile
+--- linux-3.14.4.orig/fs/yaffs2/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-3.14.4/fs/yaffs2/Makefile 2014-05-14 12:41:23.868792075 +0200
+@@ -0,0 +1,18 @@
++#
++# Makefile for the linux YAFFS filesystem routines.
++#
++
++obj-$(CONFIG_YAFFS_FS) += yaffs.o
++
++yaffs-y := yaffs_ecc.o yaffs_vfs.o yaffs_guts.o yaffs_checkptrw.o
++yaffs-y += yaffs_packedtags1.o yaffs_packedtags2.o yaffs_nand.o
++yaffs-y += yaffs_tagscompat.o yaffs_tagsmarshall.o
++yaffs-y += yaffs_mtdif.o
++yaffs-y += yaffs_nameval.o yaffs_attribs.o
++yaffs-y += yaffs_allocator.o
++yaffs-y += yaffs_yaffs1.o
++yaffs-y += yaffs_yaffs2.o
++yaffs-y += yaffs_bitmap.o
++yaffs-y += yaffs_summary.o
++yaffs-y += yaffs_verify.o
++
+diff -Nur linux-3.14.4.orig/fs/yaffs2/yaffs_allocator.c linux-3.14.4/fs/yaffs2/yaffs_allocator.c
+--- linux-3.14.4.orig/fs/yaffs2/yaffs_allocator.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-3.14.4/fs/yaffs2/yaffs_allocator.c 2014-05-14 12:41:23.872792088 +0200
+@@ -0,0 +1,357 @@
++/*
++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
++ *
++ * Copyright (C) 2002-2011 Aleph One Ltd.
++ * for Toby Churchill Ltd and Brightstar Engineering
++ *
++ * Created by Charles Manning <charles@aleph1.co.uk>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++
++#include "yaffs_allocator.h"
++#include "yaffs_guts.h"
++#include "yaffs_trace.h"
++#include "yportenv.h"
++
++/*
++ * Each entry in yaffs_tnode_list and yaffs_obj_list hold blocks
++ * of approx 100 objects that are themn allocated singly.
++ * This is basically a simplified slab allocator.
++ *
++ * We don't use the Linux slab allocator because slab does not allow
++ * us to dump all the objects in one hit when we do a umount and tear
++ * down all the tnodes and objects. slab requires that we first free
++ * the individual objects.
++ *
++ * Once yaffs has been mainlined I shall try to motivate for a change
++ * to slab to provide the extra features we need here.
++ */
++
++struct yaffs_tnode_list {
++ struct yaffs_tnode_list *next;
++ struct yaffs_tnode *tnodes;
++};
++
++struct yaffs_obj_list {
++ struct yaffs_obj_list *next;
++ struct yaffs_obj *objects;
++};
++
++struct yaffs_allocator {
++ int n_tnodes_created;
++ struct yaffs_tnode *free_tnodes;
++ int n_free_tnodes;
++ struct yaffs_tnode_list *alloc_tnode_list;
++
++ int n_obj_created;
++ struct list_head free_objs;
++ int n_free_objects;
++
++ struct yaffs_obj_list *allocated_obj_list;
++};
++
++static void yaffs_deinit_raw_tnodes(struct yaffs_dev *dev)
++{
++ struct yaffs_allocator *allocator =
++ (struct yaffs_allocator *)dev->allocator;
++ struct yaffs_tnode_list *tmp;
++
++ if (!allocator) {
++ BUG();
++ return;
++ }
++
++ while (allocator->alloc_tnode_list) {
++ tmp = allocator->alloc_tnode_list->next;
++
++ kfree(allocator->alloc_tnode_list->tnodes);
++ kfree(allocator->alloc_tnode_list);
++ allocator->alloc_tnode_list = tmp;
++ }
++
++ allocator->free_tnodes = NULL;
++ allocator->n_free_tnodes = 0;
++ allocator->n_tnodes_created = 0;
++}
++
++static void yaffs_init_raw_tnodes(struct yaffs_dev *dev)
++{
++ struct yaffs_allocator *allocator = dev->allocator;
++
++ if (!allocator) {
++ BUG();
++ return;
++ }
++
++ allocator->alloc_tnode_list = NULL;
++ allocator->free_tnodes = NULL;
++ allocator->n_free_tnodes = 0;
++ allocator->n_tnodes_created = 0;
++}
++
++static int yaffs_create_tnodes(struct yaffs_dev *dev, int n_tnodes)
++{
++ struct yaffs_allocator *allocator =
++ (struct yaffs_allocator *)dev->allocator;
++ int i;
++ struct yaffs_tnode *new_tnodes;
++ u8 *mem;
++ struct yaffs_tnode *curr;
++ struct yaffs_tnode *next;
++ struct yaffs_tnode_list *tnl;
++
++ if (!allocator) {
++ BUG();
++ return YAFFS_FAIL;
++ }
++
++ if (n_tnodes < 1)
++ return YAFFS_OK;
++
++ /* make these things */
++ new_tnodes = kmalloc(n_tnodes * dev->tnode_size, GFP_NOFS);
++ mem = (u8 *) new_tnodes;
++
++ if (!new_tnodes) {
++ yaffs_trace(YAFFS_TRACE_ERROR,
++ "yaffs: Could not allocate Tnodes");
++ return YAFFS_FAIL;
++ }
++
++ /* New hookup for wide tnodes */
++ for (i = 0; i < n_tnodes - 1; i++) {
++ curr = (struct yaffs_tnode *)&mem[i * dev->tnode_size];
++ next = (struct yaffs_tnode *)&mem[(i + 1) * dev->tnode_size];
++ curr->internal[0] = next;
++ }
++
++ curr = (struct yaffs_tnode *)&mem[(n_tnodes - 1) * dev->tnode_size];
++ curr->internal[0] = allocator->free_tnodes;
++ allocator->free_tnodes = (struct yaffs_tnode *)mem;
++
++ allocator->n_free_tnodes += n_tnodes;
++ allocator->n_tnodes_created += n_tnodes;
++
++ /* Now add this bunch of tnodes to a list for freeing up.
++ * NB If we can't add this to the management list it isn't fatal
++ * but it just means we can't free this bunch of tnodes later.
++ */
++ tnl = kmalloc(sizeof(struct yaffs_tnode_list), GFP_NOFS);
++ if (!tnl) {
++ yaffs_trace(YAFFS_TRACE_ERROR,
++ "Could not add tnodes to management list");
++ return YAFFS_FAIL;
++ } else {
++ tnl->tnodes = new_tnodes;
++ tnl->next = allocator->alloc_tnode_list;
++ allocator->alloc_tnode_list = tnl;
++ }
++
++ yaffs_trace(YAFFS_TRACE_ALLOCATE, "Tnodes added");
++
++ return YAFFS_OK;
++}
++
++struct yaffs_tnode *yaffs_alloc_raw_tnode(struct yaffs_dev *dev)
++{
++ struct yaffs_allocator *allocator =
++ (struct yaffs_allocator *)dev->allocator;
++ struct yaffs_tnode *tn = NULL;
++
++ if (!allocator) {
++ BUG();
++ return NULL;
++ }
++
++ /* If there are none left make more */
++ if (!allocator->free_tnodes)
++ yaffs_create_tnodes(dev, YAFFS_ALLOCATION_NTNODES);
++
++ if (allocator->free_tnodes) {
++ tn = allocator->free_tnodes;
++ allocator->free_tnodes = allocator->free_tnodes->internal[0];
++ allocator->n_free_tnodes--;
++ }
++
++ return tn;
++}
++
++/* FreeTnode frees up a tnode and puts it back on the free list */
++void yaffs_free_raw_tnode(struct yaffs_dev *dev, struct yaffs_tnode *tn)
++{
++ struct yaffs_allocator *allocator = dev->allocator;
++
++ if (!allocator) {
++ BUG();
++ return;
++ }
++
++ if (tn) {
++ tn->internal[0] = allocator->free_tnodes;
++ allocator->free_tnodes = tn;
++ allocator->n_free_tnodes++;
++ }
++ dev->checkpoint_blocks_required = 0; /* force recalculation */
++}
++
++/*--------------- yaffs_obj alloaction ------------------------
++ *
++ * Free yaffs_objs are stored in a list using obj->siblings.
++ * The blocks of allocated objects are stored in a linked list.
++ */
++
++static void yaffs_init_raw_objs(struct yaffs_dev *dev)
++{
++ struct yaffs_allocator *allocator = dev->allocator;
++
++ if (!allocator) {
++ BUG();
++ return;
++ }
++
++ allocator->allocated_obj_list = NULL;
++ INIT_LIST_HEAD(&allocator->free_objs);
++ allocator->n_free_objects = 0;
++}
++
++static void yaffs_deinit_raw_objs(struct yaffs_dev *dev)
++{
++ struct yaffs_allocator *allocator = dev->allocator;
++ struct yaffs_obj_list *tmp;
++
++ if (!allocator) {
++ BUG();
++ return;
++ }
++
++ while (allocator->allocated_obj_list) {
++ tmp = allocator->allocated_obj_list->next;
++ kfree(allocator->allocated_obj_list->objects);
++ kfree(allocator->allocated_obj_list);
++ allocator->allocated_obj_list = tmp;
++ }
++
++ INIT_LIST_HEAD(&allocator->free_objs);
++ allocator->n_free_objects = 0;
++ allocator->n_obj_created = 0;
++}
++
++static int yaffs_create_free_objs(struct yaffs_dev *dev, int n_obj)
++{
++ struct yaffs_allocator *allocator = dev->allocator;
++ int i;
++ struct yaffs_obj *new_objs;
++ struct yaffs_obj_list *list;
++
++ if (!allocator) {
++ BUG();
++ return YAFFS_FAIL;
++ }
++
++ if (n_obj < 1)
++ return YAFFS_OK;
++
++ /* make these things */
++ new_objs = kmalloc(n_obj * sizeof(struct yaffs_obj), GFP_NOFS);
++ list = kmalloc(sizeof(struct yaffs_obj_list), GFP_NOFS);
++
++ if (!new_objs || !list) {
++ kfree(new_objs);
++ new_objs = NULL;
++ kfree(list);
++ list = NULL;
++ yaffs_trace(YAFFS_TRACE_ALLOCATE,
++ "Could not allocate more objects");
++ return YAFFS_FAIL;
++ }
++
++ /* Hook them into the free list */
++ for (i = 0; i < n_obj; i++)
++ list_add(&new_objs[i].siblings, &allocator->free_objs);
++
++ allocator->n_free_objects += n_obj;
++ allocator->n_obj_created += n_obj;
++
++ /* Now add this bunch of Objects to a list for freeing up. */
++
++ list->objects = new_objs;
++ list->next = allocator->allocated_obj_list;
++ allocator->allocated_obj_list = list;
++
++ return YAFFS_OK;
++}
++
++struct yaffs_obj *yaffs_alloc_raw_obj(struct yaffs_dev *dev)
++{
++ struct yaffs_obj *obj = NULL;
++ struct list_head *lh;
++ struct yaffs_allocator *allocator = dev->allocator;
++
++ if (!allocator) {
++ BUG();
++ return obj;
++ }
++
++ /* If there are none left make more */
++ if (list_empty(&allocator->free_objs))
++ yaffs_create_free_objs(dev, YAFFS_ALLOCATION_NOBJECTS);
++
++ if (!list_empty(&allocator->free_objs)) {
++ lh = allocator->free_objs.next;
++ obj = list_entry(lh, struct yaffs_obj, siblings);
++ list_del_init(lh);
++ allocator->n_free_objects--;
++ }
++
++ return obj;
++}
++
++void yaffs_free_raw_obj(struct yaffs_dev *dev, struct yaffs_obj *obj)
++{
++
++ struct yaffs_allocator *allocator = dev->allocator;
++
++ if (!allocator) {
++ BUG();
++ return;
++ }
++
++ /* Link into the free list. */
++ list_add(&obj->siblings, &allocator->free_objs);
++ allocator->n_free_objects++;
++}
++
++void yaffs_deinit_raw_tnodes_and_objs(struct yaffs_dev *dev)
++{
++
++ if (!dev->allocator) {
++ BUG();
++ return;
++ }
++
++ yaffs_deinit_raw_tnodes(dev);
++ yaffs_deinit_raw_objs(dev);
++ kfree(dev->allocator);
++ dev->allocator = NULL;
++}
++
++void yaffs_init_raw_tnodes_and_objs(struct yaffs_dev *dev)
++{
++ struct yaffs_allocator *allocator;
++
++ if (dev->allocator) {
++ BUG();
++ return;
++ }
++
++ allocator = kmalloc(sizeof(struct yaffs_allocator), GFP_NOFS);
++ if (allocator) {
++ dev->allocator = allocator;
++ yaffs_init_raw_tnodes(dev);
++ yaffs_init_raw_objs(dev);
++ }
++}
++
+diff -Nur linux-3.14.4.orig/fs/yaffs2/yaffs_allocator.h linux-3.14.4/fs/yaffs2/yaffs_allocator.h
+--- linux-3.14.4.orig/fs/yaffs2/yaffs_allocator.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-3.14.4/fs/yaffs2/yaffs_allocator.h 2014-05-14 12:41:23.872792088 +0200
+@@ -0,0 +1,30 @@
++/*
++ * YAFFS: Yet another Flash File System . A NAND-flash specific file system.
++ *
++ * Copyright (C) 2002-2011 Aleph One Ltd.
++ * for Toby Churchill Ltd and Brightstar Engineering
++ *
++ * Created by Charles Manning <charles@aleph1.co.uk>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License version 2.1 as
++ * published by the Free Software Foundation.
++ *
++ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
++ */
++
++#ifndef __YAFFS_ALLOCATOR_H__
++#define __YAFFS_ALLOCATOR_H__
++
++#include "yaffs_guts.h"
++
++void yaffs_init_raw_tnodes_and_objs(struct yaffs_dev *dev);
++void yaffs_deinit_raw_tnodes_and_objs(struct yaffs_dev *dev);
++
++struct yaffs_tnode *yaffs_alloc_raw_tnode(struct yaffs_dev *dev);
++void yaffs_free_raw_tnode(struct yaffs_dev *dev, struct yaffs_tnode *tn);
++
++struct yaffs_obj *yaffs_alloc_raw_obj(struct yaffs_dev *dev);
++void yaffs_free_raw_obj(struct yaffs_dev *dev, struct yaffs_obj *obj);
++
++#endif
+diff -Nur linux-3.14.4.orig/fs/yaffs2/yaffs_attribs.c linux-3.14.4/fs/yaffs2/yaffs_attribs.c
+--- linux-3.14.4.orig/fs/yaffs2/yaffs_attribs.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-3.14.4/fs/yaffs2/yaffs_attribs.c 2014-05-14 12:41:23.872792088 +0200
+@@ -0,0 +1,166 @@
++/*
++ * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
++ *
++ * Copyright (C) 2002-2011 Aleph One Ltd.
++ * for Toby Churchill Ltd and Brightstar Engineering
++ *
++ * Created by Charles Manning <charles@aleph1.co.uk>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++
++#include "yaffs_guts.h"
++#include "yaffs_attribs.h"
++
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
++static inline uid_t ia_uid_read(const struct iattr *iattr)
++{
++ return from_kuid(&init_user_ns, iattr->ia_uid);
++}
++
++static inline gid_t ia_gid_read(const struct iattr *iattr)
++{
++ return from_kgid(&init_user_ns, iattr->ia_gid);
++}
++
++static inline void ia_uid_write(struct iattr *iattr, uid_t uid)
++{
++ iattr->ia_uid = make_kuid(&init_user_ns, uid);
++}
++
++static inline void ia_gid_write(struct iattr *iattr, gid_t gid)
++{
++ iattr->ia_gid = make_kgid(&init_user_ns, gid);
++}
++#else
++static inline uid_t ia_uid_read(const struct iattr *iattr)
++{
++ return iattr->ia_uid;
++}
++
++static inline gid_t ia_gid_read(const struct iattr *inode)
++{
++ return iattr->ia_gid;
++}
++
++static inline void ia_uid_write(struct iattr *iattr, uid_t uid)
++{
++ iattr->ia_uid = uid;
++}
++
++static inline void ia_gid_write(struct iattr *iattr, gid_t gid)
++{
++ iattr->ia_gid = gid;
++}
++#endif
++
++void yaffs_load_attribs(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh)
++{
++ obj->yst_uid = oh->yst_uid;
++ obj->yst_gid = oh->yst_gid;
++ obj->yst_atime = oh->yst_atime;
++ obj->yst_mtime = oh->yst_mtime;
++ obj->yst_ctime = oh->yst_ctime;
++ obj->yst_rdev = oh->yst_rdev;
++}
++
++void yaffs_load_attribs_oh(struct yaffs_obj_hdr *oh, struct yaffs_obj *obj)
++{
++ oh->yst_uid = obj->yst_uid;
++ oh->yst_gid = obj->yst_gid;
++ oh->yst_atime = obj->yst_atime;
++ oh->yst_mtime = obj->yst_mtime;
++ oh->yst_ctime = obj->yst_ctime;
++ oh->yst_rdev = obj->yst_rdev;
++
++}
++
++void yaffs_load_current_time(struct yaffs_obj *obj, int do_a, int do_c)
++{
++ obj->yst_mtime = Y_CURRENT_TIME;
++ if (do_a)
++ obj->yst_atime = obj->yst_mtime;
++ if (do_c)
++ obj->yst_ctime = obj->yst_mtime;
++}
++
++void yaffs_attribs_init(struct yaffs_obj *obj, u32 gid, u32 uid, u32 rdev)
++{
++ yaffs_load_current_time(obj, 1, 1);
++ obj->yst_rdev = rdev;
++ obj->yst_uid = uid;
++ obj->yst_gid = gid;
++}
++
++static loff_t yaffs_get_file_size(struct yaffs_obj *obj)
++{
++ YCHAR *alias = NULL;
++ obj = yaffs_get_equivalent_obj(obj);
++
++ switch (obj->variant_type) {
++ case YAFFS_OBJECT_TYPE_FILE:
++ return obj->variant.file_variant.file_size;
++ case YAFFS_OBJECT_TYPE_SYMLINK:
++ alias = obj->variant.symlink_variant.alias;