From a693d8f57cff61b7792ecca8be8474727f804330 Mon Sep 17 00:00:00 2001 From: Alexis Svinartchouk Date: Thu, 16 Feb 2017 16:46:41 +0100 Subject: [PATCH 1/2] move src/linux to vendor/linux --- binding.gyp | 10 +++++----- vendor.sh | 4 ++-- {src => vendor}/linux/.gitignore | 0 {src => vendor}/linux/Documentation/.gitignore | 0 {src => vendor}/linux/Documentation/DocBook/.gitignore | 0 .../linux/Documentation/arm/SH-Mobile/.gitignore | 0 {src => vendor}/linux/Documentation/vm/.gitignore | 0 {src => vendor}/linux/Kbuild | 0 {src => vendor}/linux/Kconfig | 0 {src => vendor}/linux/Makefile | 0 {src => vendor}/linux/README.md | 0 {src => vendor}/linux/arch/.gitignore | 0 {src => vendor}/linux/arch/Kconfig | 0 {src => vendor}/linux/arch/alpha/kernel/.gitignore | 0 {src => vendor}/linux/arch/arc/boot/.gitignore | 0 {src => vendor}/linux/arch/arc/kernel/.gitignore | 0 {src => vendor}/linux/arch/arm/boot/.gitignore | 0 .../linux/arch/arm/boot/compressed/.gitignore | 0 .../linux/arch/arm/boot/dts/include/dt-bindings | 0 .../arch/arm/boot/dts/sun8i-a23-ippo-q8h-v1.2.dts | 0 .../linux/arch/arm/boot/dts/sun8i-a23-ippo-q8h-v5.dts | 0 .../linux/arch/arm/boot/dts/sun8i-a33-et-q8-v1.6.dts | 0 .../arch/arm/boot/dts/sun8i-a33-ippo-q8h-v1.2.dts | 0 {src => vendor}/linux/arch/arm/crypto/.gitignore | 0 {src => vendor}/linux/arch/arm/kernel/.gitignore | 0 {src => vendor}/linux/arch/arm/vdso/.gitignore | 0 {src => vendor}/linux/arch/arm64/boot/.gitignore | 0 {src => vendor}/linux/arch/arm64/boot/dts/.gitignore | 0 .../arch/arm64/boot/dts/arm/vexpress-v2m-rs1.dtsi | 0 .../arch/arm64/boot/dts/broadcom/bcm2835-rpi.dtsi | 0 .../arm64/boot/dts/broadcom/bcm283x-rpi-smsc9514.dtsi | 0 .../linux/arch/arm64/boot/dts/broadcom/bcm283x.dtsi | 0 .../linux/arch/arm64/boot/dts/include/dt-bindings | 0 .../arm64/boot/dts/socionext/uniphier-pinctrl.dtsi | 0 .../boot/dts/socionext/uniphier-ref-daughter.dtsi | 0 .../boot/dts/socionext/uniphier-support-card.dtsi | 0 {src => vendor}/linux/arch/arm64/kernel/.gitignore | 0 .../linux/arch/arm64/kernel/vdso/.gitignore | 0 .../linux/arch/avr32/boot/images/.gitignore | 0 {src => vendor}/linux/arch/avr32/kernel/.gitignore | 0 {src => vendor}/linux/arch/blackfin/boot/.gitignore | 0 {src => vendor}/linux/arch/blackfin/kernel/.gitignore | 0 {src => vendor}/linux/arch/cris/boot/.gitignore | 0 .../linux/arch/cris/boot/dts/include/dt-bindings | 0 {src => vendor}/linux/arch/ia64/kernel/.gitignore | 0 {src => vendor}/linux/arch/lkl/.gitignore | 0 {src => vendor}/linux/arch/lkl/Kconfig | 0 {src => vendor}/linux/arch/lkl/Makefile | 0 {src => vendor}/linux/arch/lkl/auto.conf | 0 {src => vendor}/linux/arch/lkl/defconfig | 0 {src => vendor}/linux/arch/lkl/include/asm/Kbuild | 0 .../linux/arch/lkl/include/asm/bitsperlong.h | 0 {src => vendor}/linux/arch/lkl/include/asm/byteorder.h | 0 {src => vendor}/linux/arch/lkl/include/asm/cpu.h | 0 .../linux/arch/lkl/include/asm/dma-mapping.h | 0 {src => vendor}/linux/arch/lkl/include/asm/elf.h | 0 {src => vendor}/linux/arch/lkl/include/asm/host_ops.h | 0 {src => vendor}/linux/arch/lkl/include/asm/io.h | 0 {src => vendor}/linux/arch/lkl/include/asm/irq.h | 0 {src => vendor}/linux/arch/lkl/include/asm/mutex.h | 0 {src => vendor}/linux/arch/lkl/include/asm/page.h | 0 {src => vendor}/linux/arch/lkl/include/asm/pgtable.h | 0 {src => vendor}/linux/arch/lkl/include/asm/processor.h | 0 {src => vendor}/linux/arch/lkl/include/asm/ptrace.h | 0 {src => vendor}/linux/arch/lkl/include/asm/sched.h | 0 {src => vendor}/linux/arch/lkl/include/asm/setup.h | 0 {src => vendor}/linux/arch/lkl/include/asm/syscalls.h | 0 .../linux/arch/lkl/include/asm/syscalls_32.h | 0 .../linux/arch/lkl/include/asm/thread_info.h | 0 {src => vendor}/linux/arch/lkl/include/asm/unistd.h | 0 {src => vendor}/linux/arch/lkl/include/asm/unistd_32.h | 0 .../linux/arch/lkl/include/asm/vmlinux.lds.h | 0 {src => vendor}/linux/arch/lkl/include/asm/xor.h | 0 {src => vendor}/linux/arch/lkl/include/system/stdarg.h | 0 {src => vendor}/linux/arch/lkl/include/uapi/asm/Kbuild | 0 .../linux/arch/lkl/include/uapi/asm/bitsperlong.h | 0 .../linux/arch/lkl/include/uapi/asm/byteorder.h | 0 .../linux/arch/lkl/include/uapi/asm/host_ops.h | 0 {src => vendor}/linux/arch/lkl/include/uapi/asm/irq.h | 0 .../linux/arch/lkl/include/uapi/asm/sigcontext.h | 0 .../linux/arch/lkl/include/uapi/asm/siginfo.h | 0 .../linux/arch/lkl/include/uapi/asm/syscalls.h | 0 .../linux/arch/lkl/include/uapi/asm/unistd.h | 0 {src => vendor}/linux/arch/lkl/kernel/Makefile | 0 {src => vendor}/linux/arch/lkl/kernel/asm-offsets.c | 0 {src => vendor}/linux/arch/lkl/kernel/console.c | 0 {src => vendor}/linux/arch/lkl/kernel/cpu.c | 0 {src => vendor}/linux/arch/lkl/kernel/irq.c | 0 {src => vendor}/linux/arch/lkl/kernel/misc.c | 0 {src => vendor}/linux/arch/lkl/kernel/setup.c | 0 {src => vendor}/linux/arch/lkl/kernel/syscalls.c | 0 {src => vendor}/linux/arch/lkl/kernel/syscalls_32.c | 0 {src => vendor}/linux/arch/lkl/kernel/threads.c | 0 {src => vendor}/linux/arch/lkl/kernel/time.c | 0 {src => vendor}/linux/arch/lkl/kernel/vmlinux.lds.S | 0 {src => vendor}/linux/arch/lkl/mm/Makefile | 0 {src => vendor}/linux/arch/lkl/mm/bootmem.c | 0 .../linux/arch/lkl/scripts/headers_install.py | 0 {src => vendor}/linux/arch/m32r/kernel/.gitignore | 0 {src => vendor}/linux/arch/m68k/kernel/.gitignore | 0 {src => vendor}/linux/arch/metag/boot/.gitignore | 0 .../linux/arch/metag/boot/dts/include/dt-bindings | 0 {src => vendor}/linux/arch/metag/kernel/.gitignore | 0 {src => vendor}/linux/arch/microblaze/boot/.gitignore | 0 .../linux/arch/microblaze/kernel/.gitignore | 0 {src => vendor}/linux/arch/mips/boot/.gitignore | 0 .../linux/arch/mips/boot/dts/include/dt-bindings | 0 {src => vendor}/linux/arch/mips/boot/tools/.gitignore | 0 {src => vendor}/linux/arch/mips/kernel/.gitignore | 0 {src => vendor}/linux/arch/mips/vdso/.gitignore | 0 {src => vendor}/linux/arch/mn10300/boot/.gitignore | 0 {src => vendor}/linux/arch/parisc/kernel/.gitignore | 0 {src => vendor}/linux/arch/powerpc/boot/.gitignore | 0 .../linux/arch/powerpc/boot/dts/include/dt-bindings | 0 {src => vendor}/linux/arch/powerpc/kernel/.gitignore | 0 .../linux/arch/powerpc/kernel/vdso32/.gitignore | 0 .../linux/arch/powerpc/kernel/vdso64/.gitignore | 0 .../linux/arch/powerpc/platforms/cell/spufs/.gitignore | 0 {src => vendor}/linux/arch/s390/boot/.gitignore | 0 .../linux/arch/s390/boot/compressed/.gitignore | 0 {src => vendor}/linux/arch/s390/kernel/.gitignore | 0 .../linux/arch/s390/kernel/vdso32/.gitignore | 0 .../linux/arch/s390/kernel/vdso64/.gitignore | 0 {src => vendor}/linux/arch/s390/tools/.gitignore | 0 {src => vendor}/linux/arch/sh/boot/.gitignore | 0 .../linux/arch/sh/boot/compressed/.gitignore | 0 {src => vendor}/linux/arch/sh/kernel/.gitignore | 0 .../linux/arch/sh/kernel/vsyscall/.gitignore | 0 {src => vendor}/linux/arch/sparc/boot/.gitignore | 0 {src => vendor}/linux/arch/sparc/kernel/.gitignore | 0 {src => vendor}/linux/arch/um/.gitignore | 0 {src => vendor}/linux/arch/unicore32/.gitignore | 0 {src => vendor}/linux/arch/x86/.gitignore | 0 {src => vendor}/linux/arch/x86/boot/.gitignore | 0 .../linux/arch/x86/boot/compressed/.gitignore | 0 {src => vendor}/linux/arch/x86/boot/tools/.gitignore | 0 .../linux/arch/x86/entry/syscalls/syscall_32.tbl | 0 {src => vendor}/linux/arch/x86/entry/vdso/.gitignore | 0 .../linux/arch/x86/entry/vdso/vdso32/.gitignore | 0 {src => vendor}/linux/arch/x86/kernel/.gitignore | 0 {src => vendor}/linux/arch/x86/kernel/cpu/.gitignore | 0 {src => vendor}/linux/arch/x86/lib/.gitignore | 0 {src => vendor}/linux/arch/x86/ras/Kconfig | 0 {src => vendor}/linux/arch/x86/realmode/rm/.gitignore | 0 {src => vendor}/linux/arch/x86/tools/.gitignore | 0 {src => vendor}/linux/arch/x86/um/vdso/.gitignore | 0 {src => vendor}/linux/arch/xtensa/boot/.gitignore | 0 .../linux/arch/xtensa/boot/boot-elf/.gitignore | 0 {src => vendor}/linux/arch/xtensa/boot/lib/.gitignore | 0 {src => vendor}/linux/arch/xtensa/kernel/.gitignore | 0 {src => vendor}/linux/block/Kconfig | 0 {src => vendor}/linux/block/Kconfig.iosched | 0 {src => vendor}/linux/block/Makefile | 0 {src => vendor}/linux/block/badblocks.c | 0 {src => vendor}/linux/block/bio.c | 0 {src => vendor}/linux/block/blk-core.c | 0 {src => vendor}/linux/block/blk-exec.c | 0 {src => vendor}/linux/block/blk-flush.c | 0 {src => vendor}/linux/block/blk-ioc.c | 0 {src => vendor}/linux/block/blk-lib.c | 0 {src => vendor}/linux/block/blk-map.c | 0 {src => vendor}/linux/block/blk-merge.c | 0 {src => vendor}/linux/block/blk-mq-cpumap.c | 0 {src => vendor}/linux/block/blk-mq-sysfs.c | 0 {src => vendor}/linux/block/blk-mq-tag.c | 0 {src => vendor}/linux/block/blk-mq-tag.h | 0 {src => vendor}/linux/block/blk-mq.c | 0 {src => vendor}/linux/block/blk-mq.h | 0 {src => vendor}/linux/block/blk-settings.c | 0 {src => vendor}/linux/block/blk-softirq.c | 0 {src => vendor}/linux/block/blk-sysfs.c | 0 {src => vendor}/linux/block/blk-tag.c | 0 {src => vendor}/linux/block/blk-timeout.c | 0 {src => vendor}/linux/block/blk.h | 0 {src => vendor}/linux/block/cfq-iosched.c | 0 {src => vendor}/linux/block/deadline-iosched.c | 0 {src => vendor}/linux/block/elevator.c | 0 {src => vendor}/linux/block/genhd.c | 0 {src => vendor}/linux/block/ioctl.c | 0 {src => vendor}/linux/block/ioprio.c | 0 {src => vendor}/linux/block/noop-iosched.c | 0 {src => vendor}/linux/block/partition-generic.c | 0 {src => vendor}/linux/block/partitions/Kconfig | 0 {src => vendor}/linux/block/partitions/Makefile | 0 {src => vendor}/linux/block/partitions/acorn.h | 0 {src => vendor}/linux/block/partitions/aix.h | 0 {src => vendor}/linux/block/partitions/amiga.h | 0 {src => vendor}/linux/block/partitions/atari.h | 0 {src => vendor}/linux/block/partitions/check.c | 0 {src => vendor}/linux/block/partitions/check.h | 0 {src => vendor}/linux/block/partitions/cmdline.h | 0 {src => vendor}/linux/block/partitions/efi.c | 0 {src => vendor}/linux/block/partitions/efi.h | 0 {src => vendor}/linux/block/partitions/ibm.h | 0 {src => vendor}/linux/block/partitions/karma.h | 0 {src => vendor}/linux/block/partitions/ldm.h | 0 {src => vendor}/linux/block/partitions/mac.h | 0 {src => vendor}/linux/block/partitions/msdos.c | 0 {src => vendor}/linux/block/partitions/msdos.h | 0 {src => vendor}/linux/block/partitions/osf.h | 0 {src => vendor}/linux/block/partitions/sgi.h | 0 {src => vendor}/linux/block/partitions/sun.h | 0 {src => vendor}/linux/block/partitions/sysv68.h | 0 {src => vendor}/linux/block/partitions/ultrix.h | 0 {src => vendor}/linux/block/scsi_ioctl.c | 0 {src => vendor}/linux/certs/.gitignore | 0 {src => vendor}/linux/certs/Kconfig | 0 {src => vendor}/linux/certs/Makefile | 0 {src => vendor}/linux/crypto/.gitignore | 0 {src => vendor}/linux/crypto/Kconfig | 0 {src => vendor}/linux/crypto/Makefile | 0 {src => vendor}/linux/crypto/ablkcipher.c | 0 {src => vendor}/linux/crypto/aead.c | 0 {src => vendor}/linux/crypto/aes_generic.c | 0 {src => vendor}/linux/crypto/ahash.c | 0 {src => vendor}/linux/crypto/akcipher.c | 0 {src => vendor}/linux/crypto/algapi.c | 0 {src => vendor}/linux/crypto/algboss.c | 0 {src => vendor}/linux/crypto/ansi_cprng.c | 0 {src => vendor}/linux/crypto/api.c | 0 .../linux/crypto/asymmetric_keys/.gitignore | 0 {src => vendor}/linux/crypto/asymmetric_keys/Kconfig | 0 {src => vendor}/linux/crypto/async_tx/Kconfig | 0 {src => vendor}/linux/crypto/blkcipher.c | 0 {src => vendor}/linux/crypto/cipher.c | 0 {src => vendor}/linux/crypto/compress.c | 0 {src => vendor}/linux/crypto/crc32c_generic.c | 0 {src => vendor}/linux/crypto/crypto_null.c | 0 {src => vendor}/linux/crypto/crypto_wq.c | 0 {src => vendor}/linux/crypto/drbg.c | 0 {src => vendor}/linux/crypto/echainiv.c | 0 {src => vendor}/linux/crypto/hmac.c | 0 {src => vendor}/linux/crypto/internal.h | 0 {src => vendor}/linux/crypto/jitterentropy-kcapi.c | 0 {src => vendor}/linux/crypto/jitterentropy.c | 0 {src => vendor}/linux/crypto/kpp.c | 0 {src => vendor}/linux/crypto/memneq.c | 0 {src => vendor}/linux/crypto/proc.c | 0 {src => vendor}/linux/crypto/rng.c | 0 {src => vendor}/linux/crypto/scatterwalk.c | 0 {src => vendor}/linux/crypto/sha256_generic.c | 0 {src => vendor}/linux/crypto/shash.c | 0 {src => vendor}/linux/crypto/skcipher.c | 0 {src => vendor}/linux/crypto/testmgr.c | 0 {src => vendor}/linux/crypto/xor.c | 0 {src => vendor}/linux/drivers/Kconfig | 0 {src => vendor}/linux/drivers/Makefile | 0 {src => vendor}/linux/drivers/accessibility/Kconfig | 0 {src => vendor}/linux/drivers/amba/Kconfig | 0 {src => vendor}/linux/drivers/amba/Makefile | 0 {src => vendor}/linux/drivers/android/Kconfig | 0 {src => vendor}/linux/drivers/ata/Kconfig | 0 {src => vendor}/linux/drivers/atm/.gitignore | 0 {src => vendor}/linux/drivers/atm/Kconfig | 0 {src => vendor}/linux/drivers/auxdisplay/Kconfig | 0 {src => vendor}/linux/drivers/auxdisplay/Makefile | 0 {src => vendor}/linux/drivers/base/Kconfig | 0 {src => vendor}/linux/drivers/base/Makefile | 0 .../linux/drivers/base/attribute_container.c | 0 {src => vendor}/linux/drivers/base/base.h | 0 {src => vendor}/linux/drivers/base/bus.c | 0 {src => vendor}/linux/drivers/base/cacheinfo.c | 0 {src => vendor}/linux/drivers/base/class.c | 0 {src => vendor}/linux/drivers/base/component.c | 0 {src => vendor}/linux/drivers/base/container.c | 0 {src => vendor}/linux/drivers/base/core.c | 0 {src => vendor}/linux/drivers/base/cpu.c | 0 {src => vendor}/linux/drivers/base/dd.c | 0 {src => vendor}/linux/drivers/base/devres.c | 0 {src => vendor}/linux/drivers/base/dma-mapping.c | 0 {src => vendor}/linux/drivers/base/driver.c | 0 {src => vendor}/linux/drivers/base/firmware.c | 0 {src => vendor}/linux/drivers/base/init.c | 0 {src => vendor}/linux/drivers/base/map.c | 0 {src => vendor}/linux/drivers/base/platform.c | 0 {src => vendor}/linux/drivers/base/power/Makefile | 0 {src => vendor}/linux/drivers/base/power/power.h | 0 {src => vendor}/linux/drivers/base/property.c | 0 {src => vendor}/linux/drivers/base/regmap/Kconfig | 0 {src => vendor}/linux/drivers/base/syscore.c | 0 {src => vendor}/linux/drivers/base/topology.c | 0 {src => vendor}/linux/drivers/base/transport_class.c | 0 {src => vendor}/linux/drivers/bcma/Kconfig | 0 {src => vendor}/linux/drivers/block/Kconfig | 0 {src => vendor}/linux/drivers/block/Makefile | 0 {src => vendor}/linux/drivers/block/drbd/Kconfig | 0 {src => vendor}/linux/drivers/block/mtip32xx/Kconfig | 0 {src => vendor}/linux/drivers/block/paride/Kconfig | 0 {src => vendor}/linux/drivers/block/virtio_blk.c | 0 {src => vendor}/linux/drivers/block/zram/Kconfig | 0 {src => vendor}/linux/drivers/bluetooth/Kconfig | 0 {src => vendor}/linux/drivers/bus/Kconfig | 0 {src => vendor}/linux/drivers/bus/Makefile | 0 {src => vendor}/linux/drivers/cdrom/Makefile | 0 {src => vendor}/linux/drivers/char/Kconfig | 0 {src => vendor}/linux/drivers/char/Makefile | 0 {src => vendor}/linux/drivers/char/agp/Kconfig | 0 {src => vendor}/linux/drivers/char/agp/Makefile | 0 {src => vendor}/linux/drivers/char/hw_random/Kconfig | 0 {src => vendor}/linux/drivers/char/hw_random/Makefile | 0 {src => vendor}/linux/drivers/char/hw_random/core.c | 0 {src => vendor}/linux/drivers/char/ipmi/Kconfig | 0 {src => vendor}/linux/drivers/char/ipmi/Makefile | 0 {src => vendor}/linux/drivers/char/mem.c | 0 {src => vendor}/linux/drivers/char/misc.c | 0 {src => vendor}/linux/drivers/char/pcmcia/Kconfig | 0 {src => vendor}/linux/drivers/char/random.c | 0 {src => vendor}/linux/drivers/char/tpm/Kconfig | 0 .../linux/drivers/char/tpm/st33zp24/Kconfig | 0 {src => vendor}/linux/drivers/char/xillybus/Kconfig | 0 {src => vendor}/linux/drivers/clk/Kconfig | 0 {src => vendor}/linux/drivers/clk/Makefile | 0 {src => vendor}/linux/drivers/clk/bcm/Kconfig | 0 {src => vendor}/linux/drivers/clk/bcm/Makefile | 0 {src => vendor}/linux/drivers/clk/hisilicon/Kconfig | 0 {src => vendor}/linux/drivers/clk/mediatek/Kconfig | 0 {src => vendor}/linux/drivers/clk/meson/Kconfig | 0 {src => vendor}/linux/drivers/clk/mvebu/Kconfig | 0 {src => vendor}/linux/drivers/clk/mvebu/Makefile | 0 {src => vendor}/linux/drivers/clk/qcom/Kconfig | 0 {src => vendor}/linux/drivers/clk/renesas/Kconfig | 0 {src => vendor}/linux/drivers/clk/samsung/Kconfig | 0 {src => vendor}/linux/drivers/clk/sunxi-ng/Kconfig | 0 {src => vendor}/linux/drivers/clk/tegra/Kconfig | 0 {src => vendor}/linux/drivers/clk/ti/Kconfig | 0 {src => vendor}/linux/drivers/clk/ti/Makefile | 0 {src => vendor}/linux/drivers/clk/uniphier/Kconfig | 0 {src => vendor}/linux/drivers/clk/versatile/Kconfig | 0 {src => vendor}/linux/drivers/clocksource/Kconfig | 0 {src => vendor}/linux/drivers/clocksource/Makefile | 0 {src => vendor}/linux/drivers/connector/Kconfig | 0 {src => vendor}/linux/drivers/crypto/Kconfig | 0 {src => vendor}/linux/drivers/crypto/Makefile | 0 {src => vendor}/linux/drivers/crypto/caam/Kconfig | 0 {src => vendor}/linux/drivers/crypto/ccp/Kconfig | 0 {src => vendor}/linux/drivers/crypto/chelsio/Kconfig | 0 {src => vendor}/linux/drivers/crypto/nx/Kconfig | 0 {src => vendor}/linux/drivers/crypto/qat/Kconfig | 0 .../linux/drivers/crypto/qat/qat_common/.gitignore | 0 {src => vendor}/linux/drivers/crypto/ux500/Kconfig | 0 {src => vendor}/linux/drivers/crypto/vmx/.gitignore | 0 {src => vendor}/linux/drivers/crypto/vmx/Kconfig | 0 {src => vendor}/linux/drivers/dax/Kconfig | 0 {src => vendor}/linux/drivers/dca/Kconfig | 0 {src => vendor}/linux/drivers/devfreq/Kconfig | 0 {src => vendor}/linux/drivers/devfreq/event/Kconfig | 0 {src => vendor}/linux/drivers/dma-buf/Kconfig | 0 {src => vendor}/linux/drivers/dma/Kconfig | 0 {src => vendor}/linux/drivers/dma/bestcomm/Kconfig | 0 {src => vendor}/linux/drivers/dma/dw/Kconfig | 0 {src => vendor}/linux/drivers/dma/hsu/Kconfig | 0 {src => vendor}/linux/drivers/dma/qcom/Kconfig | 0 {src => vendor}/linux/drivers/dma/sh/Kconfig | 0 {src => vendor}/linux/drivers/edac/Kconfig | 0 {src => vendor}/linux/drivers/eisa/.gitignore | 0 {src => vendor}/linux/drivers/extcon/Kconfig | 0 {src => vendor}/linux/drivers/firewire/Kconfig | 0 {src => vendor}/linux/drivers/firewire/Makefile | 0 {src => vendor}/linux/drivers/firmware/Makefile | 0 .../linux/drivers/firmware/broadcom/Makefile | 0 {src => vendor}/linux/drivers/firmware/meson/Makefile | 0 {src => vendor}/linux/drivers/fmc/Kconfig | 0 {src => vendor}/linux/drivers/fpga/Kconfig | 0 {src => vendor}/linux/drivers/gpio/Kconfig | 0 {src => vendor}/linux/drivers/gpu/Makefile | 0 {src => vendor}/linux/drivers/gpu/drm/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/Makefile | 0 {src => vendor}/linux/drivers/gpu/drm/amd/acp/Kconfig | 0 .../linux/drivers/gpu/drm/amd/amdgpu/Kconfig | 0 .../linux/drivers/gpu/drm/amd/amdkfd/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/arc/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/arm/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/armada/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/ast/Kconfig | 0 .../linux/drivers/gpu/drm/atmel-hlcdc/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/bochs/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/bridge/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/bridge/Makefile | 0 .../linux/drivers/gpu/drm/bridge/adv7511/Kconfig | 0 .../linux/drivers/gpu/drm/bridge/analogix/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/cirrus/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/etnaviv/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/exynos/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/fsl-dcu/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/gma500/Kconfig | 0 .../linux/drivers/gpu/drm/hisilicon/Kconfig | 0 .../linux/drivers/gpu/drm/hisilicon/Makefile | 0 .../linux/drivers/gpu/drm/hisilicon/kirin/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/i2c/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/i2c/Makefile | 0 {src => vendor}/linux/drivers/gpu/drm/i915/Kconfig | 0 .../linux/drivers/gpu/drm/i915/Kconfig.debug | 0 {src => vendor}/linux/drivers/gpu/drm/imx/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/mediatek/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/mgag200/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/msm/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/nouveau/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/omapdrm/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/omapdrm/Makefile | 0 .../linux/drivers/gpu/drm/omapdrm/displays/Kconfig | 0 .../linux/drivers/gpu/drm/omapdrm/displays/Makefile | 0 .../linux/drivers/gpu/drm/omapdrm/dss/Kconfig | 0 .../linux/drivers/gpu/drm/omapdrm/dss/Makefile | 0 {src => vendor}/linux/drivers/gpu/drm/panel/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/panel/Makefile | 0 {src => vendor}/linux/drivers/gpu/drm/qxl/Kconfig | 0 .../linux/drivers/gpu/drm/radeon/.gitignore | 0 {src => vendor}/linux/drivers/gpu/drm/radeon/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/rcar-du/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/rockchip/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/shmobile/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/sti/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/sun4i/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/tegra/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/tilcdc/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/tilcdc/Makefile | 0 {src => vendor}/linux/drivers/gpu/drm/udl/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/vc4/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/virtio/Kconfig | 0 {src => vendor}/linux/drivers/gpu/drm/vmwgfx/Kconfig | 0 {src => vendor}/linux/drivers/gpu/host1x/Kconfig | 0 {src => vendor}/linux/drivers/gpu/ipu-v3/Kconfig | 0 {src => vendor}/linux/drivers/gpu/vga/Kconfig | 0 {src => vendor}/linux/drivers/gpu/vga/Makefile | 0 {src => vendor}/linux/drivers/hid/Kconfig | 0 {src => vendor}/linux/drivers/hid/Makefile | 0 {src => vendor}/linux/drivers/hid/hid-core.c | 0 {src => vendor}/linux/drivers/hid/hid-generic.c | 0 {src => vendor}/linux/drivers/hid/hid-ids.h | 0 {src => vendor}/linux/drivers/hid/hid-input.c | 0 {src => vendor}/linux/drivers/hid/i2c-hid/Kconfig | 0 .../linux/drivers/hid/intel-ish-hid/Kconfig | 0 {src => vendor}/linux/drivers/hid/usbhid/Kconfig | 0 {src => vendor}/linux/drivers/hsi/Kconfig | 0 {src => vendor}/linux/drivers/hsi/clients/Kconfig | 0 {src => vendor}/linux/drivers/hsi/controllers/Kconfig | 0 {src => vendor}/linux/drivers/hv/Kconfig | 0 {src => vendor}/linux/drivers/hwmon/Kconfig | 0 {src => vendor}/linux/drivers/hwmon/Makefile | 0 {src => vendor}/linux/drivers/hwmon/hwmon.c | 0 {src => vendor}/linux/drivers/hwmon/pmbus/Kconfig | 0 {src => vendor}/linux/drivers/hwspinlock/Kconfig | 0 .../linux/drivers/hwtracing/intel_th/Kconfig | 0 .../linux/drivers/hwtracing/intel_th/Makefile | 0 {src => vendor}/linux/drivers/hwtracing/stm/Kconfig | 0 {src => vendor}/linux/drivers/i2c/Kconfig | 0 {src => vendor}/linux/drivers/i2c/Makefile | 0 {src => vendor}/linux/drivers/i2c/algos/Kconfig | 0 {src => vendor}/linux/drivers/i2c/algos/Makefile | 0 {src => vendor}/linux/drivers/i2c/busses/Kconfig | 0 {src => vendor}/linux/drivers/i2c/busses/Makefile | 0 {src => vendor}/linux/drivers/i2c/muxes/Kconfig | 0 {src => vendor}/linux/drivers/i2c/muxes/Makefile | 0 {src => vendor}/linux/drivers/ide/Kconfig | 0 {src => vendor}/linux/drivers/idle/Makefile | 0 {src => vendor}/linux/drivers/iio/Kconfig | 0 {src => vendor}/linux/drivers/iio/accel/Kconfig | 0 {src => vendor}/linux/drivers/iio/adc/Kconfig | 0 {src => vendor}/linux/drivers/iio/amplifiers/Kconfig | 0 {src => vendor}/linux/drivers/iio/buffer/Kconfig | 0 {src => vendor}/linux/drivers/iio/chemical/Kconfig | 0 {src => vendor}/linux/drivers/iio/common/Kconfig | 0 .../linux/drivers/iio/common/hid-sensors/Kconfig | 0 .../linux/drivers/iio/common/ms_sensors/Kconfig | 0 .../linux/drivers/iio/common/ssp_sensors/Kconfig | 0 .../linux/drivers/iio/common/st_sensors/Kconfig | 0 {src => vendor}/linux/drivers/iio/dac/Kconfig | 0 {src => vendor}/linux/drivers/iio/dummy/Kconfig | 0 {src => vendor}/linux/drivers/iio/frequency/Kconfig | 0 {src => vendor}/linux/drivers/iio/gyro/Kconfig | 0 {src => vendor}/linux/drivers/iio/health/Kconfig | 0 {src => vendor}/linux/drivers/iio/humidity/Kconfig | 0 {src => vendor}/linux/drivers/iio/imu/Kconfig | 0 {src => vendor}/linux/drivers/iio/imu/bmi160/Kconfig | 0 .../linux/drivers/iio/imu/inv_mpu6050/Kconfig | 0 {src => vendor}/linux/drivers/iio/light/Kconfig | 0 {src => vendor}/linux/drivers/iio/magnetometer/Kconfig | 0 {src => vendor}/linux/drivers/iio/orientation/Kconfig | 0 .../linux/drivers/iio/potentiometer/Kconfig | 0 {src => vendor}/linux/drivers/iio/pressure/Kconfig | 0 {src => vendor}/linux/drivers/iio/proximity/Kconfig | 0 {src => vendor}/linux/drivers/iio/temperature/Kconfig | 0 {src => vendor}/linux/drivers/iio/trigger/Kconfig | 0 {src => vendor}/linux/drivers/infiniband/Kconfig | 0 .../linux/drivers/infiniband/hw/cxgb3/Kconfig | 0 .../linux/drivers/infiniband/hw/cxgb4/Kconfig | 0 .../linux/drivers/infiniband/hw/hfi1/Kconfig | 0 .../linux/drivers/infiniband/hw/hns/Kconfig | 0 .../linux/drivers/infiniband/hw/i40iw/Kconfig | 0 .../linux/drivers/infiniband/hw/mlx4/Kconfig | 0 .../linux/drivers/infiniband/hw/mlx5/Kconfig | 0 .../linux/drivers/infiniband/hw/mthca/Kconfig | 0 .../linux/drivers/infiniband/hw/nes/Kconfig | 0 .../linux/drivers/infiniband/hw/ocrdma/Kconfig | 0 .../linux/drivers/infiniband/hw/qedr/Kconfig | 0 .../linux/drivers/infiniband/hw/qib/Kconfig | 0 .../linux/drivers/infiniband/hw/usnic/Kconfig | 0 .../linux/drivers/infiniband/sw/rdmavt/Kconfig | 0 .../linux/drivers/infiniband/sw/rxe/Kconfig | 0 .../linux/drivers/infiniband/ulp/ipoib/Kconfig | 0 .../linux/drivers/infiniband/ulp/iser/Kconfig | 0 .../linux/drivers/infiniband/ulp/isert/Kconfig | 0 .../linux/drivers/infiniband/ulp/srp/Kconfig | 0 .../linux/drivers/infiniband/ulp/srpt/Kconfig | 0 {src => vendor}/linux/drivers/input/Kconfig | 0 {src => vendor}/linux/drivers/input/Makefile | 0 {src => vendor}/linux/drivers/input/ff-core.c | 0 {src => vendor}/linux/drivers/input/gameport/Kconfig | 0 {src => vendor}/linux/drivers/input/input-compat.c | 0 {src => vendor}/linux/drivers/input/input-compat.h | 0 {src => vendor}/linux/drivers/input/input-mt.c | 0 {src => vendor}/linux/drivers/input/input.c | 0 {src => vendor}/linux/drivers/input/joystick/Kconfig | 0 .../linux/drivers/input/joystick/iforce/Kconfig | 0 {src => vendor}/linux/drivers/input/keyboard/Kconfig | 0 {src => vendor}/linux/drivers/input/keyboard/Makefile | 0 {src => vendor}/linux/drivers/input/keyboard/atkbd.c | 0 {src => vendor}/linux/drivers/input/misc/Kconfig | 0 {src => vendor}/linux/drivers/input/mouse/Kconfig | 0 {src => vendor}/linux/drivers/input/mouse/Makefile | 0 {src => vendor}/linux/drivers/input/mouse/alps.c | 0 {src => vendor}/linux/drivers/input/mouse/alps.h | 0 {src => vendor}/linux/drivers/input/mouse/byd.c | 0 {src => vendor}/linux/drivers/input/mouse/byd.h | 0 .../linux/drivers/input/mouse/cypress_ps2.c | 0 .../linux/drivers/input/mouse/cypress_ps2.h | 0 {src => vendor}/linux/drivers/input/mouse/elantech.h | 0 {src => vendor}/linux/drivers/input/mouse/focaltech.c | 0 {src => vendor}/linux/drivers/input/mouse/focaltech.h | 0 {src => vendor}/linux/drivers/input/mouse/hgpk.h | 0 {src => vendor}/linux/drivers/input/mouse/lifebook.h | 0 {src => vendor}/linux/drivers/input/mouse/logips2pp.c | 0 {src => vendor}/linux/drivers/input/mouse/logips2pp.h | 0 .../linux/drivers/input/mouse/psmouse-base.c | 0 {src => vendor}/linux/drivers/input/mouse/psmouse.h | 0 {src => vendor}/linux/drivers/input/mouse/sentelic.h | 0 {src => vendor}/linux/drivers/input/mouse/synaptics.c | 0 {src => vendor}/linux/drivers/input/mouse/synaptics.h | 0 .../linux/drivers/input/mouse/touchkit_ps2.h | 0 {src => vendor}/linux/drivers/input/mouse/trackpoint.c | 0 {src => vendor}/linux/drivers/input/mouse/trackpoint.h | 0 {src => vendor}/linux/drivers/input/mouse/vmmouse.h | 0 {src => vendor}/linux/drivers/input/mousedev.c | 0 {src => vendor}/linux/drivers/input/rmi4/Kconfig | 0 {src => vendor}/linux/drivers/input/serio/Kconfig | 0 {src => vendor}/linux/drivers/input/serio/Makefile | 0 {src => vendor}/linux/drivers/input/serio/libps2.c | 0 {src => vendor}/linux/drivers/input/serio/serio.c | 0 {src => vendor}/linux/drivers/input/serio/serport.c | 0 {src => vendor}/linux/drivers/input/tablet/Kconfig | 0 .../linux/drivers/input/touchscreen/Kconfig | 0 {src => vendor}/linux/drivers/iommu/Kconfig | 0 {src => vendor}/linux/drivers/ipack/Kconfig | 0 {src => vendor}/linux/drivers/ipack/carriers/Kconfig | 0 {src => vendor}/linux/drivers/ipack/devices/Kconfig | 0 {src => vendor}/linux/drivers/irqchip/Kconfig | 0 {src => vendor}/linux/drivers/irqchip/Makefile | 0 {src => vendor}/linux/drivers/isdn/Kconfig | 0 {src => vendor}/linux/drivers/isdn/capi/Kconfig | 0 {src => vendor}/linux/drivers/isdn/gigaset/Kconfig | 0 {src => vendor}/linux/drivers/isdn/hardware/Kconfig | 0 .../linux/drivers/isdn/hardware/avm/Kconfig | 0 .../linux/drivers/isdn/hardware/eicon/Kconfig | 0 .../linux/drivers/isdn/hardware/mISDN/Kconfig | 0 {src => vendor}/linux/drivers/isdn/hisax/Kconfig | 0 {src => vendor}/linux/drivers/isdn/hysdn/Kconfig | 0 {src => vendor}/linux/drivers/isdn/i4l/Kconfig | 0 {src => vendor}/linux/drivers/isdn/mISDN/Kconfig | 0 {src => vendor}/linux/drivers/leds/Kconfig | 0 {src => vendor}/linux/drivers/leds/trigger/Kconfig | 0 {src => vendor}/linux/drivers/lguest/Makefile | 0 {src => vendor}/linux/drivers/lightnvm/Kconfig | 0 {src => vendor}/linux/drivers/macintosh/Kconfig | 0 {src => vendor}/linux/drivers/macintosh/Makefile | 0 {src => vendor}/linux/drivers/mailbox/Kconfig | 0 {src => vendor}/linux/drivers/mcb/Kconfig | 0 {src => vendor}/linux/drivers/md/Kconfig | 0 {src => vendor}/linux/drivers/md/bcache/Kconfig | 0 .../linux/drivers/md/persistent-data/Kconfig | 0 {src => vendor}/linux/drivers/media/Kconfig | 0 {src => vendor}/linux/drivers/media/Makefile | 0 {src => vendor}/linux/drivers/media/common/Kconfig | 0 {src => vendor}/linux/drivers/media/common/Makefile | 0 .../linux/drivers/media/common/b2c2/Kconfig | 0 .../linux/drivers/media/common/b2c2/Makefile | 0 .../linux/drivers/media/common/saa7146/Kconfig | 0 .../linux/drivers/media/common/saa7146/Makefile | 0 .../linux/drivers/media/common/siano/Kconfig | 0 .../linux/drivers/media/common/siano/Makefile | 0 .../linux/drivers/media/common/v4l2-tpg/Kconfig | 0 .../linux/drivers/media/common/v4l2-tpg/Makefile | 0 {src => vendor}/linux/drivers/media/dvb-core/Kconfig | 0 .../linux/drivers/media/dvb-frontends/Kconfig | 0 .../linux/drivers/media/dvb-frontends/drx39xyj/Kconfig | 0 {src => vendor}/linux/drivers/media/firewire/Kconfig | 0 {src => vendor}/linux/drivers/media/firewire/Makefile | 0 {src => vendor}/linux/drivers/media/i2c/Kconfig | 0 {src => vendor}/linux/drivers/media/i2c/Makefile | 0 .../linux/drivers/media/i2c/cx25840/Kconfig | 0 {src => vendor}/linux/drivers/media/i2c/m5mols/Kconfig | 0 {src => vendor}/linux/drivers/media/i2c/smiapp/Kconfig | 0 .../linux/drivers/media/i2c/soc_camera/Kconfig | 0 .../linux/drivers/media/i2c/soc_camera/Makefile | 0 {src => vendor}/linux/drivers/media/mmc/Kconfig | 0 {src => vendor}/linux/drivers/media/mmc/Makefile | 0 {src => vendor}/linux/drivers/media/mmc/siano/Kconfig | 0 {src => vendor}/linux/drivers/media/mmc/siano/Makefile | 0 {src => vendor}/linux/drivers/media/pci/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/Makefile | 0 {src => vendor}/linux/drivers/media/pci/b2c2/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/b2c2/Makefile | 0 {src => vendor}/linux/drivers/media/pci/bt8xx/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/cobalt/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/cx18/Kconfig | 0 .../linux/drivers/media/pci/cx23885/Kconfig | 0 .../linux/drivers/media/pci/cx25821/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/cx88/Kconfig | 0 .../linux/drivers/media/pci/ddbridge/Kconfig | 0 .../linux/drivers/media/pci/ddbridge/Makefile | 0 {src => vendor}/linux/drivers/media/pci/dm1105/Kconfig | 0 .../linux/drivers/media/pci/dm1105/Makefile | 0 {src => vendor}/linux/drivers/media/pci/dt3155/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/ivtv/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/mantis/Kconfig | 0 .../linux/drivers/media/pci/mantis/Makefile | 0 {src => vendor}/linux/drivers/media/pci/meye/Kconfig | 0 .../linux/drivers/media/pci/netup_unidvb/Kconfig | 0 .../linux/drivers/media/pci/netup_unidvb/Makefile | 0 {src => vendor}/linux/drivers/media/pci/ngene/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/ngene/Makefile | 0 {src => vendor}/linux/drivers/media/pci/pluto2/Kconfig | 0 .../linux/drivers/media/pci/pluto2/Makefile | 0 {src => vendor}/linux/drivers/media/pci/pt1/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/pt1/Makefile | 0 {src => vendor}/linux/drivers/media/pci/pt3/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/pt3/Makefile | 0 .../linux/drivers/media/pci/saa7134/Kconfig | 0 .../linux/drivers/media/pci/saa7146/Kconfig | 0 .../linux/drivers/media/pci/saa7146/Makefile | 0 .../linux/drivers/media/pci/saa7164/Kconfig | 0 .../linux/drivers/media/pci/smipcie/Kconfig | 0 .../linux/drivers/media/pci/smipcie/Makefile | 0 .../linux/drivers/media/pci/solo6x10/Kconfig | 0 .../linux/drivers/media/pci/sta2x11/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/ttpci/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/ttpci/Makefile | 0 {src => vendor}/linux/drivers/media/pci/tw5864/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/tw68/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/tw686x/Kconfig | 0 {src => vendor}/linux/drivers/media/pci/zoran/Kconfig | 0 {src => vendor}/linux/drivers/media/platform/Kconfig | 0 {src => vendor}/linux/drivers/media/platform/Makefile | 0 .../linux/drivers/media/platform/am437x/Kconfig | 0 .../linux/drivers/media/platform/atmel/Kconfig | 0 .../linux/drivers/media/platform/blackfin/Kconfig | 0 .../linux/drivers/media/platform/davinci/Kconfig | 0 .../linux/drivers/media/platform/exynos4-is/Kconfig | 0 .../linux/drivers/media/platform/marvell-ccic/Kconfig | 0 .../linux/drivers/media/platform/omap/Kconfig | 0 .../linux/drivers/media/platform/omap/Makefile | 0 .../linux/drivers/media/platform/rcar-vin/Kconfig | 0 .../linux/drivers/media/platform/soc_camera/Kconfig | 0 .../linux/drivers/media/platform/sti/c8sectpfe/Kconfig | 0 .../linux/drivers/media/platform/vivid/Kconfig | 0 .../linux/drivers/media/platform/xilinx/Kconfig | 0 {src => vendor}/linux/drivers/media/radio/Kconfig | 0 .../linux/drivers/media/radio/si470x/Kconfig | 0 .../linux/drivers/media/radio/si4713/Kconfig | 0 .../linux/drivers/media/radio/wl128x/Kconfig | 0 {src => vendor}/linux/drivers/media/rc/Kconfig | 0 {src => vendor}/linux/drivers/media/rc/Makefile | 0 {src => vendor}/linux/drivers/media/rc/img-ir/Kconfig | 0 {src => vendor}/linux/drivers/media/rc/keymaps/Kconfig | 0 .../linux/drivers/media/rc/keymaps/Makefile | 0 {src => vendor}/linux/drivers/media/spi/Kconfig | 0 {src => vendor}/linux/drivers/media/spi/Makefile | 0 {src => vendor}/linux/drivers/media/tuners/Kconfig | 0 {src => vendor}/linux/drivers/media/tuners/Makefile | 0 {src => vendor}/linux/drivers/media/usb/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/Makefile | 0 {src => vendor}/linux/drivers/media/usb/airspy/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/as102/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/au0828/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/b2c2/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/b2c2/Makefile | 0 {src => vendor}/linux/drivers/media/usb/cpia2/Kconfig | 0 .../linux/drivers/media/usb/cx231xx/Kconfig | 0 .../linux/drivers/media/usb/dvb-usb-v2/Kconfig | 0 .../linux/drivers/media/usb/dvb-usb-v2/Makefile | 0 .../linux/drivers/media/usb/dvb-usb/Kconfig | 0 .../linux/drivers/media/usb/dvb-usb/Makefile | 0 {src => vendor}/linux/drivers/media/usb/em28xx/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/go7007/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/gspca/Kconfig | 0 .../linux/drivers/media/usb/gspca/gl860/Kconfig | 0 .../linux/drivers/media/usb/gspca/m5602/Kconfig | 0 .../linux/drivers/media/usb/gspca/stv06xx/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/hackrf/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/hdpvr/Kconfig | 0 .../linux/drivers/media/usb/msi2500/Kconfig | 0 .../linux/drivers/media/usb/pvrusb2/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/pwc/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/s2255/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/s2255/Makefile | 0 {src => vendor}/linux/drivers/media/usb/siano/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/siano/Makefile | 0 .../linux/drivers/media/usb/stk1160/Kconfig | 0 .../linux/drivers/media/usb/stkwebcam/Kconfig | 0 .../linux/drivers/media/usb/stkwebcam/Makefile | 0 {src => vendor}/linux/drivers/media/usb/tm6000/Kconfig | 0 .../linux/drivers/media/usb/ttusb-budget/Kconfig | 0 .../linux/drivers/media/usb/ttusb-budget/Makefile | 0 .../linux/drivers/media/usb/ttusb-dec/Kconfig | 0 .../linux/drivers/media/usb/ttusb-dec/Makefile | 0 {src => vendor}/linux/drivers/media/usb/usbtv/Kconfig | 0 .../linux/drivers/media/usb/usbvision/Kconfig | 0 {src => vendor}/linux/drivers/media/usb/uvc/Kconfig | 0 .../linux/drivers/media/usb/zr364xx/Kconfig | 0 .../linux/drivers/media/usb/zr364xx/Makefile | 0 {src => vendor}/linux/drivers/media/v4l2-core/Kconfig | 0 {src => vendor}/linux/drivers/memory/Kconfig | 0 {src => vendor}/linux/drivers/memory/samsung/Kconfig | 0 {src => vendor}/linux/drivers/memory/tegra/Kconfig | 0 {src => vendor}/linux/drivers/memstick/Kconfig | 0 {src => vendor}/linux/drivers/memstick/core/Kconfig | 0 {src => vendor}/linux/drivers/memstick/host/Kconfig | 0 {src => vendor}/linux/drivers/message/fusion/Kconfig | 0 {src => vendor}/linux/drivers/mfd/Kconfig | 0 {src => vendor}/linux/drivers/mfd/Makefile | 0 {src => vendor}/linux/drivers/misc/Kconfig | 0 {src => vendor}/linux/drivers/misc/Makefile | 0 .../linux/drivers/misc/altera-stapl/Kconfig | 0 {src => vendor}/linux/drivers/misc/c2port/Kconfig | 0 {src => vendor}/linux/drivers/misc/cb710/Kconfig | 0 {src => vendor}/linux/drivers/misc/cb710/Makefile | 0 {src => vendor}/linux/drivers/misc/cxl/Kconfig | 0 {src => vendor}/linux/drivers/misc/echo/Kconfig | 0 {src => vendor}/linux/drivers/misc/eeprom/Kconfig | 0 {src => vendor}/linux/drivers/misc/eeprom/Makefile | 0 {src => vendor}/linux/drivers/misc/genwqe/Kconfig | 0 {src => vendor}/linux/drivers/misc/lis3lv02d/Kconfig | 0 {src => vendor}/linux/drivers/misc/lis3lv02d/Makefile | 0 {src => vendor}/linux/drivers/misc/mei/Kconfig | 0 {src => vendor}/linux/drivers/misc/mic/Kconfig | 0 {src => vendor}/linux/drivers/misc/mic/Makefile | 0 {src => vendor}/linux/drivers/misc/mic/bus/Makefile | 0 {src => vendor}/linux/drivers/misc/ti-st/Kconfig | 0 {src => vendor}/linux/drivers/misc/ti-st/Makefile | 0 {src => vendor}/linux/drivers/misc/vmw_vmci/Kconfig | 0 {src => vendor}/linux/drivers/mmc/Kconfig | 0 {src => vendor}/linux/drivers/mmc/Makefile | 0 {src => vendor}/linux/drivers/mmc/card/Kconfig | 0 {src => vendor}/linux/drivers/mmc/core/Kconfig | 0 {src => vendor}/linux/drivers/mmc/host/Kconfig | 0 {src => vendor}/linux/drivers/mtd/Kconfig | 0 {src => vendor}/linux/drivers/mtd/chips/Kconfig | 0 {src => vendor}/linux/drivers/mtd/devices/Kconfig | 0 {src => vendor}/linux/drivers/mtd/lpddr/Kconfig | 0 {src => vendor}/linux/drivers/mtd/maps/Kconfig | 0 {src => vendor}/linux/drivers/mtd/nand/Kconfig | 0 {src => vendor}/linux/drivers/mtd/onenand/Kconfig | 0 {src => vendor}/linux/drivers/mtd/spi-nor/Kconfig | 0 {src => vendor}/linux/drivers/mtd/ubi/Kconfig | 0 {src => vendor}/linux/drivers/net/Kconfig | 0 {src => vendor}/linux/drivers/net/Makefile | 0 {src => vendor}/linux/drivers/net/Space.c | 0 {src => vendor}/linux/drivers/net/appletalk/Kconfig | 0 {src => vendor}/linux/drivers/net/arcnet/Kconfig | 0 {src => vendor}/linux/drivers/net/caif/Kconfig | 0 {src => vendor}/linux/drivers/net/can/Kconfig | 0 {src => vendor}/linux/drivers/net/can/c_can/Kconfig | 0 {src => vendor}/linux/drivers/net/can/cc770/Kconfig | 0 .../linux/drivers/net/can/ifi_canfd/Kconfig | 0 {src => vendor}/linux/drivers/net/can/m_can/Kconfig | 0 {src => vendor}/linux/drivers/net/can/mscan/Kconfig | 0 {src => vendor}/linux/drivers/net/can/rcar/Kconfig | 0 {src => vendor}/linux/drivers/net/can/sja1000/Kconfig | 0 {src => vendor}/linux/drivers/net/can/softing/Kconfig | 0 {src => vendor}/linux/drivers/net/can/spi/Kconfig | 0 {src => vendor}/linux/drivers/net/can/usb/Kconfig | 0 {src => vendor}/linux/drivers/net/dsa/Kconfig | 0 {src => vendor}/linux/drivers/net/dsa/b53/Kconfig | 0 .../linux/drivers/net/dsa/mv88e6xxx/Kconfig | 0 .../linux/drivers/net/ethernet/3com/Kconfig | 0 .../linux/drivers/net/ethernet/8390/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/Kconfig | 0 .../linux/drivers/net/ethernet/adaptec/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/adi/Kconfig | 0 .../linux/drivers/net/ethernet/aeroflex/Kconfig | 0 .../linux/drivers/net/ethernet/agere/Kconfig | 0 .../linux/drivers/net/ethernet/allwinner/Kconfig | 0 .../linux/drivers/net/ethernet/alteon/Kconfig | 0 .../linux/drivers/net/ethernet/altera/Kconfig | 0 .../linux/drivers/net/ethernet/amazon/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/amd/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/apm/Kconfig | 0 .../linux/drivers/net/ethernet/apm/xgene/Kconfig | 0 .../linux/drivers/net/ethernet/apple/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/arc/Kconfig | 0 .../linux/drivers/net/ethernet/atheros/Kconfig | 0 .../linux/drivers/net/ethernet/aurora/Kconfig | 0 .../linux/drivers/net/ethernet/broadcom/Kconfig | 0 .../linux/drivers/net/ethernet/brocade/Kconfig | 0 .../linux/drivers/net/ethernet/brocade/bna/Kconfig | 0 .../linux/drivers/net/ethernet/cadence/Kconfig | 0 .../linux/drivers/net/ethernet/calxeda/Kconfig | 0 .../linux/drivers/net/ethernet/cavium/Kconfig | 0 .../linux/drivers/net/ethernet/chelsio/Kconfig | 0 .../linux/drivers/net/ethernet/cirrus/Kconfig | 0 .../linux/drivers/net/ethernet/cisco/Kconfig | 0 .../linux/drivers/net/ethernet/cisco/enic/Kconfig | 0 .../linux/drivers/net/ethernet/davicom/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/dec/Kconfig | 0 .../linux/drivers/net/ethernet/dec/tulip/Kconfig | 0 .../linux/drivers/net/ethernet/dlink/Kconfig | 0 .../linux/drivers/net/ethernet/emulex/Kconfig | 0 .../linux/drivers/net/ethernet/emulex/benet/Kconfig | 0 .../linux/drivers/net/ethernet/ezchip/Kconfig | 0 .../linux/drivers/net/ethernet/faraday/Kconfig | 0 .../linux/drivers/net/ethernet/freescale/Kconfig | 0 .../linux/drivers/net/ethernet/freescale/fman/Kconfig | 0 .../drivers/net/ethernet/freescale/fs_enet/Kconfig | 0 .../linux/drivers/net/ethernet/fujitsu/Kconfig | 0 .../linux/drivers/net/ethernet/hisilicon/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/hp/Kconfig | 0 .../linux/drivers/net/ethernet/i825xx/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/ibm/Kconfig | 0 .../linux/drivers/net/ethernet/ibm/emac/Kconfig | 0 .../linux/drivers/net/ethernet/intel/Kconfig | 0 .../linux/drivers/net/ethernet/marvell/Kconfig | 0 .../linux/drivers/net/ethernet/mediatek/Kconfig | 0 .../linux/drivers/net/ethernet/mellanox/Kconfig | 0 .../linux/drivers/net/ethernet/mellanox/mlx4/Kconfig | 0 .../drivers/net/ethernet/mellanox/mlx5/core/Kconfig | 0 .../linux/drivers/net/ethernet/mellanox/mlxsw/Kconfig | 0 .../linux/drivers/net/ethernet/micrel/Kconfig | 0 .../linux/drivers/net/ethernet/microchip/Kconfig | 0 .../linux/drivers/net/ethernet/moxa/Kconfig | 0 .../linux/drivers/net/ethernet/myricom/Kconfig | 0 .../linux/drivers/net/ethernet/natsemi/Kconfig | 0 .../linux/drivers/net/ethernet/neterion/Kconfig | 0 .../linux/drivers/net/ethernet/netronome/Kconfig | 0 .../linux/drivers/net/ethernet/nuvoton/Kconfig | 0 .../linux/drivers/net/ethernet/nvidia/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/nxp/Kconfig | 0 .../linux/drivers/net/ethernet/oki-semi/Kconfig | 0 .../drivers/net/ethernet/oki-semi/pch_gbe/Kconfig | 0 .../linux/drivers/net/ethernet/packetengines/Kconfig | 0 .../linux/drivers/net/ethernet/pasemi/Kconfig | 0 .../linux/drivers/net/ethernet/qlogic/Kconfig | 0 .../linux/drivers/net/ethernet/qualcomm/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/rdc/Kconfig | 0 .../linux/drivers/net/ethernet/realtek/Kconfig | 0 .../linux/drivers/net/ethernet/renesas/Kconfig | 0 .../linux/drivers/net/ethernet/rocker/Kconfig | 0 .../linux/drivers/net/ethernet/samsung/Kconfig | 0 .../linux/drivers/net/ethernet/seeq/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/sfc/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/sgi/Kconfig | 0 .../linux/drivers/net/ethernet/silan/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/sis/Kconfig | 0 .../linux/drivers/net/ethernet/smsc/Kconfig | 0 .../linux/drivers/net/ethernet/stmicro/Kconfig | 0 .../linux/drivers/net/ethernet/stmicro/stmmac/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/sun/Kconfig | 0 .../linux/drivers/net/ethernet/synopsys/Kconfig | 0 .../linux/drivers/net/ethernet/tehuti/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/ti/Kconfig | 0 .../linux/drivers/net/ethernet/tile/Kconfig | 0 .../linux/drivers/net/ethernet/toshiba/Kconfig | 0 .../linux/drivers/net/ethernet/tundra/Kconfig | 0 {src => vendor}/linux/drivers/net/ethernet/via/Kconfig | 0 .../linux/drivers/net/ethernet/wiznet/Kconfig | 0 .../linux/drivers/net/ethernet/xilinx/Kconfig | 0 .../linux/drivers/net/ethernet/xircom/Kconfig | 0 .../linux/drivers/net/ethernet/xscale/Kconfig | 0 {src => vendor}/linux/drivers/net/fddi/Kconfig | 0 {src => vendor}/linux/drivers/net/hamradio/Kconfig | 0 {src => vendor}/linux/drivers/net/hippi/Kconfig | 0 {src => vendor}/linux/drivers/net/hyperv/Kconfig | 0 {src => vendor}/linux/drivers/net/ieee802154/Kconfig | 0 {src => vendor}/linux/drivers/net/irda/Kconfig | 0 {src => vendor}/linux/drivers/net/loopback.c | 0 {src => vendor}/linux/drivers/net/phy/Kconfig | 0 {src => vendor}/linux/drivers/net/plip/Kconfig | 0 {src => vendor}/linux/drivers/net/ppp/Kconfig | 0 {src => vendor}/linux/drivers/net/slip/Kconfig | 0 {src => vendor}/linux/drivers/net/team/Kconfig | 0 {src => vendor}/linux/drivers/net/usb/Kconfig | 0 {src => vendor}/linux/drivers/net/virtio_net.c | 0 {src => vendor}/linux/drivers/net/wan/.gitignore | 0 {src => vendor}/linux/drivers/net/wan/Kconfig | 0 {src => vendor}/linux/drivers/net/wimax/Kconfig | 0 {src => vendor}/linux/drivers/net/wimax/i2400m/Kconfig | 0 {src => vendor}/linux/drivers/net/wireless/Kconfig | 0 .../linux/drivers/net/wireless/admtek/Kconfig | 0 {src => vendor}/linux/drivers/net/wireless/ath/Kconfig | 0 .../linux/drivers/net/wireless/ath/ar5523/Kconfig | 0 .../linux/drivers/net/wireless/ath/ath10k/Kconfig | 0 .../linux/drivers/net/wireless/ath/ath5k/Kconfig | 0 .../linux/drivers/net/wireless/ath/ath6kl/Kconfig | 0 .../linux/drivers/net/wireless/ath/ath9k/Kconfig | 0 .../linux/drivers/net/wireless/ath/carl9170/Kconfig | 0 .../linux/drivers/net/wireless/ath/wcn36xx/Kconfig | 0 .../linux/drivers/net/wireless/ath/wil6210/Kconfig | 0 .../linux/drivers/net/wireless/atmel/Kconfig | 0 .../linux/drivers/net/wireless/broadcom/Kconfig | 0 .../linux/drivers/net/wireless/broadcom/b43/Kconfig | 0 .../drivers/net/wireless/broadcom/b43legacy/Kconfig | 0 .../drivers/net/wireless/broadcom/brcm80211/Kconfig | 0 .../linux/drivers/net/wireless/cisco/Kconfig | 0 .../linux/drivers/net/wireless/intel/Kconfig | 0 .../linux/drivers/net/wireless/intel/ipw2x00/Kconfig | 0 .../linux/drivers/net/wireless/intel/iwlegacy/Kconfig | 0 .../linux/drivers/net/wireless/intel/iwlwifi/Kconfig | 0 .../linux/drivers/net/wireless/intersil/Kconfig | 0 .../linux/drivers/net/wireless/intersil/hostap/Kconfig | 0 .../drivers/net/wireless/intersil/orinoco/Kconfig | 0 .../linux/drivers/net/wireless/intersil/p54/Kconfig | 0 .../linux/drivers/net/wireless/marvell/Kconfig | 0 .../drivers/net/wireless/marvell/libertas/Kconfig | 0 .../drivers/net/wireless/marvell/libertas_tf/Kconfig | 0 .../linux/drivers/net/wireless/marvell/mwifiex/Kconfig | 0 .../linux/drivers/net/wireless/mediatek/Kconfig | 0 .../drivers/net/wireless/mediatek/mt7601u/Kconfig | 0 .../linux/drivers/net/wireless/ralink/Kconfig | 0 .../linux/drivers/net/wireless/ralink/rt2x00/Kconfig | 0 .../linux/drivers/net/wireless/realtek/Kconfig | 0 .../linux/drivers/net/wireless/realtek/rtl818x/Kconfig | 0 .../drivers/net/wireless/realtek/rtl8xxxu/Kconfig | 0 .../linux/drivers/net/wireless/realtek/rtlwifi/Kconfig | 0 {src => vendor}/linux/drivers/net/wireless/rsi/Kconfig | 0 {src => vendor}/linux/drivers/net/wireless/st/Kconfig | 0 .../linux/drivers/net/wireless/st/cw1200/Kconfig | 0 {src => vendor}/linux/drivers/net/wireless/ti/Kconfig | 0 .../linux/drivers/net/wireless/ti/wl1251/Kconfig | 0 .../linux/drivers/net/wireless/ti/wl12xx/Kconfig | 0 .../linux/drivers/net/wireless/ti/wl18xx/Kconfig | 0 .../linux/drivers/net/wireless/ti/wlcore/Kconfig | 0 .../linux/drivers/net/wireless/zydas/Kconfig | 0 .../linux/drivers/net/wireless/zydas/zd1211rw/Kconfig | 0 {src => vendor}/linux/drivers/nfc/Kconfig | 0 {src => vendor}/linux/drivers/nfc/Makefile | 0 {src => vendor}/linux/drivers/nfc/fdp/Kconfig | 0 {src => vendor}/linux/drivers/nfc/microread/Kconfig | 0 {src => vendor}/linux/drivers/nfc/nfcmrvl/Kconfig | 0 {src => vendor}/linux/drivers/nfc/nxp-nci/Kconfig | 0 {src => vendor}/linux/drivers/nfc/pn533/Kconfig | 0 {src => vendor}/linux/drivers/nfc/pn544/Kconfig | 0 {src => vendor}/linux/drivers/nfc/s3fwrn5/Kconfig | 0 {src => vendor}/linux/drivers/nfc/st-nci/Kconfig | 0 {src => vendor}/linux/drivers/nfc/st21nfca/Kconfig | 0 {src => vendor}/linux/drivers/nfc/st95hf/Kconfig | 0 {src => vendor}/linux/drivers/ntb/Kconfig | 0 {src => vendor}/linux/drivers/ntb/hw/Kconfig | 0 {src => vendor}/linux/drivers/ntb/hw/amd/Kconfig | 0 {src => vendor}/linux/drivers/ntb/hw/intel/Kconfig | 0 {src => vendor}/linux/drivers/ntb/test/Kconfig | 0 {src => vendor}/linux/drivers/nvdimm/Kconfig | 0 {src => vendor}/linux/drivers/nvme/Kconfig | 0 {src => vendor}/linux/drivers/nvme/Makefile | 0 {src => vendor}/linux/drivers/nvme/host/Kconfig | 0 {src => vendor}/linux/drivers/nvme/host/Makefile | 0 {src => vendor}/linux/drivers/nvme/target/Kconfig | 0 {src => vendor}/linux/drivers/nvme/target/Makefile | 0 {src => vendor}/linux/drivers/nvmem/Kconfig | 0 {src => vendor}/linux/drivers/of/Kconfig | 0 .../linux/drivers/of/unittest-data/.gitignore | 0 {src => vendor}/linux/drivers/parport/Kconfig | 0 {src => vendor}/linux/drivers/perf/Kconfig | 0 {src => vendor}/linux/drivers/phy/Kconfig | 0 {src => vendor}/linux/drivers/phy/tegra/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/aspeed/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/bcm/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/berlin/Kconfig | 0 .../linux/drivers/pinctrl/freescale/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/intel/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/mediatek/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/mvebu/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/nomadik/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/pxa/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/qcom/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/samsung/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/sh-pfc/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/spear/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/stm32/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/sunxi/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/tegra/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/uniphier/Kconfig | 0 {src => vendor}/linux/drivers/pinctrl/vt8500/Kconfig | 0 {src => vendor}/linux/drivers/platform/Kconfig | 0 {src => vendor}/linux/drivers/platform/Makefile | 0 {src => vendor}/linux/drivers/platform/chrome/Kconfig | 0 .../linux/drivers/platform/goldfish/Kconfig | 0 {src => vendor}/linux/drivers/platform/mips/Kconfig | 0 {src => vendor}/linux/drivers/platform/x86/Kconfig | 0 {src => vendor}/linux/drivers/pnp/Kconfig | 0 {src => vendor}/linux/drivers/pnp/isapnp/Kconfig | 0 {src => vendor}/linux/drivers/pnp/pnpacpi/Kconfig | 0 {src => vendor}/linux/drivers/pnp/pnpbios/Kconfig | 0 {src => vendor}/linux/drivers/power/Kconfig | 0 {src => vendor}/linux/drivers/power/Makefile | 0 {src => vendor}/linux/drivers/power/avs/Kconfig | 0 {src => vendor}/linux/drivers/power/reset/Kconfig | 0 {src => vendor}/linux/drivers/power/supply/Kconfig | 0 {src => vendor}/linux/drivers/powercap/Kconfig | 0 {src => vendor}/linux/drivers/pps/Kconfig | 0 {src => vendor}/linux/drivers/pps/clients/Kconfig | 0 {src => vendor}/linux/drivers/pps/generators/Kconfig | 0 {src => vendor}/linux/drivers/ptp/Kconfig | 0 {src => vendor}/linux/drivers/pwm/Kconfig | 0 {src => vendor}/linux/drivers/pwm/Makefile | 0 {src => vendor}/linux/drivers/ras/Kconfig | 0 {src => vendor}/linux/drivers/regulator/Kconfig | 0 {src => vendor}/linux/drivers/remoteproc/Kconfig | 0 {src => vendor}/linux/drivers/reset/Kconfig | 0 {src => vendor}/linux/drivers/reset/hisilicon/Kconfig | 0 {src => vendor}/linux/drivers/reset/sti/Kconfig | 0 {src => vendor}/linux/drivers/rpmsg/Kconfig | 0 {src => vendor}/linux/drivers/rtc/Kconfig | 0 {src => vendor}/linux/drivers/s390/block/Kconfig | 0 {src => vendor}/linux/drivers/s390/char/Kconfig | 0 {src => vendor}/linux/drivers/s390/net/Kconfig | 0 {src => vendor}/linux/drivers/scsi/.gitignore | 0 {src => vendor}/linux/drivers/scsi/Kconfig | 0 {src => vendor}/linux/drivers/scsi/aic7xxx/.gitignore | 0 .../linux/drivers/scsi/aic7xxx/Kconfig.aic79xx | 0 .../linux/drivers/scsi/aic7xxx/Kconfig.aic7xxx | 0 {src => vendor}/linux/drivers/scsi/aic94xx/Kconfig | 0 {src => vendor}/linux/drivers/scsi/arm/Kconfig | 0 {src => vendor}/linux/drivers/scsi/be2iscsi/Kconfig | 0 {src => vendor}/linux/drivers/scsi/bnx2fc/Kconfig | 0 {src => vendor}/linux/drivers/scsi/bnx2i/Kconfig | 0 {src => vendor}/linux/drivers/scsi/csiostor/Kconfig | 0 {src => vendor}/linux/drivers/scsi/cxgbi/Kconfig | 0 .../linux/drivers/scsi/cxgbi/cxgb3i/Kconfig | 0 .../linux/drivers/scsi/cxgbi/cxgb4i/Kconfig | 0 {src => vendor}/linux/drivers/scsi/cxlflash/Kconfig | 0 .../linux/drivers/scsi/device_handler/Kconfig | 0 {src => vendor}/linux/drivers/scsi/esas2r/Kconfig | 0 {src => vendor}/linux/drivers/scsi/hisi_sas/Kconfig | 0 {src => vendor}/linux/drivers/scsi/libsas/Kconfig | 0 .../linux/drivers/scsi/megaraid/Kconfig.megaraid | 0 {src => vendor}/linux/drivers/scsi/mpt3sas/Kconfig | 0 {src => vendor}/linux/drivers/scsi/mvsas/Kconfig | 0 {src => vendor}/linux/drivers/scsi/osd/Kconfig | 0 {src => vendor}/linux/drivers/scsi/pcmcia/Kconfig | 0 {src => vendor}/linux/drivers/scsi/qla2xxx/Kconfig | 0 {src => vendor}/linux/drivers/scsi/qla4xxx/Kconfig | 0 {src => vendor}/linux/drivers/scsi/smartpqi/Kconfig | 0 {src => vendor}/linux/drivers/scsi/ufs/Kconfig | 0 {src => vendor}/linux/drivers/soc/Kconfig | 0 {src => vendor}/linux/drivers/soc/Makefile | 0 {src => vendor}/linux/drivers/soc/bcm/Kconfig | 0 {src => vendor}/linux/drivers/soc/bcm/Makefile | 0 {src => vendor}/linux/drivers/soc/fsl/Makefile | 0 {src => vendor}/linux/drivers/soc/fsl/qbman/Kconfig | 0 {src => vendor}/linux/drivers/soc/fsl/qe/Kconfig | 0 {src => vendor}/linux/drivers/soc/mediatek/Kconfig | 0 {src => vendor}/linux/drivers/soc/qcom/Kconfig | 0 {src => vendor}/linux/drivers/soc/rockchip/Kconfig | 0 {src => vendor}/linux/drivers/soc/samsung/Kconfig | 0 {src => vendor}/linux/drivers/soc/sunxi/Kconfig | 0 {src => vendor}/linux/drivers/soc/tegra/Kconfig | 0 {src => vendor}/linux/drivers/soc/ti/Kconfig | 0 {src => vendor}/linux/drivers/soc/ux500/Kconfig | 0 {src => vendor}/linux/drivers/soc/versatile/Kconfig | 0 {src => vendor}/linux/drivers/spi/Kconfig | 0 {src => vendor}/linux/drivers/spmi/Kconfig | 0 {src => vendor}/linux/drivers/ssb/Kconfig | 0 {src => vendor}/linux/drivers/staging/Kconfig | 0 {src => vendor}/linux/drivers/staging/android/Kconfig | 0 .../linux/drivers/staging/android/ion/Kconfig | 0 .../drivers/staging/android/ion/hisilicon/Kconfig | 0 {src => vendor}/linux/drivers/staging/board/Kconfig | 0 .../linux/drivers/staging/clocking-wizard/Kconfig | 0 {src => vendor}/linux/drivers/staging/comedi/Kconfig | 0 {src => vendor}/linux/drivers/staging/dgnc/Kconfig | 0 {src => vendor}/linux/drivers/staging/emxx_udc/Kconfig | 0 {src => vendor}/linux/drivers/staging/fbtft/Kconfig | 0 {src => vendor}/linux/drivers/staging/fsl-mc/Kconfig | 0 .../linux/drivers/staging/fsl-mc/bus/Kconfig | 0 {src => vendor}/linux/drivers/staging/fwserial/Kconfig | 0 {src => vendor}/linux/drivers/staging/gdm724x/Kconfig | 0 {src => vendor}/linux/drivers/staging/goldfish/Kconfig | 0 {src => vendor}/linux/drivers/staging/greybus/Kconfig | 0 .../linux/drivers/staging/greybus/tools/.gitignore | 0 .../linux/drivers/staging/gs_fpgaboot/Kconfig | 0 {src => vendor}/linux/drivers/staging/i4l/Kconfig | 0 .../linux/drivers/staging/i4l/act2000/Kconfig | 0 {src => vendor}/linux/drivers/staging/i4l/icn/Kconfig | 0 .../linux/drivers/staging/i4l/pcbit/Kconfig | 0 {src => vendor}/linux/drivers/staging/iio/Kconfig | 0 .../linux/drivers/staging/iio/accel/Kconfig | 0 {src => vendor}/linux/drivers/staging/iio/adc/Kconfig | 0 .../linux/drivers/staging/iio/addac/Kconfig | 0 {src => vendor}/linux/drivers/staging/iio/cdc/Kconfig | 0 .../linux/drivers/staging/iio/frequency/Kconfig | 0 {src => vendor}/linux/drivers/staging/iio/gyro/Kconfig | 0 .../drivers/staging/iio/impedance-analyzer/Kconfig | 0 .../linux/drivers/staging/iio/light/Kconfig | 0 .../linux/drivers/staging/iio/meter/Kconfig | 0 .../linux/drivers/staging/iio/resolver/Kconfig | 0 .../linux/drivers/staging/iio/trigger/Kconfig | 0 {src => vendor}/linux/drivers/staging/ks7010/Kconfig | 0 {src => vendor}/linux/drivers/staging/lustre/Kconfig | 0 .../linux/drivers/staging/lustre/lnet/Kconfig | 0 .../linux/drivers/staging/lustre/lustre/Kconfig | 0 {src => vendor}/linux/drivers/staging/media/Kconfig | 0 .../linux/drivers/staging/media/bcm2048/Kconfig | 0 .../linux/drivers/staging/media/cec/Kconfig | 0 .../linux/drivers/staging/media/cxd2099/Kconfig | 0 .../linux/drivers/staging/media/davinci_vpfe/Kconfig | 0 .../linux/drivers/staging/media/lirc/Kconfig | 0 .../linux/drivers/staging/media/omap4iss/Kconfig | 0 .../linux/drivers/staging/media/pulse8-cec/Kconfig | 0 .../linux/drivers/staging/media/s5p-cec/Kconfig | 0 .../linux/drivers/staging/media/st-cec/Kconfig | 0 {src => vendor}/linux/drivers/staging/most/Kconfig | 0 .../linux/drivers/staging/most/aim-cdev/Kconfig | 0 .../linux/drivers/staging/most/aim-network/Kconfig | 0 .../linux/drivers/staging/most/aim-sound/Kconfig | 0 .../linux/drivers/staging/most/aim-v4l2/Kconfig | 0 .../linux/drivers/staging/most/hdm-dim2/Kconfig | 0 .../linux/drivers/staging/most/hdm-i2c/Kconfig | 0 .../linux/drivers/staging/most/hdm-usb/Kconfig | 0 .../linux/drivers/staging/most/mostcore/Kconfig | 0 .../linux/drivers/staging/mt29f_spinand/Kconfig | 0 {src => vendor}/linux/drivers/staging/netlogic/Kconfig | 0 {src => vendor}/linux/drivers/staging/nvec/Kconfig | 0 .../linux/drivers/staging/octeon-usb/Kconfig | 0 {src => vendor}/linux/drivers/staging/octeon/Kconfig | 0 .../linux/drivers/staging/olpc_dcon/Kconfig | 0 .../linux/drivers/staging/rtl8188eu/Kconfig | 0 {src => vendor}/linux/drivers/staging/rtl8192e/Kconfig | 0 .../linux/drivers/staging/rtl8192e/rtl8192e/Kconfig | 0 {src => vendor}/linux/drivers/staging/rtl8192u/Kconfig | 0 {src => vendor}/linux/drivers/staging/rtl8712/Kconfig | 0 {src => vendor}/linux/drivers/staging/rts5208/Kconfig | 0 {src => vendor}/linux/drivers/staging/skein/Kconfig | 0 {src => vendor}/linux/drivers/staging/slicoss/Kconfig | 0 {src => vendor}/linux/drivers/staging/sm750fb/Kconfig | 0 {src => vendor}/linux/drivers/staging/speakup/Kconfig | 0 {src => vendor}/linux/drivers/staging/unisys/Kconfig | 0 .../linux/drivers/staging/unisys/visorbus/Kconfig | 0 .../linux/drivers/staging/unisys/visorhba/Kconfig | 0 .../linux/drivers/staging/unisys/visorinput/Kconfig | 0 .../linux/drivers/staging/unisys/visornic/Kconfig | 0 .../linux/drivers/staging/vc04_services/Kconfig | 0 .../linux/drivers/staging/vme/devices/Kconfig | 0 {src => vendor}/linux/drivers/staging/vt6655/Kconfig | 0 {src => vendor}/linux/drivers/staging/vt6656/Kconfig | 0 {src => vendor}/linux/drivers/staging/wilc1000/Kconfig | 0 {src => vendor}/linux/drivers/staging/wlan-ng/Kconfig | 0 {src => vendor}/linux/drivers/staging/xgifb/Kconfig | 0 {src => vendor}/linux/drivers/target/Kconfig | 0 {src => vendor}/linux/drivers/target/iscsi/Kconfig | 0 .../linux/drivers/target/iscsi/cxgbit/Kconfig | 0 {src => vendor}/linux/drivers/target/loopback/Kconfig | 0 {src => vendor}/linux/drivers/target/sbp/Kconfig | 0 {src => vendor}/linux/drivers/target/tcm_fc/Kconfig | 0 {src => vendor}/linux/drivers/thermal/Kconfig | 0 .../linux/drivers/thermal/int340x_thermal/Kconfig | 0 {src => vendor}/linux/drivers/thermal/qcom/Kconfig | 0 {src => vendor}/linux/drivers/thermal/samsung/Kconfig | 0 {src => vendor}/linux/drivers/thermal/st/Kconfig | 0 {src => vendor}/linux/drivers/thermal/tegra/Kconfig | 0 .../linux/drivers/thermal/ti-soc-thermal/Kconfig | 0 {src => vendor}/linux/drivers/thunderbolt/Kconfig | 0 {src => vendor}/linux/drivers/tty/Kconfig | 0 {src => vendor}/linux/drivers/tty/Makefile | 0 {src => vendor}/linux/drivers/tty/hvc/Kconfig | 0 {src => vendor}/linux/drivers/tty/ipwireless/Makefile | 0 {src => vendor}/linux/drivers/tty/n_tty.c | 0 {src => vendor}/linux/drivers/tty/pty.c | 0 {src => vendor}/linux/drivers/tty/serial/8250/Kconfig | 0 {src => vendor}/linux/drivers/tty/serial/Kconfig | 0 {src => vendor}/linux/drivers/tty/serial/Makefile | 0 {src => vendor}/linux/drivers/tty/tty_buffer.c | 0 {src => vendor}/linux/drivers/tty/tty_io.c | 0 {src => vendor}/linux/drivers/tty/tty_ioctl.c | 0 {src => vendor}/linux/drivers/tty/tty_ldisc.c | 0 {src => vendor}/linux/drivers/tty/tty_ldsem.c | 0 {src => vendor}/linux/drivers/tty/tty_mutex.c | 0 {src => vendor}/linux/drivers/tty/tty_port.c | 0 {src => vendor}/linux/drivers/tty/vt/.gitignore | 0 {src => vendor}/linux/drivers/tty/vt/Makefile | 0 {src => vendor}/linux/drivers/uio/Kconfig | 0 {src => vendor}/linux/drivers/usb/Kconfig | 0 {src => vendor}/linux/drivers/usb/atm/Kconfig | 0 {src => vendor}/linux/drivers/usb/chipidea/Kconfig | 0 {src => vendor}/linux/drivers/usb/class/Kconfig | 0 {src => vendor}/linux/drivers/usb/core/Kconfig | 0 {src => vendor}/linux/drivers/usb/dwc2/Kconfig | 0 {src => vendor}/linux/drivers/usb/dwc3/Kconfig | 0 {src => vendor}/linux/drivers/usb/gadget/Kconfig | 0 .../linux/drivers/usb/gadget/legacy/Kconfig | 0 {src => vendor}/linux/drivers/usb/gadget/udc/Kconfig | 0 .../linux/drivers/usb/gadget/udc/bdc/Kconfig | 0 {src => vendor}/linux/drivers/usb/host/Kconfig | 0 {src => vendor}/linux/drivers/usb/image/Kconfig | 0 {src => vendor}/linux/drivers/usb/isp1760/Kconfig | 0 {src => vendor}/linux/drivers/usb/misc/Kconfig | 0 .../linux/drivers/usb/misc/sisusbvga/Kconfig | 0 {src => vendor}/linux/drivers/usb/mon/Kconfig | 0 {src => vendor}/linux/drivers/usb/musb/Kconfig | 0 {src => vendor}/linux/drivers/usb/phy/Kconfig | 0 .../linux/drivers/usb/renesas_usbhs/Kconfig | 0 {src => vendor}/linux/drivers/usb/serial/Kconfig | 0 {src => vendor}/linux/drivers/usb/storage/Kconfig | 0 {src => vendor}/linux/drivers/usb/usbip/Kconfig | 0 {src => vendor}/linux/drivers/usb/wusbcore/Kconfig | 0 {src => vendor}/linux/drivers/uwb/Kconfig | 0 {src => vendor}/linux/drivers/vfio/Kconfig | 0 {src => vendor}/linux/drivers/vfio/pci/Kconfig | 0 {src => vendor}/linux/drivers/vfio/platform/Kconfig | 0 .../linux/drivers/vfio/platform/reset/Kconfig | 0 {src => vendor}/linux/drivers/vhost/Kconfig.vringh | 0 {src => vendor}/linux/drivers/video/Kconfig | 0 {src => vendor}/linux/drivers/video/Makefile | 0 {src => vendor}/linux/drivers/video/backlight/Kconfig | 0 {src => vendor}/linux/drivers/video/backlight/Makefile | 0 {src => vendor}/linux/drivers/video/console/Kconfig | 0 {src => vendor}/linux/drivers/video/fbdev/Kconfig | 0 {src => vendor}/linux/drivers/video/fbdev/Makefile | 0 .../linux/drivers/video/fbdev/core/Makefile | 0 .../linux/drivers/video/fbdev/geode/Kconfig | 0 {src => vendor}/linux/drivers/video/fbdev/mmp/Kconfig | 0 .../linux/drivers/video/fbdev/mmp/fb/Kconfig | 0 .../linux/drivers/video/fbdev/mmp/hw/Kconfig | 0 .../linux/drivers/video/fbdev/mmp/panel/Kconfig | 0 {src => vendor}/linux/drivers/video/fbdev/omap/Kconfig | 0 .../linux/drivers/video/fbdev/omap2/Kconfig | 0 .../linux/drivers/video/fbdev/omap2/Makefile | 0 .../linux/drivers/video/fbdev/omap2/omapfb/Kconfig | 0 .../linux/drivers/video/fbdev/omap2/omapfb/Makefile | 0 .../drivers/video/fbdev/omap2/omapfb/displays/Kconfig | 0 .../drivers/video/fbdev/omap2/omapfb/displays/Makefile | 0 .../linux/drivers/video/fbdev/omap2/omapfb/dss/Kconfig | 0 .../drivers/video/fbdev/omap2/omapfb/dss/Makefile | 0 {src => vendor}/linux/drivers/video/logo/.gitignore | 0 {src => vendor}/linux/drivers/video/logo/Kconfig | 0 {src => vendor}/linux/drivers/virt/Kconfig | 0 {src => vendor}/linux/drivers/virtio/Kconfig | 0 {src => vendor}/linux/drivers/virtio/Makefile | 0 {src => vendor}/linux/drivers/virtio/virtio.c | 0 {src => vendor}/linux/drivers/virtio/virtio_mmio.c | 0 {src => vendor}/linux/drivers/virtio/virtio_ring.c | 0 {src => vendor}/linux/drivers/vlynq/Kconfig | 0 {src => vendor}/linux/drivers/vme/Kconfig | 0 {src => vendor}/linux/drivers/vme/boards/Kconfig | 0 {src => vendor}/linux/drivers/vme/bridges/Kconfig | 0 {src => vendor}/linux/drivers/w1/Kconfig | 0 {src => vendor}/linux/drivers/w1/masters/Kconfig | 0 {src => vendor}/linux/drivers/w1/slaves/Kconfig | 0 {src => vendor}/linux/drivers/watchdog/Kconfig | 0 {src => vendor}/linux/drivers/xen/Kconfig | 0 {src => vendor}/linux/drivers/zorro/.gitignore | 0 {src => vendor}/linux/firmware/.gitignore | 0 {src => vendor}/linux/firmware/Makefile | 0 {src => vendor}/linux/firmware/cis/.gitignore | 0 {src => vendor}/linux/fs/9p/Kconfig | 0 {src => vendor}/linux/fs/Kconfig | 0 {src => vendor}/linux/fs/Makefile | 0 {src => vendor}/linux/fs/adfs/Kconfig | 0 {src => vendor}/linux/fs/affs/Kconfig | 0 {src => vendor}/linux/fs/afs/Kconfig | 0 {src => vendor}/linux/fs/anon_inodes.c | 0 {src => vendor}/linux/fs/attr.c | 0 {src => vendor}/linux/fs/autofs4/Kconfig | 0 {src => vendor}/linux/fs/bad_inode.c | 0 {src => vendor}/linux/fs/befs/Kconfig | 0 {src => vendor}/linux/fs/bfs/Kconfig | 0 {src => vendor}/linux/fs/block_dev.c | 0 {src => vendor}/linux/fs/btrfs/Kconfig | 0 {src => vendor}/linux/fs/btrfs/Makefile | 0 {src => vendor}/linux/fs/btrfs/acl.c | 0 {src => vendor}/linux/fs/btrfs/async-thread.c | 0 {src => vendor}/linux/fs/btrfs/async-thread.h | 0 {src => vendor}/linux/fs/btrfs/backref.c | 0 {src => vendor}/linux/fs/btrfs/backref.h | 0 {src => vendor}/linux/fs/btrfs/btrfs_inode.h | 0 {src => vendor}/linux/fs/btrfs/check-integrity.h | 0 {src => vendor}/linux/fs/btrfs/compression.c | 0 {src => vendor}/linux/fs/btrfs/compression.h | 0 {src => vendor}/linux/fs/btrfs/ctree.c | 0 {src => vendor}/linux/fs/btrfs/ctree.h | 0 {src => vendor}/linux/fs/btrfs/dedupe.h | 0 {src => vendor}/linux/fs/btrfs/delayed-inode.c | 0 {src => vendor}/linux/fs/btrfs/delayed-inode.h | 0 {src => vendor}/linux/fs/btrfs/delayed-ref.c | 0 {src => vendor}/linux/fs/btrfs/delayed-ref.h | 0 {src => vendor}/linux/fs/btrfs/dev-replace.c | 0 {src => vendor}/linux/fs/btrfs/dev-replace.h | 0 {src => vendor}/linux/fs/btrfs/dir-item.c | 0 {src => vendor}/linux/fs/btrfs/disk-io.c | 0 {src => vendor}/linux/fs/btrfs/disk-io.h | 0 {src => vendor}/linux/fs/btrfs/export.c | 0 {src => vendor}/linux/fs/btrfs/export.h | 0 {src => vendor}/linux/fs/btrfs/extent-tree.c | 0 {src => vendor}/linux/fs/btrfs/extent_io.c | 0 {src => vendor}/linux/fs/btrfs/extent_io.h | 0 {src => vendor}/linux/fs/btrfs/extent_map.c | 0 {src => vendor}/linux/fs/btrfs/extent_map.h | 0 {src => vendor}/linux/fs/btrfs/file-item.c | 0 {src => vendor}/linux/fs/btrfs/file.c | 0 {src => vendor}/linux/fs/btrfs/free-space-cache.c | 0 {src => vendor}/linux/fs/btrfs/free-space-cache.h | 0 {src => vendor}/linux/fs/btrfs/free-space-tree.c | 0 {src => vendor}/linux/fs/btrfs/free-space-tree.h | 0 {src => vendor}/linux/fs/btrfs/hash.c | 0 {src => vendor}/linux/fs/btrfs/hash.h | 0 {src => vendor}/linux/fs/btrfs/inode-item.c | 0 {src => vendor}/linux/fs/btrfs/inode-map.c | 0 {src => vendor}/linux/fs/btrfs/inode-map.h | 0 {src => vendor}/linux/fs/btrfs/inode.c | 0 {src => vendor}/linux/fs/btrfs/ioctl.c | 0 {src => vendor}/linux/fs/btrfs/locking.c | 0 {src => vendor}/linux/fs/btrfs/locking.h | 0 {src => vendor}/linux/fs/btrfs/lzo.c | 0 {src => vendor}/linux/fs/btrfs/math.h | 0 {src => vendor}/linux/fs/btrfs/ordered-data.c | 0 {src => vendor}/linux/fs/btrfs/ordered-data.h | 0 {src => vendor}/linux/fs/btrfs/orphan.c | 0 {src => vendor}/linux/fs/btrfs/print-tree.c | 0 {src => vendor}/linux/fs/btrfs/print-tree.h | 0 {src => vendor}/linux/fs/btrfs/props.c | 0 {src => vendor}/linux/fs/btrfs/props.h | 0 {src => vendor}/linux/fs/btrfs/qgroup.c | 0 {src => vendor}/linux/fs/btrfs/qgroup.h | 0 {src => vendor}/linux/fs/btrfs/raid56.c | 0 {src => vendor}/linux/fs/btrfs/raid56.h | 0 {src => vendor}/linux/fs/btrfs/rcu-string.h | 0 {src => vendor}/linux/fs/btrfs/reada.c | 0 {src => vendor}/linux/fs/btrfs/relocation.c | 0 {src => vendor}/linux/fs/btrfs/root-tree.c | 0 {src => vendor}/linux/fs/btrfs/scrub.c | 0 {src => vendor}/linux/fs/btrfs/send.c | 0 {src => vendor}/linux/fs/btrfs/send.h | 0 {src => vendor}/linux/fs/btrfs/struct-funcs.c | 0 {src => vendor}/linux/fs/btrfs/super.c | 0 {src => vendor}/linux/fs/btrfs/sysfs.c | 0 {src => vendor}/linux/fs/btrfs/sysfs.h | 0 {src => vendor}/linux/fs/btrfs/tests/btrfs-tests.h | 0 {src => vendor}/linux/fs/btrfs/transaction.c | 0 {src => vendor}/linux/fs/btrfs/transaction.h | 0 {src => vendor}/linux/fs/btrfs/tree-defrag.c | 0 {src => vendor}/linux/fs/btrfs/tree-log.c | 0 {src => vendor}/linux/fs/btrfs/tree-log.h | 0 {src => vendor}/linux/fs/btrfs/ulist.c | 0 {src => vendor}/linux/fs/btrfs/ulist.h | 0 {src => vendor}/linux/fs/btrfs/uuid-tree.c | 0 {src => vendor}/linux/fs/btrfs/volumes.c | 0 {src => vendor}/linux/fs/btrfs/volumes.h | 0 {src => vendor}/linux/fs/btrfs/xattr.c | 0 {src => vendor}/linux/fs/btrfs/xattr.h | 0 {src => vendor}/linux/fs/btrfs/zlib.c | 0 {src => vendor}/linux/fs/buffer.c | 0 {src => vendor}/linux/fs/cachefiles/Kconfig | 0 {src => vendor}/linux/fs/ceph/Kconfig | 0 {src => vendor}/linux/fs/char_dev.c | 0 {src => vendor}/linux/fs/cifs/Kconfig | 0 {src => vendor}/linux/fs/coda/Kconfig | 0 {src => vendor}/linux/fs/configfs/Kconfig | 0 {src => vendor}/linux/fs/cramfs/Kconfig | 0 {src => vendor}/linux/fs/crypto/Kconfig | 0 {src => vendor}/linux/fs/dcache.c | 0 {src => vendor}/linux/fs/devpts/Makefile | 0 {src => vendor}/linux/fs/devpts/inode.c | 0 {src => vendor}/linux/fs/direct-io.c | 0 {src => vendor}/linux/fs/dlm/Kconfig | 0 {src => vendor}/linux/fs/drop_caches.c | 0 {src => vendor}/linux/fs/ecryptfs/Kconfig | 0 {src => vendor}/linux/fs/efivarfs/Kconfig | 0 {src => vendor}/linux/fs/efs/Kconfig | 0 {src => vendor}/linux/fs/eventfd.c | 0 {src => vendor}/linux/fs/eventpoll.c | 0 {src => vendor}/linux/fs/exec.c | 0 {src => vendor}/linux/fs/exofs/Kbuild | 0 {src => vendor}/linux/fs/exofs/Kconfig | 0 {src => vendor}/linux/fs/exofs/Kconfig.ore | 0 {src => vendor}/linux/fs/exportfs/Makefile | 0 {src => vendor}/linux/fs/exportfs/expfs.c | 0 {src => vendor}/linux/fs/ext2/Kconfig | 0 {src => vendor}/linux/fs/ext4/Kconfig | 0 {src => vendor}/linux/fs/ext4/Makefile | 0 {src => vendor}/linux/fs/ext4/acl.c | 0 {src => vendor}/linux/fs/ext4/acl.h | 0 {src => vendor}/linux/fs/ext4/balloc.c | 0 {src => vendor}/linux/fs/ext4/bitmap.c | 0 {src => vendor}/linux/fs/ext4/block_validity.c | 0 {src => vendor}/linux/fs/ext4/dir.c | 0 {src => vendor}/linux/fs/ext4/ext4.h | 0 {src => vendor}/linux/fs/ext4/ext4_extents.h | 0 {src => vendor}/linux/fs/ext4/ext4_jbd2.c | 0 {src => vendor}/linux/fs/ext4/ext4_jbd2.h | 0 {src => vendor}/linux/fs/ext4/extents.c | 0 {src => vendor}/linux/fs/ext4/extents_status.c | 0 {src => vendor}/linux/fs/ext4/extents_status.h | 0 {src => vendor}/linux/fs/ext4/file.c | 0 {src => vendor}/linux/fs/ext4/fsync.c | 0 {src => vendor}/linux/fs/ext4/hash.c | 0 {src => vendor}/linux/fs/ext4/ialloc.c | 0 {src => vendor}/linux/fs/ext4/indirect.c | 0 {src => vendor}/linux/fs/ext4/inline.c | 0 {src => vendor}/linux/fs/ext4/inode.c | 0 {src => vendor}/linux/fs/ext4/ioctl.c | 0 {src => vendor}/linux/fs/ext4/mballoc.c | 0 {src => vendor}/linux/fs/ext4/mballoc.h | 0 {src => vendor}/linux/fs/ext4/migrate.c | 0 {src => vendor}/linux/fs/ext4/mmp.c | 0 {src => vendor}/linux/fs/ext4/move_extent.c | 0 {src => vendor}/linux/fs/ext4/namei.c | 0 {src => vendor}/linux/fs/ext4/page-io.c | 0 {src => vendor}/linux/fs/ext4/readpage.c | 0 {src => vendor}/linux/fs/ext4/resize.c | 0 {src => vendor}/linux/fs/ext4/super.c | 0 {src => vendor}/linux/fs/ext4/symlink.c | 0 {src => vendor}/linux/fs/ext4/sysfs.c | 0 {src => vendor}/linux/fs/ext4/truncate.h | 0 {src => vendor}/linux/fs/ext4/xattr.c | 0 {src => vendor}/linux/fs/ext4/xattr.h | 0 {src => vendor}/linux/fs/ext4/xattr_security.c | 0 {src => vendor}/linux/fs/ext4/xattr_trusted.c | 0 {src => vendor}/linux/fs/ext4/xattr_user.c | 0 {src => vendor}/linux/fs/f2fs/Kconfig | 0 {src => vendor}/linux/fs/fat/Kconfig | 0 {src => vendor}/linux/fs/fat/Makefile | 0 {src => vendor}/linux/fs/fat/cache.c | 0 {src => vendor}/linux/fs/fat/dir.c | 0 {src => vendor}/linux/fs/fat/fat.h | 0 {src => vendor}/linux/fs/fat/fatent.c | 0 {src => vendor}/linux/fs/fat/file.c | 0 {src => vendor}/linux/fs/fat/inode.c | 0 {src => vendor}/linux/fs/fat/misc.c | 0 {src => vendor}/linux/fs/fat/namei_vfat.c | 0 {src => vendor}/linux/fs/fat/nfs.c | 0 {src => vendor}/linux/fs/fcntl.c | 0 {src => vendor}/linux/fs/fhandle.c | 0 {src => vendor}/linux/fs/file.c | 0 {src => vendor}/linux/fs/file_table.c | 0 {src => vendor}/linux/fs/filesystems.c | 0 {src => vendor}/linux/fs/freevxfs/Kconfig | 0 {src => vendor}/linux/fs/fs-writeback.c | 0 {src => vendor}/linux/fs/fs_pin.c | 0 {src => vendor}/linux/fs/fs_struct.c | 0 {src => vendor}/linux/fs/fscache/Kconfig | 0 {src => vendor}/linux/fs/fuse/Kconfig | 0 {src => vendor}/linux/fs/gfs2/Kconfig | 0 {src => vendor}/linux/fs/hfs/Kconfig | 0 {src => vendor}/linux/fs/hfsplus/Kconfig | 0 {src => vendor}/linux/fs/hpfs/Kconfig | 0 {src => vendor}/linux/fs/inode.c | 0 {src => vendor}/linux/fs/internal.h | 0 {src => vendor}/linux/fs/ioctl.c | 0 {src => vendor}/linux/fs/iomap.c | 0 {src => vendor}/linux/fs/isofs/Kconfig | 0 {src => vendor}/linux/fs/jbd2/Kconfig | 0 {src => vendor}/linux/fs/jbd2/Makefile | 0 {src => vendor}/linux/fs/jbd2/checkpoint.c | 0 {src => vendor}/linux/fs/jbd2/commit.c | 0 {src => vendor}/linux/fs/jbd2/journal.c | 0 {src => vendor}/linux/fs/jbd2/recovery.c | 0 {src => vendor}/linux/fs/jbd2/revoke.c | 0 {src => vendor}/linux/fs/jbd2/transaction.c | 0 {src => vendor}/linux/fs/jffs2/Kconfig | 0 {src => vendor}/linux/fs/jfs/Kconfig | 0 {src => vendor}/linux/fs/kernfs/Kconfig | 0 {src => vendor}/linux/fs/kernfs/Makefile | 0 {src => vendor}/linux/fs/kernfs/dir.c | 0 {src => vendor}/linux/fs/kernfs/file.c | 0 {src => vendor}/linux/fs/kernfs/inode.c | 0 {src => vendor}/linux/fs/kernfs/kernfs-internal.h | 0 {src => vendor}/linux/fs/kernfs/mount.c | 0 {src => vendor}/linux/fs/kernfs/symlink.c | 0 {src => vendor}/linux/fs/libfs.c | 0 {src => vendor}/linux/fs/logfs/Kconfig | 0 {src => vendor}/linux/fs/mbcache.c | 0 {src => vendor}/linux/fs/minix/Kconfig | 0 {src => vendor}/linux/fs/mount.h | 0 {src => vendor}/linux/fs/mpage.c | 0 {src => vendor}/linux/fs/namei.c | 0 {src => vendor}/linux/fs/namespace.c | 0 {src => vendor}/linux/fs/ncpfs/Kconfig | 0 {src => vendor}/linux/fs/nfs/Kconfig | 0 {src => vendor}/linux/fs/nfsd/Kconfig | 0 {src => vendor}/linux/fs/nilfs2/Kconfig | 0 {src => vendor}/linux/fs/nls/Kconfig | 0 {src => vendor}/linux/fs/nls/Makefile | 0 {src => vendor}/linux/fs/nls/mac-celtic.c | 0 {src => vendor}/linux/fs/nls/mac-centeuro.c | 0 {src => vendor}/linux/fs/nls/mac-croatian.c | 0 {src => vendor}/linux/fs/nls/mac-cyrillic.c | 0 {src => vendor}/linux/fs/nls/mac-gaelic.c | 0 {src => vendor}/linux/fs/nls/mac-greek.c | 0 {src => vendor}/linux/fs/nls/mac-iceland.c | 0 {src => vendor}/linux/fs/nls/mac-inuit.c | 0 {src => vendor}/linux/fs/nls/mac-roman.c | 0 {src => vendor}/linux/fs/nls/mac-romanian.c | 0 {src => vendor}/linux/fs/nls/mac-turkish.c | 0 {src => vendor}/linux/fs/nls/nls_ascii.c | 0 {src => vendor}/linux/fs/nls/nls_base.c | 0 {src => vendor}/linux/fs/nls/nls_cp1250.c | 0 {src => vendor}/linux/fs/nls/nls_cp1251.c | 0 {src => vendor}/linux/fs/nls/nls_cp1255.c | 0 {src => vendor}/linux/fs/nls/nls_cp437.c | 0 {src => vendor}/linux/fs/nls/nls_cp737.c | 0 {src => vendor}/linux/fs/nls/nls_cp775.c | 0 {src => vendor}/linux/fs/nls/nls_cp850.c | 0 {src => vendor}/linux/fs/nls/nls_cp852.c | 0 {src => vendor}/linux/fs/nls/nls_cp855.c | 0 {src => vendor}/linux/fs/nls/nls_cp857.c | 0 {src => vendor}/linux/fs/nls/nls_cp860.c | 0 {src => vendor}/linux/fs/nls/nls_cp861.c | 0 {src => vendor}/linux/fs/nls/nls_cp862.c | 0 {src => vendor}/linux/fs/nls/nls_cp863.c | 0 {src => vendor}/linux/fs/nls/nls_cp864.c | 0 {src => vendor}/linux/fs/nls/nls_cp865.c | 0 {src => vendor}/linux/fs/nls/nls_cp866.c | 0 {src => vendor}/linux/fs/nls/nls_cp869.c | 0 {src => vendor}/linux/fs/nls/nls_cp874.c | 0 {src => vendor}/linux/fs/nls/nls_cp932.c | 0 {src => vendor}/linux/fs/nls/nls_cp936.c | 0 {src => vendor}/linux/fs/nls/nls_cp949.c | 0 {src => vendor}/linux/fs/nls/nls_cp950.c | 0 {src => vendor}/linux/fs/nls/nls_euc-jp.c | 0 {src => vendor}/linux/fs/nls/nls_iso8859-1.c | 0 {src => vendor}/linux/fs/nls/nls_iso8859-13.c | 0 {src => vendor}/linux/fs/nls/nls_iso8859-14.c | 0 {src => vendor}/linux/fs/nls/nls_iso8859-15.c | 0 {src => vendor}/linux/fs/nls/nls_iso8859-2.c | 0 {src => vendor}/linux/fs/nls/nls_iso8859-3.c | 0 {src => vendor}/linux/fs/nls/nls_iso8859-4.c | 0 {src => vendor}/linux/fs/nls/nls_iso8859-5.c | 0 {src => vendor}/linux/fs/nls/nls_iso8859-6.c | 0 {src => vendor}/linux/fs/nls/nls_iso8859-7.c | 0 {src => vendor}/linux/fs/nls/nls_iso8859-9.c | 0 {src => vendor}/linux/fs/nls/nls_koi8-r.c | 0 {src => vendor}/linux/fs/nls/nls_koi8-ru.c | 0 {src => vendor}/linux/fs/nls/nls_koi8-u.c | 0 {src => vendor}/linux/fs/nls/nls_utf8.c | 0 {src => vendor}/linux/fs/notify/Kconfig | 0 {src => vendor}/linux/fs/notify/Makefile | 0 {src => vendor}/linux/fs/notify/dnotify/Kconfig | 0 {src => vendor}/linux/fs/notify/dnotify/Makefile | 0 {src => vendor}/linux/fs/notify/fanotify/Kconfig | 0 {src => vendor}/linux/fs/notify/fanotify/Makefile | 0 {src => vendor}/linux/fs/notify/inotify/Kconfig | 0 {src => vendor}/linux/fs/notify/inotify/Makefile | 0 {src => vendor}/linux/fs/nsfs.c | 0 {src => vendor}/linux/fs/ntfs/Kconfig | 0 {src => vendor}/linux/fs/ocfs2/Kconfig | 0 {src => vendor}/linux/fs/omfs/Kconfig | 0 {src => vendor}/linux/fs/open.c | 0 {src => vendor}/linux/fs/orangefs/Kconfig | 0 {src => vendor}/linux/fs/overlayfs/Kconfig | 0 {src => vendor}/linux/fs/pipe.c | 0 {src => vendor}/linux/fs/pnode.c | 0 {src => vendor}/linux/fs/pnode.h | 0 {src => vendor}/linux/fs/posix_acl.c | 0 {src => vendor}/linux/fs/proc/Kconfig | 0 {src => vendor}/linux/fs/proc/Makefile | 0 {src => vendor}/linux/fs/proc/array.c | 0 {src => vendor}/linux/fs/proc/base.c | 0 {src => vendor}/linux/fs/proc/cmdline.c | 0 {src => vendor}/linux/fs/proc/consoles.c | 0 {src => vendor}/linux/fs/proc/cpuinfo.c | 0 {src => vendor}/linux/fs/proc/devices.c | 0 {src => vendor}/linux/fs/proc/fd.c | 0 {src => vendor}/linux/fs/proc/fd.h | 0 {src => vendor}/linux/fs/proc/generic.c | 0 {src => vendor}/linux/fs/proc/inode.c | 0 {src => vendor}/linux/fs/proc/internal.h | 0 {src => vendor}/linux/fs/proc/interrupts.c | 0 {src => vendor}/linux/fs/proc/kmsg.c | 0 {src => vendor}/linux/fs/proc/loadavg.c | 0 {src => vendor}/linux/fs/proc/meminfo.c | 0 {src => vendor}/linux/fs/proc/namespaces.c | 0 {src => vendor}/linux/fs/proc/nommu.c | 0 {src => vendor}/linux/fs/proc/proc_net.c | 0 {src => vendor}/linux/fs/proc/proc_sysctl.c | 0 {src => vendor}/linux/fs/proc/proc_tty.c | 0 {src => vendor}/linux/fs/proc/root.c | 0 {src => vendor}/linux/fs/proc/self.c | 0 {src => vendor}/linux/fs/proc/softirqs.c | 0 {src => vendor}/linux/fs/proc/stat.c | 0 {src => vendor}/linux/fs/proc/task_nommu.c | 0 {src => vendor}/linux/fs/proc/thread_self.c | 0 {src => vendor}/linux/fs/proc/uptime.c | 0 {src => vendor}/linux/fs/proc/version.c | 0 {src => vendor}/linux/fs/proc_namespace.c | 0 {src => vendor}/linux/fs/pstore/Kconfig | 0 {src => vendor}/linux/fs/qnx4/Kconfig | 0 {src => vendor}/linux/fs/qnx6/Kconfig | 0 {src => vendor}/linux/fs/quota/Kconfig | 0 {src => vendor}/linux/fs/quota/Makefile | 0 {src => vendor}/linux/fs/ramfs/Makefile | 0 {src => vendor}/linux/fs/ramfs/file-nommu.c | 0 {src => vendor}/linux/fs/ramfs/inode.c | 0 {src => vendor}/linux/fs/ramfs/internal.h | 0 {src => vendor}/linux/fs/read_write.c | 0 {src => vendor}/linux/fs/readdir.c | 0 {src => vendor}/linux/fs/reiserfs/Kconfig | 0 {src => vendor}/linux/fs/romfs/Kconfig | 0 {src => vendor}/linux/fs/select.c | 0 {src => vendor}/linux/fs/seq_file.c | 0 {src => vendor}/linux/fs/splice.c | 0 {src => vendor}/linux/fs/squashfs/Kconfig | 0 {src => vendor}/linux/fs/stack.c | 0 {src => vendor}/linux/fs/stat.c | 0 {src => vendor}/linux/fs/statfs.c | 0 {src => vendor}/linux/fs/super.c | 0 {src => vendor}/linux/fs/sync.c | 0 {src => vendor}/linux/fs/sysfs/Kconfig | 0 {src => vendor}/linux/fs/sysfs/Makefile | 0 {src => vendor}/linux/fs/sysfs/dir.c | 0 {src => vendor}/linux/fs/sysfs/file.c | 0 {src => vendor}/linux/fs/sysfs/group.c | 0 {src => vendor}/linux/fs/sysfs/mount.c | 0 {src => vendor}/linux/fs/sysfs/symlink.c | 0 {src => vendor}/linux/fs/sysfs/sysfs.h | 0 {src => vendor}/linux/fs/sysv/Kconfig | 0 {src => vendor}/linux/fs/ubifs/Kconfig | 0 {src => vendor}/linux/fs/udf/Kconfig | 0 {src => vendor}/linux/fs/ufs/Kconfig | 0 {src => vendor}/linux/fs/utimes.c | 0 {src => vendor}/linux/fs/xattr.c | 0 {src => vendor}/linux/fs/xfs/Kconfig | 0 {src => vendor}/linux/fs/xfs/Makefile | 0 {src => vendor}/linux/fs/xfs/kmem.c | 0 {src => vendor}/linux/fs/xfs/kmem.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_ag_resv.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_ag_resv.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_alloc.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_alloc.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_alloc_btree.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_alloc_btree.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_attr.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_attr_leaf.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_attr_leaf.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_attr_remote.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_attr_remote.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_attr_sf.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_bit.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_bit.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_bmap.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_bmap.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_bmap_btree.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_bmap_btree.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_btree.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_btree.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_cksum.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_da_btree.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_da_btree.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_da_format.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_da_format.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_defer.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_defer.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2_block.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2_data.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2_leaf.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2_node.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2_priv.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2_sf.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_dquot_buf.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_format.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_fs.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_ialloc.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_ialloc.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_ialloc_btree.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_ialloc_btree.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_inode_buf.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_inode_buf.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_inode_fork.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_inode_fork.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_log_format.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_log_recover.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_log_rlimit.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_quota_defs.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_refcount.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_refcount.h | 0 .../linux/fs/xfs/libxfs/xfs_refcount_btree.c | 0 .../linux/fs/xfs/libxfs/xfs_refcount_btree.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_rmap.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_rmap.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_rmap_btree.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_rmap_btree.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_sb.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_sb.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_shared.h | 0 .../linux/fs/xfs/libxfs/xfs_symlink_remote.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_trans_resv.c | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_trans_resv.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_trans_space.h | 0 {src => vendor}/linux/fs/xfs/libxfs/xfs_types.h | 0 {src => vendor}/linux/fs/xfs/mrlock.h | 0 {src => vendor}/linux/fs/xfs/uuid.c | 0 {src => vendor}/linux/fs/xfs/uuid.h | 0 {src => vendor}/linux/fs/xfs/xfs.h | 0 {src => vendor}/linux/fs/xfs/xfs_acl.c | 0 {src => vendor}/linux/fs/xfs/xfs_acl.h | 0 {src => vendor}/linux/fs/xfs/xfs_aops.c | 0 {src => vendor}/linux/fs/xfs/xfs_aops.h | 0 {src => vendor}/linux/fs/xfs/xfs_attr.h | 0 {src => vendor}/linux/fs/xfs/xfs_attr_inactive.c | 0 {src => vendor}/linux/fs/xfs/xfs_attr_list.c | 0 {src => vendor}/linux/fs/xfs/xfs_bmap_item.c | 0 {src => vendor}/linux/fs/xfs/xfs_bmap_item.h | 0 {src => vendor}/linux/fs/xfs/xfs_bmap_util.c | 0 {src => vendor}/linux/fs/xfs/xfs_bmap_util.h | 0 {src => vendor}/linux/fs/xfs/xfs_buf.c | 0 {src => vendor}/linux/fs/xfs/xfs_buf.h | 0 {src => vendor}/linux/fs/xfs/xfs_buf_item.c | 0 {src => vendor}/linux/fs/xfs/xfs_buf_item.h | 0 {src => vendor}/linux/fs/xfs/xfs_dir2_readdir.c | 0 {src => vendor}/linux/fs/xfs/xfs_discard.c | 0 {src => vendor}/linux/fs/xfs/xfs_discard.h | 0 {src => vendor}/linux/fs/xfs/xfs_dquot.h | 0 {src => vendor}/linux/fs/xfs/xfs_dquot_item.h | 0 {src => vendor}/linux/fs/xfs/xfs_error.c | 0 {src => vendor}/linux/fs/xfs/xfs_error.h | 0 {src => vendor}/linux/fs/xfs/xfs_export.c | 0 {src => vendor}/linux/fs/xfs/xfs_export.h | 0 {src => vendor}/linux/fs/xfs/xfs_extent_busy.c | 0 {src => vendor}/linux/fs/xfs/xfs_extent_busy.h | 0 {src => vendor}/linux/fs/xfs/xfs_extfree_item.c | 0 {src => vendor}/linux/fs/xfs/xfs_extfree_item.h | 0 {src => vendor}/linux/fs/xfs/xfs_file.c | 0 {src => vendor}/linux/fs/xfs/xfs_filestream.c | 0 {src => vendor}/linux/fs/xfs/xfs_filestream.h | 0 {src => vendor}/linux/fs/xfs/xfs_fsops.c | 0 {src => vendor}/linux/fs/xfs/xfs_fsops.h | 0 {src => vendor}/linux/fs/xfs/xfs_globals.c | 0 {src => vendor}/linux/fs/xfs/xfs_icache.c | 0 {src => vendor}/linux/fs/xfs/xfs_icache.h | 0 {src => vendor}/linux/fs/xfs/xfs_icreate_item.c | 0 {src => vendor}/linux/fs/xfs/xfs_icreate_item.h | 0 {src => vendor}/linux/fs/xfs/xfs_inode.c | 0 {src => vendor}/linux/fs/xfs/xfs_inode.h | 0 {src => vendor}/linux/fs/xfs/xfs_inode_item.c | 0 {src => vendor}/linux/fs/xfs/xfs_inode_item.h | 0 {src => vendor}/linux/fs/xfs/xfs_ioctl.c | 0 {src => vendor}/linux/fs/xfs/xfs_ioctl.h | 0 {src => vendor}/linux/fs/xfs/xfs_iomap.c | 0 {src => vendor}/linux/fs/xfs/xfs_iomap.h | 0 {src => vendor}/linux/fs/xfs/xfs_iops.c | 0 {src => vendor}/linux/fs/xfs/xfs_iops.h | 0 {src => vendor}/linux/fs/xfs/xfs_itable.c | 0 {src => vendor}/linux/fs/xfs/xfs_itable.h | 0 {src => vendor}/linux/fs/xfs/xfs_linux.h | 0 {src => vendor}/linux/fs/xfs/xfs_log.c | 0 {src => vendor}/linux/fs/xfs/xfs_log.h | 0 {src => vendor}/linux/fs/xfs/xfs_log_cil.c | 0 {src => vendor}/linux/fs/xfs/xfs_log_priv.h | 0 {src => vendor}/linux/fs/xfs/xfs_log_recover.c | 0 {src => vendor}/linux/fs/xfs/xfs_message.c | 0 {src => vendor}/linux/fs/xfs/xfs_message.h | 0 {src => vendor}/linux/fs/xfs/xfs_mount.c | 0 {src => vendor}/linux/fs/xfs/xfs_mount.h | 0 {src => vendor}/linux/fs/xfs/xfs_mru_cache.c | 0 {src => vendor}/linux/fs/xfs/xfs_mru_cache.h | 0 {src => vendor}/linux/fs/xfs/xfs_ondisk.h | 0 {src => vendor}/linux/fs/xfs/xfs_pnfs.h | 0 {src => vendor}/linux/fs/xfs/xfs_qm.h | 0 {src => vendor}/linux/fs/xfs/xfs_quota.h | 0 {src => vendor}/linux/fs/xfs/xfs_refcount_item.c | 0 {src => vendor}/linux/fs/xfs/xfs_refcount_item.h | 0 {src => vendor}/linux/fs/xfs/xfs_reflink.c | 0 {src => vendor}/linux/fs/xfs/xfs_reflink.h | 0 {src => vendor}/linux/fs/xfs/xfs_rmap_item.c | 0 {src => vendor}/linux/fs/xfs/xfs_rmap_item.h | 0 {src => vendor}/linux/fs/xfs/xfs_rtalloc.h | 0 {src => vendor}/linux/fs/xfs/xfs_stats.c | 0 {src => vendor}/linux/fs/xfs/xfs_stats.h | 0 {src => vendor}/linux/fs/xfs/xfs_super.c | 0 {src => vendor}/linux/fs/xfs/xfs_super.h | 0 {src => vendor}/linux/fs/xfs/xfs_symlink.c | 0 {src => vendor}/linux/fs/xfs/xfs_symlink.h | 0 {src => vendor}/linux/fs/xfs/xfs_sysctl.c | 0 {src => vendor}/linux/fs/xfs/xfs_sysctl.h | 0 {src => vendor}/linux/fs/xfs/xfs_sysfs.c | 0 {src => vendor}/linux/fs/xfs/xfs_sysfs.h | 0 {src => vendor}/linux/fs/xfs/xfs_trace.c | 0 {src => vendor}/linux/fs/xfs/xfs_trace.h | 0 {src => vendor}/linux/fs/xfs/xfs_trans.c | 0 {src => vendor}/linux/fs/xfs/xfs_trans.h | 0 {src => vendor}/linux/fs/xfs/xfs_trans_ail.c | 0 {src => vendor}/linux/fs/xfs/xfs_trans_bmap.c | 0 {src => vendor}/linux/fs/xfs/xfs_trans_buf.c | 0 {src => vendor}/linux/fs/xfs/xfs_trans_extfree.c | 0 {src => vendor}/linux/fs/xfs/xfs_trans_inode.c | 0 {src => vendor}/linux/fs/xfs/xfs_trans_priv.h | 0 {src => vendor}/linux/fs/xfs/xfs_trans_refcount.c | 0 {src => vendor}/linux/fs/xfs/xfs_trans_rmap.c | 0 {src => vendor}/linux/fs/xfs/xfs_xattr.c | 0 {src => vendor}/linux/include/acpi/acbuffer.h | 0 {src => vendor}/linux/include/acpi/acconfig.h | 0 {src => vendor}/linux/include/acpi/acexcep.h | 0 {src => vendor}/linux/include/acpi/acnames.h | 0 {src => vendor}/linux/include/acpi/acoutput.h | 0 {src => vendor}/linux/include/acpi/acpi.h | 0 {src => vendor}/linux/include/acpi/acpiosxf.h | 0 {src => vendor}/linux/include/acpi/acpixf.h | 0 {src => vendor}/linux/include/acpi/acrestyp.h | 0 {src => vendor}/linux/include/acpi/actbl.h | 0 {src => vendor}/linux/include/acpi/actbl1.h | 0 {src => vendor}/linux/include/acpi/actbl2.h | 0 {src => vendor}/linux/include/acpi/actbl3.h | 0 {src => vendor}/linux/include/acpi/actypes.h | 0 {src => vendor}/linux/include/acpi/platform/acenv.h | 0 {src => vendor}/linux/include/acpi/platform/acenvex.h | 0 {src => vendor}/linux/include/acpi/platform/acgcc.h | 0 {src => vendor}/linux/include/acpi/platform/acgccex.h | 0 {src => vendor}/linux/include/acpi/platform/aclinux.h | 0 .../linux/include/acpi/platform/aclinuxex.h | 0 .../linux/include/asm-generic/4level-fixup.h | 0 .../linux/include/asm-generic/atomic-long.h | 0 {src => vendor}/linux/include/asm-generic/atomic.h | 0 {src => vendor}/linux/include/asm-generic/atomic64.h | 0 {src => vendor}/linux/include/asm-generic/barrier.h | 0 {src => vendor}/linux/include/asm-generic/bitops.h | 0 .../linux/include/asm-generic/bitops/__ffs.h | 0 .../linux/include/asm-generic/bitops/__fls.h | 0 .../linux/include/asm-generic/bitops/arch_hweight.h | 0 .../linux/include/asm-generic/bitops/atomic.h | 0 .../linux/include/asm-generic/bitops/const_hweight.h | 0 .../linux/include/asm-generic/bitops/ext2-atomic.h | 0 {src => vendor}/linux/include/asm-generic/bitops/ffs.h | 0 {src => vendor}/linux/include/asm-generic/bitops/ffz.h | 0 .../linux/include/asm-generic/bitops/find.h | 0 {src => vendor}/linux/include/asm-generic/bitops/fls.h | 0 .../linux/include/asm-generic/bitops/fls64.h | 0 .../linux/include/asm-generic/bitops/hweight.h | 0 {src => vendor}/linux/include/asm-generic/bitops/le.h | 0 .../linux/include/asm-generic/bitops/lock.h | 0 .../linux/include/asm-generic/bitops/non-atomic.h | 0 .../linux/include/asm-generic/bitops/sched.h | 0 {src => vendor}/linux/include/asm-generic/bug.h | 0 {src => vendor}/linux/include/asm-generic/bugs.h | 0 {src => vendor}/linux/include/asm-generic/cache.h | 0 {src => vendor}/linux/include/asm-generic/cacheflush.h | 0 {src => vendor}/linux/include/asm-generic/checksum.h | 0 .../linux/include/asm-generic/cmpxchg-local.h | 0 {src => vendor}/linux/include/asm-generic/cmpxchg.h | 0 {src => vendor}/linux/include/asm-generic/cputime.h | 0 .../linux/include/asm-generic/cputime_jiffies.h | 0 {src => vendor}/linux/include/asm-generic/current.h | 0 {src => vendor}/linux/include/asm-generic/delay.h | 0 {src => vendor}/linux/include/asm-generic/device.h | 0 {src => vendor}/linux/include/asm-generic/div64.h | 0 {src => vendor}/linux/include/asm-generic/dma.h | 0 .../linux/include/asm-generic/emergency-restart.h | 0 {src => vendor}/linux/include/asm-generic/exec.h | 0 {src => vendor}/linux/include/asm-generic/ftrace.h | 0 {src => vendor}/linux/include/asm-generic/getorder.h | 0 {src => vendor}/linux/include/asm-generic/hardirq.h | 0 {src => vendor}/linux/include/asm-generic/hw_irq.h | 0 {src => vendor}/linux/include/asm-generic/int-ll64.h | 0 {src => vendor}/linux/include/asm-generic/io.h | 0 {src => vendor}/linux/include/asm-generic/ioctl.h | 0 {src => vendor}/linux/include/asm-generic/irq_regs.h | 0 {src => vendor}/linux/include/asm-generic/irq_work.h | 0 {src => vendor}/linux/include/asm-generic/irqflags.h | 0 {src => vendor}/linux/include/asm-generic/kdebug.h | 0 {src => vendor}/linux/include/asm-generic/kmap_types.h | 0 {src => vendor}/linux/include/asm-generic/linkage.h | 0 {src => vendor}/linux/include/asm-generic/local.h | 0 .../linux/include/asm-generic/memory_model.h | 0 {src => vendor}/linux/include/asm-generic/mm_hooks.h | 0 {src => vendor}/linux/include/asm-generic/mmu.h | 0 .../linux/include/asm-generic/mmu_context.h | 0 {src => vendor}/linux/include/asm-generic/module.h | 0 {src => vendor}/linux/include/asm-generic/mutex-dec.h | 0 {src => vendor}/linux/include/asm-generic/page.h | 0 {src => vendor}/linux/include/asm-generic/param.h | 0 {src => vendor}/linux/include/asm-generic/pci.h | 0 {src => vendor}/linux/include/asm-generic/pci_iomap.h | 0 {src => vendor}/linux/include/asm-generic/percpu.h | 0 {src => vendor}/linux/include/asm-generic/pgalloc.h | 0 {src => vendor}/linux/include/asm-generic/pgtable.h | 0 {src => vendor}/linux/include/asm-generic/preempt.h | 0 {src => vendor}/linux/include/asm-generic/resource.h | 0 {src => vendor}/linux/include/asm-generic/sections.h | 0 {src => vendor}/linux/include/asm-generic/segment.h | 0 {src => vendor}/linux/include/asm-generic/siginfo.h | 0 {src => vendor}/linux/include/asm-generic/signal.h | 0 {src => vendor}/linux/include/asm-generic/statfs.h | 0 {src => vendor}/linux/include/asm-generic/string.h | 0 {src => vendor}/linux/include/asm-generic/switch_to.h | 0 {src => vendor}/linux/include/asm-generic/syscalls.h | 0 {src => vendor}/linux/include/asm-generic/termios.h | 0 {src => vendor}/linux/include/asm-generic/timex.h | 0 {src => vendor}/linux/include/asm-generic/tlb.h | 0 {src => vendor}/linux/include/asm-generic/tlbflush.h | 0 {src => vendor}/linux/include/asm-generic/topology.h | 0 .../linux/include/asm-generic/trace_clock.h | 0 {src => vendor}/linux/include/asm-generic/uaccess.h | 0 {src => vendor}/linux/include/asm-generic/unaligned.h | 0 {src => vendor}/linux/include/asm-generic/unistd.h | 0 .../linux/include/asm-generic/vmlinux.lds.h | 0 .../linux/include/asm-generic/word-at-a-time.h | 0 {src => vendor}/linux/include/asm-generic/xor.h | 0 {src => vendor}/linux/include/crypto/aead.h | 0 {src => vendor}/linux/include/crypto/aes.h | 0 {src => vendor}/linux/include/crypto/akcipher.h | 0 {src => vendor}/linux/include/crypto/algapi.h | 0 {src => vendor}/linux/include/crypto/chacha20.h | 0 {src => vendor}/linux/include/crypto/crypto_wq.h | 0 {src => vendor}/linux/include/crypto/drbg.h | 0 {src => vendor}/linux/include/crypto/hash.h | 0 {src => vendor}/linux/include/crypto/internal/aead.h | 0 .../linux/include/crypto/internal/akcipher.h | 0 {src => vendor}/linux/include/crypto/internal/geniv.h | 0 {src => vendor}/linux/include/crypto/internal/hash.h | 0 {src => vendor}/linux/include/crypto/internal/kpp.h | 0 {src => vendor}/linux/include/crypto/internal/rng.h | 0 .../linux/include/crypto/internal/skcipher.h | 0 {src => vendor}/linux/include/crypto/kpp.h | 0 {src => vendor}/linux/include/crypto/null.h | 0 {src => vendor}/linux/include/crypto/rng.h | 0 {src => vendor}/linux/include/crypto/scatterwalk.h | 0 {src => vendor}/linux/include/crypto/sha.h | 0 {src => vendor}/linux/include/crypto/sha256_base.h | 0 {src => vendor}/linux/include/crypto/skcipher.h | 0 .../include/dt-bindings/input/linux-event-codes.h | 0 {src => vendor}/linux/include/linux/acct.h | 0 {src => vendor}/linux/include/linux/acpi.h | 0 {src => vendor}/linux/include/linux/aio.h | 0 {src => vendor}/linux/include/linux/alarmtimer.h | 0 {src => vendor}/linux/include/linux/anon_inodes.h | 0 {src => vendor}/linux/include/linux/assoc_array.h | 0 {src => vendor}/linux/include/linux/async.h | 0 {src => vendor}/linux/include/linux/atalk.h | 0 {src => vendor}/linux/include/linux/atomic.h | 0 .../linux/include/linux/attribute_container.h | 0 {src => vendor}/linux/include/linux/audit.h | 0 {src => vendor}/linux/include/linux/auxvec.h | 0 {src => vendor}/linux/include/linux/average.h | 0 {src => vendor}/linux/include/linux/backing-dev-defs.h | 0 {src => vendor}/linux/include/linux/backing-dev.h | 0 {src => vendor}/linux/include/linux/badblocks.h | 0 .../linux/include/linux/balloon_compaction.h | 0 {src => vendor}/linux/include/linux/bcd.h | 0 {src => vendor}/linux/include/linux/binfmts.h | 0 {src => vendor}/linux/include/linux/bio.h | 0 {src => vendor}/linux/include/linux/bit_spinlock.h | 0 {src => vendor}/linux/include/linux/bitmap.h | 0 {src => vendor}/linux/include/linux/bitops.h | 0 {src => vendor}/linux/include/linux/bitrev.h | 0 {src => vendor}/linux/include/linux/blk-cgroup.h | 0 {src => vendor}/linux/include/linux/blk-mq.h | 0 {src => vendor}/linux/include/linux/blk_types.h | 0 {src => vendor}/linux/include/linux/blkdev.h | 0 {src => vendor}/linux/include/linux/blkpg.h | 0 {src => vendor}/linux/include/linux/blktrace_api.h | 0 {src => vendor}/linux/include/linux/blockgroup_lock.h | 0 {src => vendor}/linux/include/linux/bootmem.h | 0 {src => vendor}/linux/include/linux/bottom_half.h | 0 {src => vendor}/linux/include/linux/bpf.h | 0 {src => vendor}/linux/include/linux/bsearch.h | 0 {src => vendor}/linux/include/linux/bsg.h | 0 {src => vendor}/linux/include/linux/btrfs.h | 0 {src => vendor}/linux/include/linux/buffer_head.h | 0 {src => vendor}/linux/include/linux/bug.h | 0 {src => vendor}/linux/include/linux/bvec.h | 0 .../linux/include/linux/byteorder/generic.h | 0 .../linux/include/linux/byteorder/little_endian.h | 0 {src => vendor}/linux/include/linux/cache.h | 0 {src => vendor}/linux/include/linux/cacheinfo.h | 0 {src => vendor}/linux/include/linux/capability.h | 0 {src => vendor}/linux/include/linux/cdev.h | 0 {src => vendor}/linux/include/linux/cdrom.h | 0 {src => vendor}/linux/include/linux/cgroup-defs.h | 0 {src => vendor}/linux/include/linux/cgroup.h | 0 {src => vendor}/linux/include/linux/cleancache.h | 0 {src => vendor}/linux/include/linux/clk-provider.h | 0 {src => vendor}/linux/include/linux/clk.h | 0 {src => vendor}/linux/include/linux/clk/clk-conf.h | 0 {src => vendor}/linux/include/linux/clockchips.h | 0 {src => vendor}/linux/include/linux/clocksource.h | 0 {src => vendor}/linux/include/linux/cma.h | 0 {src => vendor}/linux/include/linux/cn_proc.h | 0 {src => vendor}/linux/include/linux/compaction.h | 0 {src => vendor}/linux/include/linux/compat.h | 0 {src => vendor}/linux/include/linux/compiler-gcc.h | 0 {src => vendor}/linux/include/linux/compiler.h | 0 {src => vendor}/linux/include/linux/completion.h | 0 {src => vendor}/linux/include/linux/component.h | 0 {src => vendor}/linux/include/linux/console.h | 0 {src => vendor}/linux/include/linux/console_struct.h | 0 {src => vendor}/linux/include/linux/consolemap.h | 0 {src => vendor}/linux/include/linux/container.h | 0 {src => vendor}/linux/include/linux/context_tracking.h | 0 .../linux/include/linux/context_tracking_state.h | 0 {src => vendor}/linux/include/linux/coredump.h | 0 {src => vendor}/linux/include/linux/cpu.h | 0 {src => vendor}/linux/include/linux/cpu_rmap.h | 0 {src => vendor}/linux/include/linux/cpufeature.h | 0 {src => vendor}/linux/include/linux/cpuhotplug.h | 0 {src => vendor}/linux/include/linux/cpuidle.h | 0 {src => vendor}/linux/include/linux/cpumask.h | 0 {src => vendor}/linux/include/linux/cpuset.h | 0 {src => vendor}/linux/include/linux/cputime.h | 0 {src => vendor}/linux/include/linux/crash_dump.h | 0 {src => vendor}/linux/include/linux/crc-ccitt.h | 0 {src => vendor}/linux/include/linux/crc16.h | 0 {src => vendor}/linux/include/linux/crc32.h | 0 {src => vendor}/linux/include/linux/crc32c.h | 0 {src => vendor}/linux/include/linux/cred.h | 0 {src => vendor}/linux/include/linux/crypto.h | 0 {src => vendor}/linux/include/linux/cryptohash.h | 0 {src => vendor}/linux/include/linux/ctype.h | 0 {src => vendor}/linux/include/linux/dax.h | 0 {src => vendor}/linux/include/linux/dcache.h | 0 {src => vendor}/linux/include/linux/dccp.h | 0 {src => vendor}/linux/include/linux/dcookies.h | 0 {src => vendor}/linux/include/linux/debug_locks.h | 0 {src => vendor}/linux/include/linux/debugfs.h | 0 {src => vendor}/linux/include/linux/debugobjects.h | 0 .../linux/include/linux/decompress/bunzip2.h | 0 .../linux/include/linux/decompress/generic.h | 0 .../linux/include/linux/decompress/inflate.h | 0 {src => vendor}/linux/include/linux/decompress/unlz4.h | 0 .../linux/include/linux/decompress/unlzma.h | 0 {src => vendor}/linux/include/linux/decompress/unlzo.h | 0 {src => vendor}/linux/include/linux/decompress/unxz.h | 0 {src => vendor}/linux/include/linux/delay.h | 0 {src => vendor}/linux/include/linux/delayacct.h | 0 {src => vendor}/linux/include/linux/delayed_call.h | 0 {src => vendor}/linux/include/linux/device.h | 0 {src => vendor}/linux/include/linux/device_cgroup.h | 0 {src => vendor}/linux/include/linux/devpts_fs.h | 0 {src => vendor}/linux/include/linux/dirent.h | 0 {src => vendor}/linux/include/linux/dma-debug.h | 0 {src => vendor}/linux/include/linux/dma-direction.h | 0 {src => vendor}/linux/include/linux/dma-mapping.h | 0 {src => vendor}/linux/include/linux/dmaengine.h | 0 {src => vendor}/linux/include/linux/dmapool.h | 0 {src => vendor}/linux/include/linux/dmi.h | 0 {src => vendor}/linux/include/linux/dnotify.h | 0 {src => vendor}/linux/include/linux/dqblk_qtree.h | 0 {src => vendor}/linux/include/linux/dqblk_v1.h | 0 {src => vendor}/linux/include/linux/dqblk_v2.h | 0 {src => vendor}/linux/include/linux/dynamic_debug.h | 0 .../linux/include/linux/dynamic_queue_limits.h | 0 {src => vendor}/linux/include/linux/earlycpio.h | 0 {src => vendor}/linux/include/linux/efi.h | 0 {src => vendor}/linux/include/linux/elevator.h | 0 {src => vendor}/linux/include/linux/elf.h | 0 {src => vendor}/linux/include/linux/err.h | 0 {src => vendor}/linux/include/linux/errno.h | 0 {src => vendor}/linux/include/linux/errqueue.h | 0 {src => vendor}/linux/include/linux/etherdevice.h | 0 {src => vendor}/linux/include/linux/ethtool.h | 0 {src => vendor}/linux/include/linux/eventfd.h | 0 {src => vendor}/linux/include/linux/eventpoll.h | 0 {src => vendor}/linux/include/linux/evm.h | 0 {src => vendor}/linux/include/linux/export.h | 0 {src => vendor}/linux/include/linux/exportfs.h | 0 {src => vendor}/linux/include/linux/extable.h | 0 {src => vendor}/linux/include/linux/falloc.h | 0 {src => vendor}/linux/include/linux/fault-inject.h | 0 {src => vendor}/linux/include/linux/fcntl.h | 0 {src => vendor}/linux/include/linux/fd.h | 0 {src => vendor}/linux/include/linux/fddidevice.h | 0 {src => vendor}/linux/include/linux/fdtable.h | 0 {src => vendor}/linux/include/linux/file.h | 0 {src => vendor}/linux/include/linux/filter.h | 0 {src => vendor}/linux/include/linux/fips.h | 0 {src => vendor}/linux/include/linux/flex_array.h | 0 {src => vendor}/linux/include/linux/flex_proportions.h | 0 {src => vendor}/linux/include/linux/frame.h | 0 {src => vendor}/linux/include/linux/freezer.h | 0 {src => vendor}/linux/include/linux/fs.h | 0 {src => vendor}/linux/include/linux/fs_pin.h | 0 {src => vendor}/linux/include/linux/fs_stack.h | 0 {src => vendor}/linux/include/linux/fs_struct.h | 0 {src => vendor}/linux/include/linux/fscache-cache.h | 0 {src => vendor}/linux/include/linux/fscache.h | 0 {src => vendor}/linux/include/linux/fscrypto.h | 0 {src => vendor}/linux/include/linux/fsnotify.h | 0 {src => vendor}/linux/include/linux/fsnotify_backend.h | 0 {src => vendor}/linux/include/linux/ftrace.h | 0 {src => vendor}/linux/include/linux/ftrace_irq.h | 0 {src => vendor}/linux/include/linux/futex.h | 0 {src => vendor}/linux/include/linux/fwnode.h | 0 {src => vendor}/linux/include/linux/gcd.h | 0 {src => vendor}/linux/include/linux/genetlink.h | 0 {src => vendor}/linux/include/linux/genhd.h | 0 {src => vendor}/linux/include/linux/getcpu.h | 0 {src => vendor}/linux/include/linux/gfp.h | 0 {src => vendor}/linux/include/linux/hardirq.h | 0 {src => vendor}/linux/include/linux/hash.h | 0 {src => vendor}/linux/include/linux/hashtable.h | 0 {src => vendor}/linux/include/linux/hid-debug.h | 0 {src => vendor}/linux/include/linux/hid.h | 0 {src => vendor}/linux/include/linux/hiddev.h | 0 {src => vendor}/linux/include/linux/hidraw.h | 0 {src => vendor}/linux/include/linux/highmem.h | 0 {src => vendor}/linux/include/linux/highuid.h | 0 {src => vendor}/linux/include/linux/hrtimer.h | 0 {src => vendor}/linux/include/linux/huge_mm.h | 0 {src => vendor}/linux/include/linux/hugetlb.h | 0 {src => vendor}/linux/include/linux/hugetlb_inline.h | 0 {src => vendor}/linux/include/linux/hw_breakpoint.h | 0 {src => vendor}/linux/include/linux/hw_random.h | 0 {src => vendor}/linux/include/linux/hwmon.h | 0 {src => vendor}/linux/include/linux/hypervisor.h | 0 {src => vendor}/linux/include/linux/i8042.h | 0 {src => vendor}/linux/include/linux/icmp.h | 0 {src => vendor}/linux/include/linux/icmpv6.h | 0 {src => vendor}/linux/include/linux/idr.h | 0 {src => vendor}/linux/include/linux/ieee802154.h | 0 {src => vendor}/linux/include/linux/if_arp.h | 0 {src => vendor}/linux/include/linux/if_bridge.h | 0 {src => vendor}/linux/include/linux/if_ether.h | 0 {src => vendor}/linux/include/linux/if_fddi.h | 0 {src => vendor}/linux/include/linux/if_frad.h | 0 {src => vendor}/linux/include/linux/if_link.h | 0 {src => vendor}/linux/include/linux/if_macvlan.h | 0 {src => vendor}/linux/include/linux/if_pppol2tp.h | 0 {src => vendor}/linux/include/linux/if_pppox.h | 0 {src => vendor}/linux/include/linux/if_tun.h | 0 {src => vendor}/linux/include/linux/if_tunnel.h | 0 {src => vendor}/linux/include/linux/if_vlan.h | 0 {src => vendor}/linux/include/linux/igmp.h | 0 {src => vendor}/linux/include/linux/ima.h | 0 {src => vendor}/linux/include/linux/in.h | 0 {src => vendor}/linux/include/linux/in6.h | 0 {src => vendor}/linux/include/linux/inet.h | 0 {src => vendor}/linux/include/linux/inet_diag.h | 0 {src => vendor}/linux/include/linux/inetdevice.h | 0 {src => vendor}/linux/include/linux/init.h | 0 {src => vendor}/linux/include/linux/init_task.h | 0 {src => vendor}/linux/include/linux/initrd.h | 0 {src => vendor}/linux/include/linux/input.h | 0 {src => vendor}/linux/include/linux/input/mt.h | 0 {src => vendor}/linux/include/linux/integrity.h | 0 {src => vendor}/linux/include/linux/interrupt.h | 0 .../linux/include/linux/interval_tree_generic.h | 0 {src => vendor}/linux/include/linux/io.h | 0 {src => vendor}/linux/include/linux/iocontext.h | 0 {src => vendor}/linux/include/linux/iomap.h | 0 {src => vendor}/linux/include/linux/ioport.h | 0 {src => vendor}/linux/include/linux/ioprio.h | 0 {src => vendor}/linux/include/linux/ip.h | 0 {src => vendor}/linux/include/linux/ipc.h | 0 {src => vendor}/linux/include/linux/ipc_namespace.h | 0 {src => vendor}/linux/include/linux/ipv6.h | 0 {src => vendor}/linux/include/linux/ipv6_route.h | 0 {src => vendor}/linux/include/linux/irq.h | 0 {src => vendor}/linux/include/linux/irq_cpustat.h | 0 {src => vendor}/linux/include/linux/irq_work.h | 0 {src => vendor}/linux/include/linux/irqdesc.h | 0 {src => vendor}/linux/include/linux/irqdomain.h | 0 {src => vendor}/linux/include/linux/irqflags.h | 0 {src => vendor}/linux/include/linux/irqhandler.h | 0 {src => vendor}/linux/include/linux/irqnr.h | 0 {src => vendor}/linux/include/linux/irqreturn.h | 0 {src => vendor}/linux/include/linux/jbd2.h | 0 {src => vendor}/linux/include/linux/jhash.h | 0 {src => vendor}/linux/include/linux/jiffies.h | 0 {src => vendor}/linux/include/linux/journal-head.h | 0 {src => vendor}/linux/include/linux/jump_label.h | 0 .../linux/include/linux/jump_label_ratelimit.h | 0 {src => vendor}/linux/include/linux/kallsyms.h | 0 {src => vendor}/linux/include/linux/kasan.h | 0 {src => vendor}/linux/include/linux/kbd_kern.h | 0 {src => vendor}/linux/include/linux/kbuild.h | 0 {src => vendor}/linux/include/linux/kconfig.h | 0 {src => vendor}/linux/include/linux/kcov.h | 0 {src => vendor}/linux/include/linux/kd.h | 0 {src => vendor}/linux/include/linux/kdb.h | 0 {src => vendor}/linux/include/linux/kdebug.h | 0 {src => vendor}/linux/include/linux/kdev_t.h | 0 {src => vendor}/linux/include/linux/kern_levels.h | 0 {src => vendor}/linux/include/linux/kernel.h | 0 {src => vendor}/linux/include/linux/kernel_stat.h | 0 {src => vendor}/linux/include/linux/kernfs.h | 0 {src => vendor}/linux/include/linux/kexec.h | 0 {src => vendor}/linux/include/linux/key.h | 0 {src => vendor}/linux/include/linux/keyboard.h | 0 {src => vendor}/linux/include/linux/kfifo.h | 0 {src => vendor}/linux/include/linux/kgdb.h | 0 {src => vendor}/linux/include/linux/khugepaged.h | 0 {src => vendor}/linux/include/linux/klist.h | 0 {src => vendor}/linux/include/linux/kmemcheck.h | 0 {src => vendor}/linux/include/linux/kmemleak.h | 0 {src => vendor}/linux/include/linux/kmod.h | 0 {src => vendor}/linux/include/linux/kmsg_dump.h | 0 {src => vendor}/linux/include/linux/kobj_map.h | 0 {src => vendor}/linux/include/linux/kobject.h | 0 {src => vendor}/linux/include/linux/kobject_ns.h | 0 {src => vendor}/linux/include/linux/kprobes.h | 0 {src => vendor}/linux/include/linux/kref.h | 0 {src => vendor}/linux/include/linux/ksm.h | 0 {src => vendor}/linux/include/linux/kthread.h | 0 {src => vendor}/linux/include/linux/ktime.h | 0 {src => vendor}/linux/include/linux/latencytop.h | 0 {src => vendor}/linux/include/linux/lcm.h | 0 {src => vendor}/linux/include/linux/leds.h | 0 {src => vendor}/linux/include/linux/libps2.h | 0 {src => vendor}/linux/include/linux/license.h | 0 {src => vendor}/linux/include/linux/linkage.h | 0 {src => vendor}/linux/include/linux/list.h | 0 {src => vendor}/linux/include/linux/list_bl.h | 0 {src => vendor}/linux/include/linux/list_lru.h | 0 {src => vendor}/linux/include/linux/list_nulls.h | 0 {src => vendor}/linux/include/linux/list_sort.h | 0 {src => vendor}/linux/include/linux/llist.h | 0 {src => vendor}/linux/include/linux/lockdep.h | 0 {src => vendor}/linux/include/linux/lockref.h | 0 {src => vendor}/linux/include/linux/log2.h | 0 {src => vendor}/linux/include/linux/lsm_hooks.h | 0 {src => vendor}/linux/include/linux/lzo.h | 0 {src => vendor}/linux/include/linux/math64.h | 0 {src => vendor}/linux/include/linux/mbcache.h | 0 {src => vendor}/linux/include/linux/mdio.h | 0 {src => vendor}/linux/include/linux/memblock.h | 0 {src => vendor}/linux/include/linux/memcontrol.h | 0 {src => vendor}/linux/include/linux/memory.h | 0 {src => vendor}/linux/include/linux/memory_hotplug.h | 0 {src => vendor}/linux/include/linux/mempolicy.h | 0 {src => vendor}/linux/include/linux/mempool.h | 0 {src => vendor}/linux/include/linux/memremap.h | 0 {src => vendor}/linux/include/linux/migrate.h | 0 {src => vendor}/linux/include/linux/migrate_mode.h | 0 {src => vendor}/linux/include/linux/mii.h | 0 {src => vendor}/linux/include/linux/miscdevice.h | 0 {src => vendor}/linux/include/linux/mm.h | 0 {src => vendor}/linux/include/linux/mm_inline.h | 0 {src => vendor}/linux/include/linux/mm_types.h | 0 {src => vendor}/linux/include/linux/mman.h | 0 {src => vendor}/linux/include/linux/mmdebug.h | 0 {src => vendor}/linux/include/linux/mmu_context.h | 0 {src => vendor}/linux/include/linux/mmu_notifier.h | 0 {src => vendor}/linux/include/linux/mmzone.h | 0 {src => vendor}/linux/include/linux/mnt_namespace.h | 0 {src => vendor}/linux/include/linux/mod_devicetable.h | 0 {src => vendor}/linux/include/linux/module.h | 0 {src => vendor}/linux/include/linux/moduleloader.h | 0 {src => vendor}/linux/include/linux/moduleparam.h | 0 {src => vendor}/linux/include/linux/mount.h | 0 {src => vendor}/linux/include/linux/mpage.h | 0 {src => vendor}/linux/include/linux/mpls.h | 0 {src => vendor}/linux/include/linux/mroute.h | 0 {src => vendor}/linux/include/linux/mroute6.h | 0 {src => vendor}/linux/include/linux/msdos_fs.h | 0 {src => vendor}/linux/include/linux/msi.h | 0 {src => vendor}/linux/include/linux/mutex.h | 0 {src => vendor}/linux/include/linux/namei.h | 0 {src => vendor}/linux/include/linux/net.h | 0 {src => vendor}/linux/include/linux/netdev_features.h | 0 {src => vendor}/linux/include/linux/netdevice.h | 0 {src => vendor}/linux/include/linux/netfilter.h | 0 {src => vendor}/linux/include/linux/netfilter_bridge.h | 0 {src => vendor}/linux/include/linux/netfilter_defs.h | 0 .../linux/include/linux/netfilter_ingress.h | 0 {src => vendor}/linux/include/linux/netfilter_ipv4.h | 0 {src => vendor}/linux/include/linux/netfilter_ipv6.h | 0 {src => vendor}/linux/include/linux/netlink.h | 0 {src => vendor}/linux/include/linux/netpoll.h | 0 {src => vendor}/linux/include/linux/nfs.h | 0 {src => vendor}/linux/include/linux/nfs3.h | 0 {src => vendor}/linux/include/linux/nfs4.h | 0 {src => vendor}/linux/include/linux/nfs_fs.h | 0 {src => vendor}/linux/include/linux/nfs_fs_i.h | 0 {src => vendor}/linux/include/linux/nfs_fs_sb.h | 0 {src => vendor}/linux/include/linux/nfs_xdr.h | 0 {src => vendor}/linux/include/linux/nfsacl.h | 0 {src => vendor}/linux/include/linux/nls.h | 0 {src => vendor}/linux/include/linux/nmi.h | 0 {src => vendor}/linux/include/linux/node.h | 0 {src => vendor}/linux/include/linux/nodemask.h | 0 {src => vendor}/linux/include/linux/notifier.h | 0 {src => vendor}/linux/include/linux/ns_common.h | 0 {src => vendor}/linux/include/linux/nsproxy.h | 0 {src => vendor}/linux/include/linux/numa.h | 0 {src => vendor}/linux/include/linux/of.h | 0 {src => vendor}/linux/include/linux/of_address.h | 0 {src => vendor}/linux/include/linux/of_device.h | 0 {src => vendor}/linux/include/linux/of_irq.h | 0 {src => vendor}/linux/include/linux/of_net.h | 0 {src => vendor}/linux/include/linux/of_platform.h | 0 {src => vendor}/linux/include/linux/once.h | 0 {src => vendor}/linux/include/linux/oom.h | 0 {src => vendor}/linux/include/linux/osq_lock.h | 0 .../linux/include/linux/page-flags-layout.h | 0 {src => vendor}/linux/include/linux/page-flags.h | 0 {src => vendor}/linux/include/linux/page-isolation.h | 0 {src => vendor}/linux/include/linux/page_counter.h | 0 {src => vendor}/linux/include/linux/page_ext.h | 0 {src => vendor}/linux/include/linux/page_idle.h | 0 {src => vendor}/linux/include/linux/page_owner.h | 0 {src => vendor}/linux/include/linux/page_ref.h | 0 {src => vendor}/linux/include/linux/pageblock-flags.h | 0 {src => vendor}/linux/include/linux/pagemap.h | 0 {src => vendor}/linux/include/linux/pagevec.h | 0 {src => vendor}/linux/include/linux/parser.h | 0 {src => vendor}/linux/include/linux/path.h | 0 {src => vendor}/linux/include/linux/pci-dma-compat.h | 0 {src => vendor}/linux/include/linux/pci.h | 0 {src => vendor}/linux/include/linux/pci_ids.h | 0 {src => vendor}/linux/include/linux/percpu-defs.h | 0 {src => vendor}/linux/include/linux/percpu-refcount.h | 0 {src => vendor}/linux/include/linux/percpu-rwsem.h | 0 {src => vendor}/linux/include/linux/percpu.h | 0 {src => vendor}/linux/include/linux/percpu_counter.h | 0 {src => vendor}/linux/include/linux/percpu_ida.h | 0 {src => vendor}/linux/include/linux/perf_event.h | 0 {src => vendor}/linux/include/linux/perf_regs.h | 0 {src => vendor}/linux/include/linux/personality.h | 0 {src => vendor}/linux/include/linux/pfn.h | 0 {src => vendor}/linux/include/linux/pfn_t.h | 0 {src => vendor}/linux/include/linux/phy.h | 0 {src => vendor}/linux/include/linux/phy_fixed.h | 0 {src => vendor}/linux/include/linux/pid.h | 0 {src => vendor}/linux/include/linux/pid_namespace.h | 0 {src => vendor}/linux/include/linux/pim.h | 0 {src => vendor}/linux/include/linux/pinctrl/devinfo.h | 0 {src => vendor}/linux/include/linux/pipe_fs_i.h | 0 {src => vendor}/linux/include/linux/platform_device.h | 0 {src => vendor}/linux/include/linux/plist.h | 0 {src => vendor}/linux/include/linux/pm.h | 0 {src => vendor}/linux/include/linux/pm_domain.h | 0 {src => vendor}/linux/include/linux/pm_qos.h | 0 {src => vendor}/linux/include/linux/pm_runtime.h | 0 {src => vendor}/linux/include/linux/pm_wakeup.h | 0 {src => vendor}/linux/include/linux/poison.h | 0 {src => vendor}/linux/include/linux/poll.h | 0 {src => vendor}/linux/include/linux/posix-clock.h | 0 {src => vendor}/linux/include/linux/posix-timers.h | 0 {src => vendor}/linux/include/linux/posix_acl.h | 0 {src => vendor}/linux/include/linux/posix_acl_xattr.h | 0 {src => vendor}/linux/include/linux/power_supply.h | 0 {src => vendor}/linux/include/linux/ppp_channel.h | 0 {src => vendor}/linux/include/linux/ppp_defs.h | 0 {src => vendor}/linux/include/linux/pr.h | 0 {src => vendor}/linux/include/linux/preempt.h | 0 {src => vendor}/linux/include/linux/prefetch.h | 0 {src => vendor}/linux/include/linux/printk.h | 0 {src => vendor}/linux/include/linux/proc_fs.h | 0 {src => vendor}/linux/include/linux/proc_ns.h | 0 {src => vendor}/linux/include/linux/profile.h | 0 {src => vendor}/linux/include/linux/projid.h | 0 {src => vendor}/linux/include/linux/property.h | 0 {src => vendor}/linux/include/linux/pstore.h | 0 {src => vendor}/linux/include/linux/ptp_classify.h | 0 {src => vendor}/linux/include/linux/ptrace.h | 0 {src => vendor}/linux/include/linux/pvclock_gtod.h | 0 {src => vendor}/linux/include/linux/quicklist.h | 0 {src => vendor}/linux/include/linux/quota.h | 0 {src => vendor}/linux/include/linux/quotaops.h | 0 {src => vendor}/linux/include/linux/radix-tree.h | 0 {src => vendor}/linux/include/linux/raid/pq.h | 0 {src => vendor}/linux/include/linux/raid/xor.h | 0 {src => vendor}/linux/include/linux/ramfs.h | 0 {src => vendor}/linux/include/linux/random.h | 0 {src => vendor}/linux/include/linux/range.h | 0 {src => vendor}/linux/include/linux/ratelimit.h | 0 {src => vendor}/linux/include/linux/rbtree.h | 0 {src => vendor}/linux/include/linux/rbtree_augmented.h | 0 {src => vendor}/linux/include/linux/rbtree_latch.h | 0 {src => vendor}/linux/include/linux/rcu_sync.h | 0 {src => vendor}/linux/include/linux/rculist.h | 0 {src => vendor}/linux/include/linux/rculist_bl.h | 0 {src => vendor}/linux/include/linux/rculist_nulls.h | 0 {src => vendor}/linux/include/linux/rcupdate.h | 0 {src => vendor}/linux/include/linux/rcutiny.h | 0 {src => vendor}/linux/include/linux/reboot.h | 0 {src => vendor}/linux/include/linux/reciprocal_div.h | 0 {src => vendor}/linux/include/linux/regset.h | 0 {src => vendor}/linux/include/linux/relay.h | 0 {src => vendor}/linux/include/linux/resource.h | 0 {src => vendor}/linux/include/linux/resource_ext.h | 0 {src => vendor}/linux/include/linux/rhashtable.h | 0 {src => vendor}/linux/include/linux/ring_buffer.h | 0 {src => vendor}/linux/include/linux/rmap.h | 0 {src => vendor}/linux/include/linux/root_dev.h | 0 {src => vendor}/linux/include/linux/rtc.h | 0 {src => vendor}/linux/include/linux/rtmutex.h | 0 {src => vendor}/linux/include/linux/rtnetlink.h | 0 {src => vendor}/linux/include/linux/rwlock.h | 0 {src => vendor}/linux/include/linux/rwlock_types.h | 0 {src => vendor}/linux/include/linux/rwsem-spinlock.h | 0 {src => vendor}/linux/include/linux/rwsem.h | 0 {src => vendor}/linux/include/linux/sbitmap.h | 0 {src => vendor}/linux/include/linux/scatterlist.h | 0 {src => vendor}/linux/include/linux/sched.h | 0 {src => vendor}/linux/include/linux/sched/deadline.h | 0 {src => vendor}/linux/include/linux/sched/prio.h | 0 {src => vendor}/linux/include/linux/sched/rt.h | 0 {src => vendor}/linux/include/linux/sched/sysctl.h | 0 {src => vendor}/linux/include/linux/sched_clock.h | 0 {src => vendor}/linux/include/linux/screen_info.h | 0 {src => vendor}/linux/include/linux/sctp.h | 0 {src => vendor}/linux/include/linux/seccomp.h | 0 {src => vendor}/linux/include/linux/securebits.h | 0 {src => vendor}/linux/include/linux/security.h | 0 {src => vendor}/linux/include/linux/selection.h | 0 {src => vendor}/linux/include/linux/selinux.h | 0 {src => vendor}/linux/include/linux/sem.h | 0 {src => vendor}/linux/include/linux/semaphore.h | 0 {src => vendor}/linux/include/linux/seq_buf.h | 0 {src => vendor}/linux/include/linux/seq_file.h | 0 {src => vendor}/linux/include/linux/seq_file_net.h | 0 {src => vendor}/linux/include/linux/seqlock.h | 0 {src => vendor}/linux/include/linux/serial.h | 0 {src => vendor}/linux/include/linux/serio.h | 0 {src => vendor}/linux/include/linux/sfi.h | 0 {src => vendor}/linux/include/linux/shm.h | 0 {src => vendor}/linux/include/linux/shmem_fs.h | 0 {src => vendor}/linux/include/linux/shrinker.h | 0 {src => vendor}/linux/include/linux/signal.h | 0 {src => vendor}/linux/include/linux/signalfd.h | 0 {src => vendor}/linux/include/linux/sizes.h | 0 {src => vendor}/linux/include/linux/skbuff.h | 0 {src => vendor}/linux/include/linux/slab.h | 0 {src => vendor}/linux/include/linux/slub_def.h | 0 {src => vendor}/linux/include/linux/smp.h | 0 {src => vendor}/linux/include/linux/smpboot.h | 0 {src => vendor}/linux/include/linux/sock_diag.h | 0 {src => vendor}/linux/include/linux/socket.h | 0 {src => vendor}/linux/include/linux/sort.h | 0 {src => vendor}/linux/include/linux/spinlock.h | 0 {src => vendor}/linux/include/linux/spinlock_api_up.h | 0 {src => vendor}/linux/include/linux/spinlock_types.h | 0 .../linux/include/linux/spinlock_types_up.h | 0 {src => vendor}/linux/include/linux/spinlock_up.h | 0 {src => vendor}/linux/include/linux/splice.h | 0 {src => vendor}/linux/include/linux/srcu.h | 0 {src => vendor}/linux/include/linux/stackdepot.h | 0 {src => vendor}/linux/include/linux/stackprotector.h | 0 {src => vendor}/linux/include/linux/stacktrace.h | 0 {src => vendor}/linux/include/linux/start_kernel.h | 0 {src => vendor}/linux/include/linux/stat.h | 0 {src => vendor}/linux/include/linux/statfs.h | 0 {src => vendor}/linux/include/linux/static_key.h | 0 {src => vendor}/linux/include/linux/stddef.h | 0 {src => vendor}/linux/include/linux/stop_machine.h | 0 {src => vendor}/linux/include/linux/string.h | 0 {src => vendor}/linux/include/linux/string_helpers.h | 0 {src => vendor}/linux/include/linux/stringhash.h | 0 {src => vendor}/linux/include/linux/stringify.h | 0 {src => vendor}/linux/include/linux/sunrpc/auth.h | 0 {src => vendor}/linux/include/linux/sunrpc/clnt.h | 0 {src => vendor}/linux/include/linux/sunrpc/debug.h | 0 {src => vendor}/linux/include/linux/sunrpc/gss_api.h | 0 {src => vendor}/linux/include/linux/sunrpc/msg_prot.h | 0 .../linux/include/linux/sunrpc/rpc_pipe_fs.h | 0 {src => vendor}/linux/include/linux/sunrpc/sched.h | 0 {src => vendor}/linux/include/linux/sunrpc/stats.h | 0 {src => vendor}/linux/include/linux/sunrpc/timer.h | 0 {src => vendor}/linux/include/linux/sunrpc/types.h | 0 {src => vendor}/linux/include/linux/sunrpc/xdr.h | 0 {src => vendor}/linux/include/linux/sunrpc/xprt.h | 0 .../linux/include/linux/sunrpc/xprtmultipath.h | 0 {src => vendor}/linux/include/linux/suspend.h | 0 {src => vendor}/linux/include/linux/swab.h | 0 {src => vendor}/linux/include/linux/swait.h | 0 {src => vendor}/linux/include/linux/swap.h | 0 {src => vendor}/linux/include/linux/swapops.h | 0 {src => vendor}/linux/include/linux/syscalls.h | 0 {src => vendor}/linux/include/linux/syscore_ops.h | 0 {src => vendor}/linux/include/linux/sysctl.h | 0 {src => vendor}/linux/include/linux/sysfs.h | 0 {src => vendor}/linux/include/linux/syslog.h | 0 {src => vendor}/linux/include/linux/sysrq.h | 0 .../linux/include/linux/task_io_accounting.h | 0 .../linux/include/linux/task_io_accounting_ops.h | 0 {src => vendor}/linux/include/linux/task_work.h | 0 {src => vendor}/linux/include/linux/taskstats_kern.h | 0 {src => vendor}/linux/include/linux/tcp.h | 0 {src => vendor}/linux/include/linux/textsearch.h | 0 {src => vendor}/linux/include/linux/thermal.h | 0 {src => vendor}/linux/include/linux/thread_info.h | 0 {src => vendor}/linux/include/linux/threads.h | 0 {src => vendor}/linux/include/linux/tick.h | 0 {src => vendor}/linux/include/linux/time.h | 0 {src => vendor}/linux/include/linux/time64.h | 0 {src => vendor}/linux/include/linux/timecounter.h | 0 .../linux/include/linux/timekeeper_internal.h | 0 {src => vendor}/linux/include/linux/timekeeping.h | 0 {src => vendor}/linux/include/linux/timer.h | 0 {src => vendor}/linux/include/linux/timerqueue.h | 0 {src => vendor}/linux/include/linux/timex.h | 0 {src => vendor}/linux/include/linux/topology.h | 0 {src => vendor}/linux/include/linux/trace_clock.h | 0 {src => vendor}/linux/include/linux/trace_events.h | 0 {src => vendor}/linux/include/linux/trace_seq.h | 0 {src => vendor}/linux/include/linux/tracehook.h | 0 {src => vendor}/linux/include/linux/tracepoint-defs.h | 0 {src => vendor}/linux/include/linux/tracepoint.h | 0 {src => vendor}/linux/include/linux/transport_class.h | 0 {src => vendor}/linux/include/linux/tsacct_kern.h | 0 {src => vendor}/linux/include/linux/tty.h | 0 {src => vendor}/linux/include/linux/tty_driver.h | 0 {src => vendor}/linux/include/linux/tty_flip.h | 0 {src => vendor}/linux/include/linux/tty_ldisc.h | 0 {src => vendor}/linux/include/linux/typecheck.h | 0 {src => vendor}/linux/include/linux/types.h | 0 {src => vendor}/linux/include/linux/u64_stats_sync.h | 0 {src => vendor}/linux/include/linux/uaccess.h | 0 {src => vendor}/linux/include/linux/udp.h | 0 {src => vendor}/linux/include/linux/uidgid.h | 0 {src => vendor}/linux/include/linux/uio.h | 0 .../linux/include/linux/unaligned/be_byteshift.h | 0 .../linux/include/linux/unaligned/generic.h | 0 .../linux/include/linux/unaligned/le_struct.h | 0 .../linux/include/linux/unaligned/packed_struct.h | 0 {src => vendor}/linux/include/linux/uprobes.h | 0 .../linux/include/linux/user-return-notifier.h | 0 {src => vendor}/linux/include/linux/user_namespace.h | 0 {src => vendor}/linux/include/linux/uts.h | 0 {src => vendor}/linux/include/linux/utsname.h | 0 {src => vendor}/linux/include/linux/uuid.h | 0 {src => vendor}/linux/include/linux/vfs.h | 0 {src => vendor}/linux/include/linux/virtio.h | 0 {src => vendor}/linux/include/linux/virtio_byteorder.h | 0 {src => vendor}/linux/include/linux/virtio_config.h | 0 {src => vendor}/linux/include/linux/virtio_mmio.h | 0 {src => vendor}/linux/include/linux/virtio_net.h | 0 {src => vendor}/linux/include/linux/virtio_ring.h | 0 {src => vendor}/linux/include/linux/vm_event_item.h | 0 {src => vendor}/linux/include/linux/vmacache.h | 0 {src => vendor}/linux/include/linux/vmalloc.h | 0 {src => vendor}/linux/include/linux/vmpressure.h | 0 {src => vendor}/linux/include/linux/vmstat.h | 0 {src => vendor}/linux/include/linux/vringh.h | 0 {src => vendor}/linux/include/linux/vt.h | 0 {src => vendor}/linux/include/linux/vt_buffer.h | 0 {src => vendor}/linux/include/linux/vt_kern.h | 0 {src => vendor}/linux/include/linux/vtime.h | 0 {src => vendor}/linux/include/linux/wait.h | 0 {src => vendor}/linux/include/linux/win_minmax.h | 0 {src => vendor}/linux/include/linux/wireless.h | 0 {src => vendor}/linux/include/linux/workqueue.h | 0 {src => vendor}/linux/include/linux/writeback.h | 0 {src => vendor}/linux/include/linux/ww_mutex.h | 0 {src => vendor}/linux/include/linux/xattr.h | 0 {src => vendor}/linux/include/linux/zconf.h | 0 {src => vendor}/linux/include/linux/zlib.h | 0 {src => vendor}/linux/include/linux/zutil.h | 0 {src => vendor}/linux/include/net/6lowpan.h | 0 {src => vendor}/linux/include/net/Space.h | 0 {src => vendor}/linux/include/net/addrconf.h | 0 {src => vendor}/linux/include/net/af_ieee802154.h | 0 {src => vendor}/linux/include/net/arp.h | 0 {src => vendor}/linux/include/net/ax25.h | 0 {src => vendor}/linux/include/net/busy_poll.h | 0 {src => vendor}/linux/include/net/calipso.h | 0 {src => vendor}/linux/include/net/cfg802154.h | 0 {src => vendor}/linux/include/net/checksum.h | 0 {src => vendor}/linux/include/net/cipso_ipv4.h | 0 {src => vendor}/linux/include/net/cls_cgroup.h | 0 {src => vendor}/linux/include/net/compat.h | 0 {src => vendor}/linux/include/net/dsa.h | 0 {src => vendor}/linux/include/net/dsfield.h | 0 {src => vendor}/linux/include/net/dst.h | 0 {src => vendor}/linux/include/net/dst_cache.h | 0 {src => vendor}/linux/include/net/dst_metadata.h | 0 {src => vendor}/linux/include/net/dst_ops.h | 0 {src => vendor}/linux/include/net/fib_rules.h | 0 {src => vendor}/linux/include/net/firewire.h | 0 {src => vendor}/linux/include/net/flow.h | 0 {src => vendor}/linux/include/net/flow_dissector.h | 0 {src => vendor}/linux/include/net/flowcache.h | 0 {src => vendor}/linux/include/net/gen_stats.h | 0 {src => vendor}/linux/include/net/genetlink.h | 0 {src => vendor}/linux/include/net/gre.h | 0 {src => vendor}/linux/include/net/gro_cells.h | 0 {src => vendor}/linux/include/net/icmp.h | 0 {src => vendor}/linux/include/net/if_inet6.h | 0 .../linux/include/net/inet6_connection_sock.h | 0 {src => vendor}/linux/include/net/inet6_hashtables.h | 0 {src => vendor}/linux/include/net/inet_common.h | 0 .../linux/include/net/inet_connection_sock.h | 0 {src => vendor}/linux/include/net/inet_ecn.h | 0 {src => vendor}/linux/include/net/inet_frag.h | 0 {src => vendor}/linux/include/net/inet_hashtables.h | 0 {src => vendor}/linux/include/net/inet_sock.h | 0 {src => vendor}/linux/include/net/inet_timewait_sock.h | 0 {src => vendor}/linux/include/net/inetpeer.h | 0 {src => vendor}/linux/include/net/ip.h | 0 {src => vendor}/linux/include/net/ip6_checksum.h | 0 {src => vendor}/linux/include/net/ip6_fib.h | 0 {src => vendor}/linux/include/net/ip6_route.h | 0 {src => vendor}/linux/include/net/ip6_tunnel.h | 0 {src => vendor}/linux/include/net/ip_fib.h | 0 {src => vendor}/linux/include/net/ip_tunnels.h | 0 {src => vendor}/linux/include/net/ipconfig.h | 0 {src => vendor}/linux/include/net/ipv6.h | 0 {src => vendor}/linux/include/net/iw_handler.h | 0 {src => vendor}/linux/include/net/l3mdev.h | 0 {src => vendor}/linux/include/net/lwtunnel.h | 0 {src => vendor}/linux/include/net/mac802154.h | 0 {src => vendor}/linux/include/net/mld.h | 0 {src => vendor}/linux/include/net/mpls.h | 0 {src => vendor}/linux/include/net/ndisc.h | 0 {src => vendor}/linux/include/net/neighbour.h | 0 {src => vendor}/linux/include/net/net_namespace.h | 0 {src => vendor}/linux/include/net/net_ratelimit.h | 0 {src => vendor}/linux/include/net/netevent.h | 0 {src => vendor}/linux/include/net/netlabel.h | 0 {src => vendor}/linux/include/net/netlink.h | 0 {src => vendor}/linux/include/net/netns/core.h | 0 {src => vendor}/linux/include/net/netns/dccp.h | 0 {src => vendor}/linux/include/net/netns/generic.h | 0 {src => vendor}/linux/include/net/netns/hash.h | 0 .../linux/include/net/netns/ieee802154_6lowpan.h | 0 {src => vendor}/linux/include/net/netns/ipv4.h | 0 {src => vendor}/linux/include/net/netns/ipv6.h | 0 {src => vendor}/linux/include/net/netns/mib.h | 0 {src => vendor}/linux/include/net/netns/mpls.h | 0 {src => vendor}/linux/include/net/netns/netfilter.h | 0 {src => vendor}/linux/include/net/netns/nftables.h | 0 {src => vendor}/linux/include/net/netns/packet.h | 0 {src => vendor}/linux/include/net/netns/sctp.h | 0 {src => vendor}/linux/include/net/netns/unix.h | 0 {src => vendor}/linux/include/net/netns/x_tables.h | 0 {src => vendor}/linux/include/net/netns/xfrm.h | 0 {src => vendor}/linux/include/net/netprio_cgroup.h | 0 {src => vendor}/linux/include/net/netrom.h | 0 {src => vendor}/linux/include/net/nexthop.h | 0 {src => vendor}/linux/include/net/nl802154.h | 0 {src => vendor}/linux/include/net/ping.h | 0 {src => vendor}/linux/include/net/pkt_sched.h | 0 {src => vendor}/linux/include/net/pptp.h | 0 {src => vendor}/linux/include/net/protocol.h | 0 {src => vendor}/linux/include/net/raw.h | 0 {src => vendor}/linux/include/net/rawv6.h | 0 {src => vendor}/linux/include/net/request_sock.h | 0 {src => vendor}/linux/include/net/route.h | 0 {src => vendor}/linux/include/net/rtnetlink.h | 0 {src => vendor}/linux/include/net/sch_generic.h | 0 {src => vendor}/linux/include/net/scm.h | 0 {src => vendor}/linux/include/net/secure_seq.h | 0 {src => vendor}/linux/include/net/snmp.h | 0 {src => vendor}/linux/include/net/sock.h | 0 {src => vendor}/linux/include/net/sock_reuseport.h | 0 {src => vendor}/linux/include/net/switchdev.h | 0 {src => vendor}/linux/include/net/tcp.h | 0 {src => vendor}/linux/include/net/tcp_states.h | 0 {src => vendor}/linux/include/net/timewait_sock.h | 0 {src => vendor}/linux/include/net/transp_v6.h | 0 {src => vendor}/linux/include/net/tso.h | 0 {src => vendor}/linux/include/net/udp.h | 0 {src => vendor}/linux/include/net/udplite.h | 0 {src => vendor}/linux/include/net/wext.h | 0 {src => vendor}/linux/include/net/xfrm.h | 0 {src => vendor}/linux/include/scsi/fc/fc_fcoe.h | 0 {src => vendor}/linux/include/scsi/scsi.h | 0 {src => vendor}/linux/include/scsi/scsi_cmnd.h | 0 {src => vendor}/linux/include/scsi/scsi_common.h | 0 {src => vendor}/linux/include/scsi/scsi_device.h | 0 {src => vendor}/linux/include/scsi/scsi_ioctl.h | 0 {src => vendor}/linux/include/scsi/scsi_proto.h | 0 {src => vendor}/linux/include/scsi/sg.h | 0 {src => vendor}/linux/include/trace/define_trace.h | 0 {src => vendor}/linux/include/trace/events/block.h | 0 {src => vendor}/linux/include/trace/events/btrfs.h | 0 {src => vendor}/linux/include/trace/events/cpuhp.h | 0 {src => vendor}/linux/include/trace/events/ext4.h | 0 {src => vendor}/linux/include/trace/events/fib.h | 0 {src => vendor}/linux/include/trace/events/fib6.h | 0 {src => vendor}/linux/include/trace/events/filemap.h | 0 {src => vendor}/linux/include/trace/events/irq.h | 0 {src => vendor}/linux/include/trace/events/jbd2.h | 0 {src => vendor}/linux/include/trace/events/kmem.h | 0 {src => vendor}/linux/include/trace/events/mmflags.h | 0 {src => vendor}/linux/include/trace/events/module.h | 0 {src => vendor}/linux/include/trace/events/napi.h | 0 {src => vendor}/linux/include/trace/events/net.h | 0 {src => vendor}/linux/include/trace/events/oom.h | 0 {src => vendor}/linux/include/trace/events/pagemap.h | 0 {src => vendor}/linux/include/trace/events/power.h | 0 {src => vendor}/linux/include/trace/events/printk.h | 0 {src => vendor}/linux/include/trace/events/random.h | 0 {src => vendor}/linux/include/trace/events/rcu.h | 0 {src => vendor}/linux/include/trace/events/sched.h | 0 {src => vendor}/linux/include/trace/events/signal.h | 0 {src => vendor}/linux/include/trace/events/skb.h | 0 {src => vendor}/linux/include/trace/events/sock.h | 0 {src => vendor}/linux/include/trace/events/task.h | 0 {src => vendor}/linux/include/trace/events/timer.h | 0 {src => vendor}/linux/include/trace/events/udp.h | 0 {src => vendor}/linux/include/trace/events/vmscan.h | 0 {src => vendor}/linux/include/trace/events/workqueue.h | 0 {src => vendor}/linux/include/trace/events/writeback.h | 0 {src => vendor}/linux/include/trace/syscall.h | 0 .../linux/include/uapi/asm-generic/Kbuild.asm | 0 .../linux/include/uapi/asm-generic/auxvec.h | 0 .../linux/include/uapi/asm-generic/errno-base.h | 0 {src => vendor}/linux/include/uapi/asm-generic/errno.h | 0 {src => vendor}/linux/include/uapi/asm-generic/fcntl.h | 0 .../linux/include/uapi/asm-generic/int-ll64.h | 0 {src => vendor}/linux/include/uapi/asm-generic/ioctl.h | 0 .../linux/include/uapi/asm-generic/ioctls.h | 0 .../linux/include/uapi/asm-generic/ipcbuf.h | 0 .../linux/include/uapi/asm-generic/mman-common.h | 0 {src => vendor}/linux/include/uapi/asm-generic/mman.h | 0 .../linux/include/uapi/asm-generic/msgbuf.h | 0 {src => vendor}/linux/include/uapi/asm-generic/param.h | 0 {src => vendor}/linux/include/uapi/asm-generic/poll.h | 0 .../linux/include/uapi/asm-generic/posix_types.h | 0 .../linux/include/uapi/asm-generic/resource.h | 0 .../linux/include/uapi/asm-generic/sembuf.h | 0 .../linux/include/uapi/asm-generic/shmbuf.h | 0 .../linux/include/uapi/asm-generic/shmparam.h | 0 .../linux/include/uapi/asm-generic/siginfo.h | 0 .../linux/include/uapi/asm-generic/signal-defs.h | 0 .../linux/include/uapi/asm-generic/signal.h | 0 .../linux/include/uapi/asm-generic/socket.h | 0 .../linux/include/uapi/asm-generic/sockios.h | 0 {src => vendor}/linux/include/uapi/asm-generic/stat.h | 0 .../linux/include/uapi/asm-generic/statfs.h | 0 {src => vendor}/linux/include/uapi/asm-generic/swab.h | 0 .../linux/include/uapi/asm-generic/termbits.h | 0 .../linux/include/uapi/asm-generic/termios.h | 0 {src => vendor}/linux/include/uapi/asm-generic/types.h | 0 .../linux/include/uapi/asm-generic/unistd.h | 0 {src => vendor}/linux/include/uapi/linux/acct.h | 0 {src => vendor}/linux/include/uapi/linux/aio_abi.h | 0 {src => vendor}/linux/include/uapi/linux/atalk.h | 0 {src => vendor}/linux/include/uapi/linux/audit.h | 0 {src => vendor}/linux/include/uapi/linux/auxvec.h | 0 {src => vendor}/linux/include/uapi/linux/ax25.h | 0 {src => vendor}/linux/include/uapi/linux/binfmts.h | 0 {src => vendor}/linux/include/uapi/linux/blkpg.h | 0 .../linux/include/uapi/linux/blktrace_api.h | 0 {src => vendor}/linux/include/uapi/linux/bpf.h | 0 {src => vendor}/linux/include/uapi/linux/bpf_common.h | 0 {src => vendor}/linux/include/uapi/linux/bsg.h | 0 {src => vendor}/linux/include/uapi/linux/btrfs.h | 0 {src => vendor}/linux/include/uapi/linux/btrfs_tree.h | 0 .../linux/include/uapi/linux/byteorder/big_endian.h | 0 .../linux/include/uapi/linux/byteorder/little_endian.h | 0 {src => vendor}/linux/include/uapi/linux/capability.h | 0 {src => vendor}/linux/include/uapi/linux/cdrom.h | 0 {src => vendor}/linux/include/uapi/linux/cgroupstats.h | 0 {src => vendor}/linux/include/uapi/linux/cn_proc.h | 0 {src => vendor}/linux/include/uapi/linux/const.h | 0 {src => vendor}/linux/include/uapi/linux/cryptouser.h | 0 {src => vendor}/linux/include/uapi/linux/dccp.h | 0 {src => vendor}/linux/include/uapi/linux/dqblk_xfs.h | 0 {src => vendor}/linux/include/uapi/linux/elf-em.h | 0 {src => vendor}/linux/include/uapi/linux/elf.h | 0 {src => vendor}/linux/include/uapi/linux/errno.h | 0 {src => vendor}/linux/include/uapi/linux/errqueue.h | 0 {src => vendor}/linux/include/uapi/linux/ethtool.h | 0 {src => vendor}/linux/include/uapi/linux/eventpoll.h | 0 {src => vendor}/linux/include/uapi/linux/falloc.h | 0 {src => vendor}/linux/include/uapi/linux/fcntl.h | 0 {src => vendor}/linux/include/uapi/linux/fd.h | 0 {src => vendor}/linux/include/uapi/linux/fib_rules.h | 0 {src => vendor}/linux/include/uapi/linux/fiemap.h | 0 {src => vendor}/linux/include/uapi/linux/filter.h | 0 {src => vendor}/linux/include/uapi/linux/fs.h | 0 {src => vendor}/linux/include/uapi/linux/futex.h | 0 {src => vendor}/linux/include/uapi/linux/gen_stats.h | 0 {src => vendor}/linux/include/uapi/linux/genetlink.h | 0 {src => vendor}/linux/include/uapi/linux/hdlc/ioctl.h | 0 {src => vendor}/linux/include/uapi/linux/hdreg.h | 0 {src => vendor}/linux/include/uapi/linux/hid.h | 0 {src => vendor}/linux/include/uapi/linux/hiddev.h | 0 {src => vendor}/linux/include/uapi/linux/hidraw.h | 0 .../linux/include/uapi/linux/hw_breakpoint.h | 0 {src => vendor}/linux/include/uapi/linux/icmp.h | 0 {src => vendor}/linux/include/uapi/linux/icmpv6.h | 0 {src => vendor}/linux/include/uapi/linux/if.h | 0 {src => vendor}/linux/include/uapi/linux/if_addr.h | 0 .../linux/include/uapi/linux/if_addrlabel.h | 0 {src => vendor}/linux/include/uapi/linux/if_arcnet.h | 0 {src => vendor}/linux/include/uapi/linux/if_arp.h | 0 {src => vendor}/linux/include/uapi/linux/if_bonding.h | 0 {src => vendor}/linux/include/uapi/linux/if_bridge.h | 0 {src => vendor}/linux/include/uapi/linux/if_ether.h | 0 {src => vendor}/linux/include/uapi/linux/if_fddi.h | 0 {src => vendor}/linux/include/uapi/linux/if_frad.h | 0 .../linux/include/uapi/linux/if_infiniband.h | 0 {src => vendor}/linux/include/uapi/linux/if_link.h | 0 {src => vendor}/linux/include/uapi/linux/if_packet.h | 0 {src => vendor}/linux/include/uapi/linux/if_pppol2tp.h | 0 {src => vendor}/linux/include/uapi/linux/if_pppox.h | 0 {src => vendor}/linux/include/uapi/linux/if_tun.h | 0 {src => vendor}/linux/include/uapi/linux/if_tunnel.h | 0 {src => vendor}/linux/include/uapi/linux/if_vlan.h | 0 {src => vendor}/linux/include/uapi/linux/igmp.h | 0 {src => vendor}/linux/include/uapi/linux/in.h | 0 {src => vendor}/linux/include/uapi/linux/in6.h | 0 {src => vendor}/linux/include/uapi/linux/in_route.h | 0 {src => vendor}/linux/include/uapi/linux/inet_diag.h | 0 .../linux/include/uapi/linux/input-event-codes.h | 0 {src => vendor}/linux/include/uapi/linux/input.h | 0 {src => vendor}/linux/include/uapi/linux/ioctl.h | 0 {src => vendor}/linux/include/uapi/linux/ip.h | 0 {src => vendor}/linux/include/uapi/linux/ip6_tunnel.h | 0 {src => vendor}/linux/include/uapi/linux/ipc.h | 0 {src => vendor}/linux/include/uapi/linux/ipsec.h | 0 {src => vendor}/linux/include/uapi/linux/ipv6.h | 0 {src => vendor}/linux/include/uapi/linux/ipv6_route.h | 0 {src => vendor}/linux/include/uapi/linux/irqnr.h | 0 {src => vendor}/linux/include/uapi/linux/kcov.h | 0 {src => vendor}/linux/include/uapi/linux/kd.h | 0 {src => vendor}/linux/include/uapi/linux/kdev_t.h | 0 {src => vendor}/linux/include/uapi/linux/kernel.h | 0 {src => vendor}/linux/include/uapi/linux/kexec.h | 0 {src => vendor}/linux/include/uapi/linux/keyboard.h | 0 {src => vendor}/linux/include/uapi/linux/keyctl.h | 0 {src => vendor}/linux/include/uapi/linux/libc-compat.h | 0 {src => vendor}/linux/include/uapi/linux/limits.h | 0 {src => vendor}/linux/include/uapi/linux/lwtunnel.h | 0 {src => vendor}/linux/include/uapi/linux/magic.h | 0 {src => vendor}/linux/include/uapi/linux/major.h | 0 {src => vendor}/linux/include/uapi/linux/mdio.h | 0 {src => vendor}/linux/include/uapi/linux/membarrier.h | 0 {src => vendor}/linux/include/uapi/linux/mempolicy.h | 0 {src => vendor}/linux/include/uapi/linux/mii.h | 0 {src => vendor}/linux/include/uapi/linux/mman.h | 0 {src => vendor}/linux/include/uapi/linux/mpls.h | 0 {src => vendor}/linux/include/uapi/linux/mqueue.h | 0 {src => vendor}/linux/include/uapi/linux/mroute.h | 0 {src => vendor}/linux/include/uapi/linux/mroute6.h | 0 {src => vendor}/linux/include/uapi/linux/msdos_fs.h | 0 {src => vendor}/linux/include/uapi/linux/msg.h | 0 {src => vendor}/linux/include/uapi/linux/neighbour.h | 0 {src => vendor}/linux/include/uapi/linux/net.h | 0 .../linux/include/uapi/linux/net_namespace.h | 0 {src => vendor}/linux/include/uapi/linux/net_tstamp.h | 0 {src => vendor}/linux/include/uapi/linux/netconf.h | 0 {src => vendor}/linux/include/uapi/linux/netdevice.h | 0 {src => vendor}/linux/include/uapi/linux/netfilter.h | 0 .../linux/include/uapi/linux/netfilter_arp.h | 0 .../linux/include/uapi/linux/netfilter_bridge.h | 0 .../linux/include/uapi/linux/netfilter_ipv4.h | 0 .../linux/include/uapi/linux/netfilter_ipv6.h | 0 {src => vendor}/linux/include/uapi/linux/netlink.h | 0 {src => vendor}/linux/include/uapi/linux/netrom.h | 0 {src => vendor}/linux/include/uapi/linux/nfs.h | 0 {src => vendor}/linux/include/uapi/linux/nfs2.h | 0 {src => vendor}/linux/include/uapi/linux/nfs3.h | 0 {src => vendor}/linux/include/uapi/linux/nfs4.h | 0 {src => vendor}/linux/include/uapi/linux/nfs_fs.h | 0 {src => vendor}/linux/include/uapi/linux/nfs_mount.h | 0 {src => vendor}/linux/include/uapi/linux/nfsacl.h | 0 {src => vendor}/linux/include/uapi/linux/nsfs.h | 0 {src => vendor}/linux/include/uapi/linux/oom.h | 0 {src => vendor}/linux/include/uapi/linux/param.h | 0 {src => vendor}/linux/include/uapi/linux/pci.h | 0 {src => vendor}/linux/include/uapi/linux/pci_regs.h | 0 {src => vendor}/linux/include/uapi/linux/perf_event.h | 0 {src => vendor}/linux/include/uapi/linux/personality.h | 0 {src => vendor}/linux/include/uapi/linux/pfkeyv2.h | 0 {src => vendor}/linux/include/uapi/linux/pkt_cls.h | 0 {src => vendor}/linux/include/uapi/linux/pkt_sched.h | 0 {src => vendor}/linux/include/uapi/linux/poll.h | 0 {src => vendor}/linux/include/uapi/linux/posix_acl.h | 0 .../linux/include/uapi/linux/posix_acl_xattr.h | 0 {src => vendor}/linux/include/uapi/linux/posix_types.h | 0 {src => vendor}/linux/include/uapi/linux/ppp_defs.h | 0 {src => vendor}/linux/include/uapi/linux/pr.h | 0 {src => vendor}/linux/include/uapi/linux/prctl.h | 0 {src => vendor}/linux/include/uapi/linux/ptrace.h | 0 {src => vendor}/linux/include/uapi/linux/quota.h | 0 {src => vendor}/linux/include/uapi/linux/random.h | 0 {src => vendor}/linux/include/uapi/linux/raw.h | 0 {src => vendor}/linux/include/uapi/linux/reboot.h | 0 {src => vendor}/linux/include/uapi/linux/resource.h | 0 {src => vendor}/linux/include/uapi/linux/route.h | 0 {src => vendor}/linux/include/uapi/linux/rtc.h | 0 {src => vendor}/linux/include/uapi/linux/rtnetlink.h | 0 {src => vendor}/linux/include/uapi/linux/sched.h | 0 {src => vendor}/linux/include/uapi/linux/screen_info.h | 0 {src => vendor}/linux/include/uapi/linux/sctp.h | 0 {src => vendor}/linux/include/uapi/linux/seccomp.h | 0 {src => vendor}/linux/include/uapi/linux/securebits.h | 0 {src => vendor}/linux/include/uapi/linux/sem.h | 0 {src => vendor}/linux/include/uapi/linux/serial.h | 0 {src => vendor}/linux/include/uapi/linux/serio.h | 0 {src => vendor}/linux/include/uapi/linux/shm.h | 0 {src => vendor}/linux/include/uapi/linux/signal.h | 0 {src => vendor}/linux/include/uapi/linux/signalfd.h | 0 {src => vendor}/linux/include/uapi/linux/snmp.h | 0 {src => vendor}/linux/include/uapi/linux/sock_diag.h | 0 {src => vendor}/linux/include/uapi/linux/socket.h | 0 {src => vendor}/linux/include/uapi/linux/sockios.h | 0 {src => vendor}/linux/include/uapi/linux/stat.h | 0 {src => vendor}/linux/include/uapi/linux/stddef.h | 0 {src => vendor}/linux/include/uapi/linux/string.h | 0 .../linux/include/uapi/linux/sunrpc/debug.h | 0 {src => vendor}/linux/include/uapi/linux/swab.h | 0 {src => vendor}/linux/include/uapi/linux/sysctl.h | 0 {src => vendor}/linux/include/uapi/linux/sysinfo.h | 0 {src => vendor}/linux/include/uapi/linux/taskstats.h | 0 {src => vendor}/linux/include/uapi/linux/tcp.h | 0 {src => vendor}/linux/include/uapi/linux/tcp_metrics.h | 0 {src => vendor}/linux/include/uapi/linux/termios.h | 0 {src => vendor}/linux/include/uapi/linux/thermal.h | 0 {src => vendor}/linux/include/uapi/linux/time.h | 0 {src => vendor}/linux/include/uapi/linux/times.h | 0 {src => vendor}/linux/include/uapi/linux/timex.h | 0 {src => vendor}/linux/include/uapi/linux/tiocl.h | 0 {src => vendor}/linux/include/uapi/linux/tty.h | 0 {src => vendor}/linux/include/uapi/linux/tty_flags.h | 0 {src => vendor}/linux/include/uapi/linux/types.h | 0 {src => vendor}/linux/include/uapi/linux/udp.h | 0 {src => vendor}/linux/include/uapi/linux/uio.h | 0 {src => vendor}/linux/include/uapi/linux/un.h | 0 {src => vendor}/linux/include/uapi/linux/unistd.h | 0 {src => vendor}/linux/include/uapi/linux/utime.h | 0 {src => vendor}/linux/include/uapi/linux/utsname.h | 0 {src => vendor}/linux/include/uapi/linux/uuid.h | 0 {src => vendor}/linux/include/uapi/linux/virtio_blk.h | 0 .../linux/include/uapi/linux/virtio_config.h | 0 {src => vendor}/linux/include/uapi/linux/virtio_ids.h | 0 {src => vendor}/linux/include/uapi/linux/virtio_net.h | 0 {src => vendor}/linux/include/uapi/linux/virtio_ring.h | 0 .../linux/include/uapi/linux/virtio_types.h | 0 {src => vendor}/linux/include/uapi/linux/vt.h | 0 {src => vendor}/linux/include/uapi/linux/wait.h | 0 {src => vendor}/linux/include/uapi/linux/wireless.h | 0 {src => vendor}/linux/include/uapi/linux/xattr.h | 0 {src => vendor}/linux/include/uapi/linux/xfrm.h | 0 {src => vendor}/linux/include/xen/xen.h | 0 {src => vendor}/linux/init/Kconfig | 0 {src => vendor}/linux/init/Makefile | 0 {src => vendor}/linux/init/do_mounts.c | 0 {src => vendor}/linux/init/do_mounts.h | 0 {src => vendor}/linux/init/init_task.c | 0 {src => vendor}/linux/init/main.c | 0 {src => vendor}/linux/init/noinitramfs.c | 0 {src => vendor}/linux/init/version.c | 0 {src => vendor}/linux/ipc/Makefile | 0 {src => vendor}/linux/kernel/.gitignore | 0 {src => vendor}/linux/kernel/Kconfig.hz | 0 {src => vendor}/linux/kernel/Kconfig.locks | 0 {src => vendor}/linux/kernel/Kconfig.preempt | 0 {src => vendor}/linux/kernel/Makefile | 0 {src => vendor}/linux/kernel/async.c | 0 {src => vendor}/linux/kernel/audit.h | 0 {src => vendor}/linux/kernel/bounds.c | 0 {src => vendor}/linux/kernel/bpf/Makefile | 0 {src => vendor}/linux/kernel/bpf/core.c | 0 {src => vendor}/linux/kernel/capability.c | 0 {src => vendor}/linux/kernel/cpu.c | 0 {src => vendor}/linux/kernel/cred.c | 0 {src => vendor}/linux/kernel/debug/kdb/.gitignore | 0 {src => vendor}/linux/kernel/exec_domain.c | 0 {src => vendor}/linux/kernel/exit.c | 0 {src => vendor}/linux/kernel/extable.c | 0 {src => vendor}/linux/kernel/fork.c | 0 {src => vendor}/linux/kernel/gcov/Kconfig | 0 {src => vendor}/linux/kernel/groups.c | 0 {src => vendor}/linux/kernel/irq/Kconfig | 0 {src => vendor}/linux/kernel/irq/Makefile | 0 {src => vendor}/linux/kernel/irq/chip.c | 0 {src => vendor}/linux/kernel/irq/debug.h | 0 {src => vendor}/linux/kernel/irq/devres.c | 0 {src => vendor}/linux/kernel/irq/dummychip.c | 0 {src => vendor}/linux/kernel/irq/handle.c | 0 {src => vendor}/linux/kernel/irq/internals.h | 0 {src => vendor}/linux/kernel/irq/irqdesc.c | 0 {src => vendor}/linux/kernel/irq/manage.c | 0 {src => vendor}/linux/kernel/irq/proc.c | 0 {src => vendor}/linux/kernel/irq/resend.c | 0 {src => vendor}/linux/kernel/irq/settings.h | 0 {src => vendor}/linux/kernel/irq/spurious.c | 0 {src => vendor}/linux/kernel/irq_work.c | 0 {src => vendor}/linux/kernel/kallsyms.c | 0 {src => vendor}/linux/kernel/kmod.c | 0 {src => vendor}/linux/kernel/ksysfs.c | 0 {src => vendor}/linux/kernel/kthread.c | 0 {src => vendor}/linux/kernel/livepatch/Makefile | 0 {src => vendor}/linux/kernel/locking/Makefile | 0 {src => vendor}/linux/kernel/locking/mutex.c | 0 {src => vendor}/linux/kernel/locking/mutex.h | 0 {src => vendor}/linux/kernel/locking/percpu-rwsem.c | 0 {src => vendor}/linux/kernel/locking/rwsem-spinlock.c | 0 {src => vendor}/linux/kernel/locking/rwsem.c | 0 {src => vendor}/linux/kernel/locking/rwsem.h | 0 {src => vendor}/linux/kernel/locking/semaphore.c | 0 {src => vendor}/linux/kernel/membarrier.c | 0 {src => vendor}/linux/kernel/memremap.c | 0 {src => vendor}/linux/kernel/notifier.c | 0 {src => vendor}/linux/kernel/nsproxy.c | 0 {src => vendor}/linux/kernel/panic.c | 0 {src => vendor}/linux/kernel/params.c | 0 {src => vendor}/linux/kernel/pid.c | 0 {src => vendor}/linux/kernel/power/Makefile | 0 {src => vendor}/linux/kernel/power/qos.c | 0 {src => vendor}/linux/kernel/printk/Makefile | 0 {src => vendor}/linux/kernel/printk/braille.h | 0 {src => vendor}/linux/kernel/printk/console_cmdline.h | 0 {src => vendor}/linux/kernel/printk/internal.h | 0 {src => vendor}/linux/kernel/printk/printk.c | 0 {src => vendor}/linux/kernel/ptrace.c | 0 {src => vendor}/linux/kernel/range.c | 0 {src => vendor}/linux/kernel/rcu/Makefile | 0 {src => vendor}/linux/kernel/rcu/rcu.h | 0 {src => vendor}/linux/kernel/rcu/srcu.c | 0 {src => vendor}/linux/kernel/rcu/sync.c | 0 {src => vendor}/linux/kernel/rcu/tiny.c | 0 {src => vendor}/linux/kernel/rcu/tiny_plugin.h | 0 {src => vendor}/linux/kernel/rcu/update.c | 0 {src => vendor}/linux/kernel/reboot.c | 0 {src => vendor}/linux/kernel/resource.c | 0 {src => vendor}/linux/kernel/sched/Makefile | 0 {src => vendor}/linux/kernel/sched/auto_group.h | 0 {src => vendor}/linux/kernel/sched/clock.c | 0 {src => vendor}/linux/kernel/sched/completion.c | 0 {src => vendor}/linux/kernel/sched/core.c | 0 {src => vendor}/linux/kernel/sched/cpuacct.h | 0 {src => vendor}/linux/kernel/sched/cpudeadline.h | 0 {src => vendor}/linux/kernel/sched/cpupri.h | 0 {src => vendor}/linux/kernel/sched/cputime.c | 0 {src => vendor}/linux/kernel/sched/deadline.c | 0 {src => vendor}/linux/kernel/sched/debug.c | 0 {src => vendor}/linux/kernel/sched/fair.c | 0 {src => vendor}/linux/kernel/sched/features.h | 0 {src => vendor}/linux/kernel/sched/idle.c | 0 {src => vendor}/linux/kernel/sched/idle_task.c | 0 {src => vendor}/linux/kernel/sched/loadavg.c | 0 {src => vendor}/linux/kernel/sched/rt.c | 0 {src => vendor}/linux/kernel/sched/sched.h | 0 {src => vendor}/linux/kernel/sched/stats.h | 0 {src => vendor}/linux/kernel/sched/stop_task.c | 0 {src => vendor}/linux/kernel/sched/swait.c | 0 {src => vendor}/linux/kernel/sched/wait.c | 0 {src => vendor}/linux/kernel/signal.c | 0 {src => vendor}/linux/kernel/smpboot.c | 0 {src => vendor}/linux/kernel/smpboot.h | 0 {src => vendor}/linux/kernel/softirq.c | 0 {src => vendor}/linux/kernel/sys.c | 0 {src => vendor}/linux/kernel/sys_ni.c | 0 {src => vendor}/linux/kernel/sysctl.c | 0 {src => vendor}/linux/kernel/sysctl_binary.c | 0 {src => vendor}/linux/kernel/task_work.c | 0 {src => vendor}/linux/kernel/time/Kconfig | 0 {src => vendor}/linux/kernel/time/Makefile | 0 {src => vendor}/linux/kernel/time/alarmtimer.c | 0 {src => vendor}/linux/kernel/time/clockevents.c | 0 {src => vendor}/linux/kernel/time/clocksource.c | 0 {src => vendor}/linux/kernel/time/hrtimer.c | 0 {src => vendor}/linux/kernel/time/itimer.c | 0 {src => vendor}/linux/kernel/time/jiffies.c | 0 {src => vendor}/linux/kernel/time/ntp.c | 0 {src => vendor}/linux/kernel/time/ntp_internal.h | 0 {src => vendor}/linux/kernel/time/posix-clock.c | 0 {src => vendor}/linux/kernel/time/posix-cpu-timers.c | 0 {src => vendor}/linux/kernel/time/posix-timers.c | 0 {src => vendor}/linux/kernel/time/tick-common.c | 0 {src => vendor}/linux/kernel/time/tick-internal.h | 0 {src => vendor}/linux/kernel/time/tick-oneshot.c | 0 {src => vendor}/linux/kernel/time/tick-sched.c | 0 {src => vendor}/linux/kernel/time/tick-sched.h | 0 {src => vendor}/linux/kernel/time/time.c | 0 {src => vendor}/linux/kernel/time/timeconst.bc | 0 {src => vendor}/linux/kernel/time/timeconv.c | 0 {src => vendor}/linux/kernel/time/timecounter.c | 0 {src => vendor}/linux/kernel/time/timekeeping.c | 0 {src => vendor}/linux/kernel/time/timekeeping.h | 0 .../linux/kernel/time/timekeeping_internal.h | 0 {src => vendor}/linux/kernel/time/timer.c | 0 {src => vendor}/linux/kernel/time/timer_list.c | 0 {src => vendor}/linux/kernel/trace/Kconfig | 0 {src => vendor}/linux/kernel/ucount.c | 0 {src => vendor}/linux/kernel/up.c | 0 {src => vendor}/linux/kernel/user.c | 0 {src => vendor}/linux/kernel/utsname_sysctl.c | 0 {src => vendor}/linux/kernel/workqueue.c | 0 {src => vendor}/linux/kernel/workqueue_internal.h | 0 {src => vendor}/linux/lib/.gitignore | 0 {src => vendor}/linux/lib/Kconfig | 0 {src => vendor}/linux/lib/Kconfig.debug | 0 {src => vendor}/linux/lib/Kconfig.kasan | 0 {src => vendor}/linux/lib/Kconfig.kgdb | 0 {src => vendor}/linux/lib/Kconfig.kmemcheck | 0 {src => vendor}/linux/lib/Kconfig.ubsan | 0 {src => vendor}/linux/lib/Makefile | 0 {src => vendor}/linux/lib/argv_split.c | 0 {src => vendor}/linux/lib/atomic64.c | 0 {src => vendor}/linux/lib/bcd.c | 0 {src => vendor}/linux/lib/bitmap.c | 0 {src => vendor}/linux/lib/bitrev.c | 0 {src => vendor}/linux/lib/bsearch.c | 0 {src => vendor}/linux/lib/bust_spinlocks.c | 0 {src => vendor}/linux/lib/chacha20.c | 0 {src => vendor}/linux/lib/checksum.c | 0 {src => vendor}/linux/lib/clz_ctz.c | 0 {src => vendor}/linux/lib/cmdline.c | 0 {src => vendor}/linux/lib/crc16.c | 0 {src => vendor}/linux/lib/crc32.c | 0 {src => vendor}/linux/lib/crc32defs.h | 0 {src => vendor}/linux/lib/ctype.c | 0 {src => vendor}/linux/lib/debug_info.c | 0 {src => vendor}/linux/lib/debug_locks.c | 0 {src => vendor}/linux/lib/dec_and_lock.c | 0 {src => vendor}/linux/lib/decompress.c | 0 {src => vendor}/linux/lib/devres.c | 0 {src => vendor}/linux/lib/div64.c | 0 {src => vendor}/linux/lib/dma-noop.c | 0 {src => vendor}/linux/lib/dump_stack.c | 0 {src => vendor}/linux/lib/dynamic_queue_limits.c | 0 {src => vendor}/linux/lib/earlycpio.c | 0 {src => vendor}/linux/lib/extable.c | 0 {src => vendor}/linux/lib/find_bit.c | 0 {src => vendor}/linux/lib/flex_array.c | 0 {src => vendor}/linux/lib/flex_proportions.c | 0 {src => vendor}/linux/lib/fonts/Kconfig | 0 {src => vendor}/linux/lib/gcd.c | 0 {src => vendor}/linux/lib/gen_crc32table.c | 0 {src => vendor}/linux/lib/halfmd4.c | 0 {src => vendor}/linux/lib/hexdump.c | 0 {src => vendor}/linux/lib/hweight.c | 0 {src => vendor}/linux/lib/idr.c | 0 {src => vendor}/linux/lib/int_sqrt.c | 0 {src => vendor}/linux/lib/iomap_copy.c | 0 {src => vendor}/linux/lib/iov_iter.c | 0 {src => vendor}/linux/lib/irq_regs.c | 0 {src => vendor}/linux/lib/is_single_threaded.c | 0 {src => vendor}/linux/lib/kasprintf.c | 0 {src => vendor}/linux/lib/kfifo.c | 0 {src => vendor}/linux/lib/klist.c | 0 {src => vendor}/linux/lib/kobject.c | 0 {src => vendor}/linux/lib/kobject_uevent.c | 0 {src => vendor}/linux/lib/kstrtox.c | 0 {src => vendor}/linux/lib/kstrtox.h | 0 {src => vendor}/linux/lib/lcm.c | 0 {src => vendor}/linux/lib/libcrc32c.c | 0 {src => vendor}/linux/lib/list_sort.c | 0 {src => vendor}/linux/lib/llist.c | 0 {src => vendor}/linux/lib/lockref.c | 0 {src => vendor}/linux/lib/lzo/Makefile | 0 {src => vendor}/linux/lib/lzo/lzo1x_compress.c | 0 {src => vendor}/linux/lib/lzo/lzo1x_decompress_safe.c | 0 {src => vendor}/linux/lib/lzo/lzodefs.h | 0 {src => vendor}/linux/lib/md5.c | 0 {src => vendor}/linux/lib/memweight.c | 0 {src => vendor}/linux/lib/net_utils.c | 0 {src => vendor}/linux/lib/nlattr.c | 0 {src => vendor}/linux/lib/nmi_backtrace.c | 0 {src => vendor}/linux/lib/nodemask.c | 0 {src => vendor}/linux/lib/once.c | 0 {src => vendor}/linux/lib/parser.c | 0 {src => vendor}/linux/lib/percpu-refcount.c | 0 {src => vendor}/linux/lib/percpu_ida.c | 0 {src => vendor}/linux/lib/plist.c | 0 {src => vendor}/linux/lib/radix-tree.c | 0 {src => vendor}/linux/lib/raid6/.gitignore | 0 {src => vendor}/linux/lib/raid6/Makefile | 0 {src => vendor}/linux/lib/raid6/algos.c | 0 {src => vendor}/linux/lib/raid6/int.uc | 0 {src => vendor}/linux/lib/raid6/mktables.c | 0 {src => vendor}/linux/lib/raid6/recov.c | 0 {src => vendor}/linux/lib/raid6/unroll.awk | 0 {src => vendor}/linux/lib/random32.c | 0 {src => vendor}/linux/lib/ratelimit.c | 0 {src => vendor}/linux/lib/rbtree.c | 0 {src => vendor}/linux/lib/reciprocal_div.c | 0 {src => vendor}/linux/lib/rhashtable.c | 0 {src => vendor}/linux/lib/sbitmap.c | 0 {src => vendor}/linux/lib/scatterlist.c | 0 {src => vendor}/linux/lib/seq_buf.c | 0 {src => vendor}/linux/lib/sha1.c | 0 {src => vendor}/linux/lib/show_mem.c | 0 {src => vendor}/linux/lib/sort.c | 0 {src => vendor}/linux/lib/string.c | 0 {src => vendor}/linux/lib/string_helpers.c | 0 {src => vendor}/linux/lib/timerqueue.c | 0 {src => vendor}/linux/lib/uuid.c | 0 {src => vendor}/linux/lib/vsprintf.c | 0 {src => vendor}/linux/lib/win_minmax.c | 0 {src => vendor}/linux/lib/xz/Kconfig | 0 {src => vendor}/linux/lib/zlib_deflate/Makefile | 0 {src => vendor}/linux/lib/zlib_deflate/deflate.c | 0 {src => vendor}/linux/lib/zlib_deflate/deflate_syms.c | 0 {src => vendor}/linux/lib/zlib_deflate/deftree.c | 0 {src => vendor}/linux/lib/zlib_deflate/defutil.h | 0 {src => vendor}/linux/lib/zlib_inflate/Makefile | 0 {src => vendor}/linux/lib/zlib_inflate/inffast.c | 0 {src => vendor}/linux/lib/zlib_inflate/inffast.h | 0 {src => vendor}/linux/lib/zlib_inflate/inffixed.h | 0 {src => vendor}/linux/lib/zlib_inflate/inflate.c | 0 {src => vendor}/linux/lib/zlib_inflate/inflate.h | 0 {src => vendor}/linux/lib/zlib_inflate/inflate_syms.c | 0 {src => vendor}/linux/lib/zlib_inflate/inftrees.c | 0 {src => vendor}/linux/lib/zlib_inflate/inftrees.h | 0 {src => vendor}/linux/lib/zlib_inflate/infutil.c | 0 {src => vendor}/linux/lib/zlib_inflate/infutil.h | 0 {src => vendor}/linux/mm/Kconfig | 0 {src => vendor}/linux/mm/Kconfig.debug | 0 {src => vendor}/linux/mm/Makefile | 0 {src => vendor}/linux/mm/backing-dev.c | 0 {src => vendor}/linux/mm/bootmem.c | 0 {src => vendor}/linux/mm/compaction.c | 0 {src => vendor}/linux/mm/debug.c | 0 {src => vendor}/linux/mm/dmapool.c | 0 {src => vendor}/linux/mm/filemap.c | 0 {src => vendor}/linux/mm/init-mm.c | 0 {src => vendor}/linux/mm/internal.h | 0 {src => vendor}/linux/mm/interval_tree.c | 0 {src => vendor}/linux/mm/list_lru.c | 0 {src => vendor}/linux/mm/maccess.c | 0 {src => vendor}/linux/mm/mempool.c | 0 {src => vendor}/linux/mm/mm_init.c | 0 {src => vendor}/linux/mm/mmu_context.c | 0 {src => vendor}/linux/mm/mmzone.c | 0 {src => vendor}/linux/mm/nommu.c | 0 {src => vendor}/linux/mm/oom_kill.c | 0 {src => vendor}/linux/mm/page-writeback.c | 0 {src => vendor}/linux/mm/page_alloc.c | 0 {src => vendor}/linux/mm/percpu-km.c | 0 {src => vendor}/linux/mm/percpu.c | 0 {src => vendor}/linux/mm/readahead.c | 0 {src => vendor}/linux/mm/shmem.c | 0 {src => vendor}/linux/mm/slab.h | 0 {src => vendor}/linux/mm/slab_common.c | 0 {src => vendor}/linux/mm/slub.c | 0 {src => vendor}/linux/mm/swap.c | 0 {src => vendor}/linux/mm/truncate.c | 0 {src => vendor}/linux/mm/util.c | 0 {src => vendor}/linux/mm/vmacache.c | 0 {src => vendor}/linux/mm/vmscan.c | 0 {src => vendor}/linux/mm/vmstat.c | 0 {src => vendor}/linux/mm/workingset.c | 0 {src => vendor}/linux/net/6lowpan/Kconfig | 0 {src => vendor}/linux/net/802/Kconfig | 0 {src => vendor}/linux/net/802/Makefile | 0 {src => vendor}/linux/net/8021q/Kconfig | 0 {src => vendor}/linux/net/9p/Kconfig | 0 {src => vendor}/linux/net/Kconfig | 0 {src => vendor}/linux/net/Makefile | 0 {src => vendor}/linux/net/atm/Kconfig | 0 {src => vendor}/linux/net/ax25/Kconfig | 0 {src => vendor}/linux/net/batman-adv/Kconfig | 0 {src => vendor}/linux/net/bluetooth/Kconfig | 0 {src => vendor}/linux/net/bluetooth/bnep/Kconfig | 0 {src => vendor}/linux/net/bluetooth/cmtp/Kconfig | 0 {src => vendor}/linux/net/bluetooth/hidp/Kconfig | 0 {src => vendor}/linux/net/bluetooth/rfcomm/Kconfig | 0 {src => vendor}/linux/net/bridge/Kconfig | 0 {src => vendor}/linux/net/bridge/netfilter/Kconfig | 0 {src => vendor}/linux/net/caif/Kconfig | 0 {src => vendor}/linux/net/can/Kconfig | 0 {src => vendor}/linux/net/ceph/Kconfig | 0 {src => vendor}/linux/net/core/Makefile | 0 {src => vendor}/linux/net/core/datagram.c | 0 {src => vendor}/linux/net/core/dev.c | 0 {src => vendor}/linux/net/core/dev_addr_lists.c | 0 {src => vendor}/linux/net/core/dev_ioctl.c | 0 {src => vendor}/linux/net/core/dst.c | 0 {src => vendor}/linux/net/core/dst_cache.c | 0 {src => vendor}/linux/net/core/ethtool.c | 0 {src => vendor}/linux/net/core/filter.c | 0 {src => vendor}/linux/net/core/flow.c | 0 {src => vendor}/linux/net/core/flow_dissector.c | 0 {src => vendor}/linux/net/core/gen_estimator.c | 0 {src => vendor}/linux/net/core/gen_stats.c | 0 {src => vendor}/linux/net/core/link_watch.c | 0 {src => vendor}/linux/net/core/neighbour.c | 0 {src => vendor}/linux/net/core/net-procfs.c | 0 {src => vendor}/linux/net/core/net-sysfs.c | 0 {src => vendor}/linux/net/core/net-sysfs.h | 0 {src => vendor}/linux/net/core/net_namespace.c | 0 {src => vendor}/linux/net/core/netevent.c | 0 {src => vendor}/linux/net/core/request_sock.c | 0 {src => vendor}/linux/net/core/rtnetlink.c | 0 {src => vendor}/linux/net/core/scm.c | 0 {src => vendor}/linux/net/core/secure_seq.c | 0 {src => vendor}/linux/net/core/skbuff.c | 0 {src => vendor}/linux/net/core/sock.c | 0 {src => vendor}/linux/net/core/sock_diag.c | 0 {src => vendor}/linux/net/core/sock_reuseport.c | 0 {src => vendor}/linux/net/core/stream.c | 0 {src => vendor}/linux/net/core/sysctl_net_core.c | 0 {src => vendor}/linux/net/core/tso.c | 0 {src => vendor}/linux/net/core/utils.c | 0 {src => vendor}/linux/net/dcb/Kconfig | 0 {src => vendor}/linux/net/dccp/Kconfig | 0 {src => vendor}/linux/net/dccp/ccids/Kconfig | 0 {src => vendor}/linux/net/decnet/Kconfig | 0 {src => vendor}/linux/net/decnet/netfilter/Kconfig | 0 {src => vendor}/linux/net/dns_resolver/Kconfig | 0 {src => vendor}/linux/net/dsa/Kconfig | 0 {src => vendor}/linux/net/ethernet/Makefile | 0 {src => vendor}/linux/net/ethernet/eth.c | 0 {src => vendor}/linux/net/hsr/Kconfig | 0 {src => vendor}/linux/net/ieee802154/6lowpan/Kconfig | 0 {src => vendor}/linux/net/ieee802154/Kconfig | 0 {src => vendor}/linux/net/ipv4/Kconfig | 0 {src => vendor}/linux/net/ipv4/Makefile | 0 {src => vendor}/linux/net/ipv4/af_inet.c | 0 {src => vendor}/linux/net/ipv4/arp.c | 0 {src => vendor}/linux/net/ipv4/datagram.c | 0 {src => vendor}/linux/net/ipv4/devinet.c | 0 {src => vendor}/linux/net/ipv4/fib_frontend.c | 0 {src => vendor}/linux/net/ipv4/fib_lookup.h | 0 {src => vendor}/linux/net/ipv4/fib_semantics.c | 0 {src => vendor}/linux/net/ipv4/fib_trie.c | 0 {src => vendor}/linux/net/ipv4/gre_offload.c | 0 {src => vendor}/linux/net/ipv4/icmp.c | 0 {src => vendor}/linux/net/ipv4/igmp.c | 0 {src => vendor}/linux/net/ipv4/inet_connection_sock.c | 0 {src => vendor}/linux/net/ipv4/inet_diag.c | 0 {src => vendor}/linux/net/ipv4/inet_fragment.c | 0 {src => vendor}/linux/net/ipv4/inet_hashtables.c | 0 {src => vendor}/linux/net/ipv4/inet_timewait_sock.c | 0 {src => vendor}/linux/net/ipv4/inetpeer.c | 0 {src => vendor}/linux/net/ipv4/ip_forward.c | 0 {src => vendor}/linux/net/ipv4/ip_fragment.c | 0 {src => vendor}/linux/net/ipv4/ip_input.c | 0 {src => vendor}/linux/net/ipv4/ip_options.c | 0 {src => vendor}/linux/net/ipv4/ip_output.c | 0 {src => vendor}/linux/net/ipv4/ip_sockglue.c | 0 {src => vendor}/linux/net/ipv4/ip_tunnel.c | 0 {src => vendor}/linux/net/ipv4/ip_tunnel_core.c | 0 {src => vendor}/linux/net/ipv4/ipconfig.c | 0 {src => vendor}/linux/net/ipv4/netfilter/Kconfig | 0 {src => vendor}/linux/net/ipv4/ping.c | 0 {src => vendor}/linux/net/ipv4/proc.c | 0 {src => vendor}/linux/net/ipv4/protocol.c | 0 {src => vendor}/linux/net/ipv4/raw.c | 0 {src => vendor}/linux/net/ipv4/route.c | 0 {src => vendor}/linux/net/ipv4/sysctl_net_ipv4.c | 0 {src => vendor}/linux/net/ipv4/tcp.c | 0 {src => vendor}/linux/net/ipv4/tcp_cong.c | 0 {src => vendor}/linux/net/ipv4/tcp_cubic.c | 0 {src => vendor}/linux/net/ipv4/tcp_diag.c | 0 {src => vendor}/linux/net/ipv4/tcp_fastopen.c | 0 {src => vendor}/linux/net/ipv4/tcp_input.c | 0 {src => vendor}/linux/net/ipv4/tcp_ipv4.c | 0 {src => vendor}/linux/net/ipv4/tcp_metrics.c | 0 {src => vendor}/linux/net/ipv4/tcp_minisocks.c | 0 {src => vendor}/linux/net/ipv4/tcp_offload.c | 0 {src => vendor}/linux/net/ipv4/tcp_output.c | 0 {src => vendor}/linux/net/ipv4/tcp_rate.c | 0 {src => vendor}/linux/net/ipv4/tcp_recovery.c | 0 {src => vendor}/linux/net/ipv4/tcp_timer.c | 0 {src => vendor}/linux/net/ipv4/tunnel4.c | 0 {src => vendor}/linux/net/ipv4/udp.c | 0 {src => vendor}/linux/net/ipv4/udp_impl.h | 0 {src => vendor}/linux/net/ipv4/udp_offload.c | 0 {src => vendor}/linux/net/ipv4/udplite.c | 0 {src => vendor}/linux/net/ipv4/xfrm4_input.c | 0 {src => vendor}/linux/net/ipv4/xfrm4_mode_beet.c | 0 {src => vendor}/linux/net/ipv4/xfrm4_mode_transport.c | 0 {src => vendor}/linux/net/ipv4/xfrm4_mode_tunnel.c | 0 {src => vendor}/linux/net/ipv4/xfrm4_output.c | 0 {src => vendor}/linux/net/ipv4/xfrm4_policy.c | 0 {src => vendor}/linux/net/ipv4/xfrm4_protocol.c | 0 {src => vendor}/linux/net/ipv4/xfrm4_state.c | 0 {src => vendor}/linux/net/ipv6/Kconfig | 0 {src => vendor}/linux/net/ipv6/Makefile | 0 {src => vendor}/linux/net/ipv6/addrconf.c | 0 {src => vendor}/linux/net/ipv6/addrconf_core.c | 0 {src => vendor}/linux/net/ipv6/addrlabel.c | 0 {src => vendor}/linux/net/ipv6/af_inet6.c | 0 {src => vendor}/linux/net/ipv6/anycast.c | 0 {src => vendor}/linux/net/ipv6/datagram.c | 0 {src => vendor}/linux/net/ipv6/exthdrs.c | 0 {src => vendor}/linux/net/ipv6/exthdrs_core.c | 0 {src => vendor}/linux/net/ipv6/exthdrs_offload.c | 0 {src => vendor}/linux/net/ipv6/icmp.c | 0 {src => vendor}/linux/net/ipv6/inet6_connection_sock.c | 0 {src => vendor}/linux/net/ipv6/inet6_hashtables.c | 0 {src => vendor}/linux/net/ipv6/ip6_checksum.c | 0 {src => vendor}/linux/net/ipv6/ip6_fib.c | 0 {src => vendor}/linux/net/ipv6/ip6_flowlabel.c | 0 {src => vendor}/linux/net/ipv6/ip6_icmp.c | 0 {src => vendor}/linux/net/ipv6/ip6_input.c | 0 {src => vendor}/linux/net/ipv6/ip6_offload.c | 0 {src => vendor}/linux/net/ipv6/ip6_offload.h | 0 {src => vendor}/linux/net/ipv6/ip6_output.c | 0 {src => vendor}/linux/net/ipv6/ipv6_sockglue.c | 0 {src => vendor}/linux/net/ipv6/mcast.c | 0 {src => vendor}/linux/net/ipv6/mcast_snoop.c | 0 {src => vendor}/linux/net/ipv6/ndisc.c | 0 {src => vendor}/linux/net/ipv6/netfilter/Kconfig | 0 {src => vendor}/linux/net/ipv6/output_core.c | 0 {src => vendor}/linux/net/ipv6/ping.c | 0 {src => vendor}/linux/net/ipv6/proc.c | 0 {src => vendor}/linux/net/ipv6/protocol.c | 0 {src => vendor}/linux/net/ipv6/raw.c | 0 {src => vendor}/linux/net/ipv6/reassembly.c | 0 {src => vendor}/linux/net/ipv6/route.c | 0 {src => vendor}/linux/net/ipv6/sit.c | 0 {src => vendor}/linux/net/ipv6/sysctl_net_ipv6.c | 0 {src => vendor}/linux/net/ipv6/tcp_ipv6.c | 0 {src => vendor}/linux/net/ipv6/tcpv6_offload.c | 0 {src => vendor}/linux/net/ipv6/udp.c | 0 {src => vendor}/linux/net/ipv6/udp_impl.h | 0 {src => vendor}/linux/net/ipv6/udp_offload.c | 0 {src => vendor}/linux/net/ipv6/udplite.c | 0 {src => vendor}/linux/net/ipv6/xfrm6_input.c | 0 {src => vendor}/linux/net/ipv6/xfrm6_mode_beet.c | 0 {src => vendor}/linux/net/ipv6/xfrm6_mode_transport.c | 0 {src => vendor}/linux/net/ipv6/xfrm6_mode_tunnel.c | 0 {src => vendor}/linux/net/ipv6/xfrm6_output.c | 0 {src => vendor}/linux/net/ipv6/xfrm6_policy.c | 0 {src => vendor}/linux/net/ipv6/xfrm6_protocol.c | 0 {src => vendor}/linux/net/ipv6/xfrm6_state.c | 0 {src => vendor}/linux/net/ipx/Kconfig | 0 {src => vendor}/linux/net/irda/Kconfig | 0 {src => vendor}/linux/net/irda/ircomm/Kconfig | 0 {src => vendor}/linux/net/irda/irlan/Kconfig | 0 {src => vendor}/linux/net/irda/irnet/Kconfig | 0 {src => vendor}/linux/net/iucv/Kconfig | 0 {src => vendor}/linux/net/kcm/Kconfig | 0 {src => vendor}/linux/net/l2tp/Kconfig | 0 {src => vendor}/linux/net/l3mdev/Kconfig | 0 {src => vendor}/linux/net/lapb/Kconfig | 0 {src => vendor}/linux/net/llc/Kconfig | 0 {src => vendor}/linux/net/mac80211/Kconfig | 0 {src => vendor}/linux/net/mac802154/Kconfig | 0 {src => vendor}/linux/net/mpls/Kconfig | 0 {src => vendor}/linux/net/ncsi/Kconfig | 0 {src => vendor}/linux/net/netfilter/Kconfig | 0 {src => vendor}/linux/net/netfilter/ipset/Kconfig | 0 {src => vendor}/linux/net/netfilter/ipvs/Kconfig | 0 {src => vendor}/linux/net/netlabel/Kconfig | 0 {src => vendor}/linux/net/netlink/Kconfig | 0 {src => vendor}/linux/net/netlink/Makefile | 0 {src => vendor}/linux/net/netlink/af_netlink.c | 0 {src => vendor}/linux/net/netlink/af_netlink.h | 0 {src => vendor}/linux/net/netlink/genetlink.c | 0 {src => vendor}/linux/net/nfc/Kconfig | 0 {src => vendor}/linux/net/nfc/hci/Kconfig | 0 {src => vendor}/linux/net/nfc/nci/Kconfig | 0 {src => vendor}/linux/net/openvswitch/Kconfig | 0 {src => vendor}/linux/net/packet/Kconfig | 0 {src => vendor}/linux/net/phonet/Kconfig | 0 {src => vendor}/linux/net/qrtr/Kconfig | 0 {src => vendor}/linux/net/rds/Kconfig | 0 {src => vendor}/linux/net/rfkill/Kconfig | 0 {src => vendor}/linux/net/rxrpc/Kconfig | 0 {src => vendor}/linux/net/sched/Kconfig | 0 {src => vendor}/linux/net/sched/Makefile | 0 {src => vendor}/linux/net/sched/sch_generic.c | 0 {src => vendor}/linux/net/sched/sch_mq.c | 0 {src => vendor}/linux/net/sctp/Kconfig | 0 {src => vendor}/linux/net/socket.c | 0 {src => vendor}/linux/net/strparser/Kconfig | 0 {src => vendor}/linux/net/sunrpc/Kconfig | 0 {src => vendor}/linux/net/switchdev/Kconfig | 0 {src => vendor}/linux/net/sysctl_net.c | 0 {src => vendor}/linux/net/tipc/Kconfig | 0 {src => vendor}/linux/net/unix/Kconfig | 0 {src => vendor}/linux/net/vmw_vsock/Kconfig | 0 {src => vendor}/linux/net/wimax/Kconfig | 0 {src => vendor}/linux/net/wireless/.gitignore | 0 {src => vendor}/linux/net/wireless/Kconfig | 0 {src => vendor}/linux/net/x25/Kconfig | 0 {src => vendor}/linux/net/xfrm/Kconfig | 0 {src => vendor}/linux/net/xfrm/Makefile | 0 {src => vendor}/linux/net/xfrm/xfrm_hash.c | 0 {src => vendor}/linux/net/xfrm/xfrm_hash.h | 0 {src => vendor}/linux/net/xfrm/xfrm_input.c | 0 {src => vendor}/linux/net/xfrm/xfrm_output.c | 0 {src => vendor}/linux/net/xfrm/xfrm_policy.c | 0 {src => vendor}/linux/net/xfrm/xfrm_replay.c | 0 {src => vendor}/linux/net/xfrm/xfrm_state.c | 0 {src => vendor}/linux/net/xfrm/xfrm_sysctl.c | 0 {src => vendor}/linux/samples/Kconfig | 0 {src => vendor}/linux/samples/auxdisplay/.gitignore | 0 {src => vendor}/linux/samples/connector/.gitignore | 0 {src => vendor}/linux/samples/hidraw/.gitignore | 0 {src => vendor}/linux/samples/mei/.gitignore | 0 {src => vendor}/linux/samples/mic/mpssd/.gitignore | 0 {src => vendor}/linux/samples/seccomp/.gitignore | 0 {src => vendor}/linux/samples/timers/.gitignore | 0 {src => vendor}/linux/samples/watchdog/.gitignore | 0 {src => vendor}/linux/scripts/.gitignore | 0 {src => vendor}/linux/scripts/Kbuild.include | 0 {src => vendor}/linux/scripts/Makefile | 0 {src => vendor}/linux/scripts/Makefile.asm-generic | 0 {src => vendor}/linux/scripts/Makefile.build | 0 {src => vendor}/linux/scripts/Makefile.extrawarn | 0 {src => vendor}/linux/scripts/Makefile.gcc-plugins | 0 {src => vendor}/linux/scripts/Makefile.host | 0 {src => vendor}/linux/scripts/Makefile.kasan | 0 {src => vendor}/linux/scripts/Makefile.lib | 0 {src => vendor}/linux/scripts/Makefile.modpost | 0 {src => vendor}/linux/scripts/Makefile.ubsan | 0 {src => vendor}/linux/scripts/basic/.gitignore | 0 {src => vendor}/linux/scripts/basic/Makefile | 0 {src => vendor}/linux/scripts/basic/fixdep.c | 0 {src => vendor}/linux/scripts/checksyscalls.sh | 0 {src => vendor}/linux/scripts/dtc/.gitignore | 0 {src => vendor}/linux/scripts/gcc-goto.sh | 0 {src => vendor}/linux/scripts/gcc-version.sh | 0 {src => vendor}/linux/scripts/gdb/linux/.gitignore | 0 {src => vendor}/linux/scripts/genksyms/.gitignore | 0 {src => vendor}/linux/scripts/headers_install.sh | 0 {src => vendor}/linux/scripts/kallsyms.c | 0 {src => vendor}/linux/scripts/kconfig/.gitignore | 0 {src => vendor}/linux/scripts/kconfig/Makefile | 0 {src => vendor}/linux/scripts/kconfig/check.sh | 0 {src => vendor}/linux/scripts/kconfig/conf.c | 0 {src => vendor}/linux/scripts/kconfig/confdata.c | 0 {src => vendor}/linux/scripts/kconfig/expr.c | 0 {src => vendor}/linux/scripts/kconfig/expr.h | 0 {src => vendor}/linux/scripts/kconfig/list.h | 0 {src => vendor}/linux/scripts/kconfig/lkc.h | 0 {src => vendor}/linux/scripts/kconfig/lkc_proto.h | 0 .../linux/scripts/kconfig/lxdialog/.gitignore | 0 .../linux/scripts/kconfig/lxdialog/check-lxdialog.sh | 0 {src => vendor}/linux/scripts/kconfig/menu.c | 0 {src => vendor}/linux/scripts/kconfig/symbol.c | 0 {src => vendor}/linux/scripts/kconfig/util.c | 0 .../linux/scripts/kconfig/zconf.hash.c_shipped | 0 .../linux/scripts/kconfig/zconf.lex.c_shipped | 0 .../linux/scripts/kconfig/zconf.tab.c_shipped | 0 {src => vendor}/linux/scripts/link-vmlinux.sh | 0 {src => vendor}/linux/scripts/mkcompile_h | 0 {src => vendor}/linux/scripts/mksysmap | 0 {src => vendor}/linux/scripts/mod/.gitignore | 0 {src => vendor}/linux/scripts/mod/Makefile | 0 .../linux/scripts/mod/devicetable-offsets.c | 0 {src => vendor}/linux/scripts/mod/empty.c | 0 {src => vendor}/linux/scripts/mod/file2alias.c | 0 {src => vendor}/linux/scripts/mod/mk_elfconfig.c | 0 {src => vendor}/linux/scripts/mod/modpost.c | 0 {src => vendor}/linux/scripts/mod/modpost.h | 0 {src => vendor}/linux/scripts/mod/sumversion.c | 0 .../linux/scripts/selinux/genheaders/.gitignore | 0 {src => vendor}/linux/scripts/selinux/mdp/.gitignore | 0 {src => vendor}/linux/scripts/setlocalversion | 0 {src => vendor}/linux/scripts/unifdef.c | 0 {src => vendor}/linux/security/Kconfig | 0 {src => vendor}/linux/security/Makefile | 0 {src => vendor}/linux/security/apparmor/.gitignore | 0 {src => vendor}/linux/security/apparmor/Kconfig | 0 {src => vendor}/linux/security/commoncap.c | 0 {src => vendor}/linux/security/integrity/Kconfig | 0 {src => vendor}/linux/security/integrity/evm/Kconfig | 0 {src => vendor}/linux/security/integrity/ima/Kconfig | 0 {src => vendor}/linux/security/keys/Kconfig | 0 {src => vendor}/linux/security/loadpin/Kconfig | 0 {src => vendor}/linux/security/selinux/.gitignore | 0 {src => vendor}/linux/security/selinux/Kconfig | 0 {src => vendor}/linux/security/smack/Kconfig | 0 {src => vendor}/linux/security/tomoyo/.gitignore | 0 {src => vendor}/linux/security/tomoyo/Kconfig | 0 {src => vendor}/linux/security/yama/Kconfig | 0 {src => vendor}/linux/sound/Kconfig | 0 {src => vendor}/linux/sound/Makefile | 0 {src => vendor}/linux/sound/aoa/Kconfig | 0 {src => vendor}/linux/sound/aoa/codecs/Kconfig | 0 {src => vendor}/linux/sound/aoa/fabrics/Kconfig | 0 {src => vendor}/linux/sound/aoa/soundbus/Kconfig | 0 {src => vendor}/linux/sound/arm/Kconfig | 0 {src => vendor}/linux/sound/atmel/Kconfig | 0 {src => vendor}/linux/sound/core/Kconfig | 0 {src => vendor}/linux/sound/core/seq/Kconfig | 0 {src => vendor}/linux/sound/drivers/Kconfig | 0 {src => vendor}/linux/sound/firewire/Kconfig | 0 {src => vendor}/linux/sound/hda/Kconfig | 0 {src => vendor}/linux/sound/isa/Kconfig | 0 {src => vendor}/linux/sound/mips/Kconfig | 0 {src => vendor}/linux/sound/oss/.gitignore | 0 {src => vendor}/linux/sound/oss/Kconfig | 0 {src => vendor}/linux/sound/oss/dmasound/Kconfig | 0 {src => vendor}/linux/sound/parisc/Kconfig | 0 {src => vendor}/linux/sound/pci/Kconfig | 0 {src => vendor}/linux/sound/pci/hda/Kconfig | 0 {src => vendor}/linux/sound/pcmcia/Kconfig | 0 {src => vendor}/linux/sound/ppc/Kconfig | 0 {src => vendor}/linux/sound/sh/Kconfig | 0 {src => vendor}/linux/sound/soc/Kconfig | 0 {src => vendor}/linux/sound/soc/adi/Kconfig | 0 {src => vendor}/linux/sound/soc/amd/Kconfig | 0 {src => vendor}/linux/sound/soc/atmel/Kconfig | 0 {src => vendor}/linux/sound/soc/au1x/Kconfig | 0 {src => vendor}/linux/sound/soc/bcm/Kconfig | 0 {src => vendor}/linux/sound/soc/blackfin/Kconfig | 0 {src => vendor}/linux/sound/soc/cirrus/Kconfig | 0 {src => vendor}/linux/sound/soc/codecs/Kconfig | 0 {src => vendor}/linux/sound/soc/davinci/Kconfig | 0 {src => vendor}/linux/sound/soc/dwc/Kconfig | 0 {src => vendor}/linux/sound/soc/fsl/Kconfig | 0 {src => vendor}/linux/sound/soc/generic/Kconfig | 0 {src => vendor}/linux/sound/soc/img/Kconfig | 0 {src => vendor}/linux/sound/soc/intel/Kconfig | 0 {src => vendor}/linux/sound/soc/jz4740/Kconfig | 0 {src => vendor}/linux/sound/soc/kirkwood/Kconfig | 0 {src => vendor}/linux/sound/soc/mediatek/Kconfig | 0 {src => vendor}/linux/sound/soc/mxs/Kconfig | 0 {src => vendor}/linux/sound/soc/nuc900/Kconfig | 0 {src => vendor}/linux/sound/soc/omap/Kconfig | 0 {src => vendor}/linux/sound/soc/pxa/Kconfig | 0 {src => vendor}/linux/sound/soc/qcom/Kconfig | 0 {src => vendor}/linux/sound/soc/rockchip/Kconfig | 0 {src => vendor}/linux/sound/soc/samsung/Kconfig | 0 {src => vendor}/linux/sound/soc/sh/Kconfig | 0 {src => vendor}/linux/sound/soc/sirf/Kconfig | 0 {src => vendor}/linux/sound/soc/spear/Kconfig | 0 {src => vendor}/linux/sound/soc/sti/Kconfig | 0 {src => vendor}/linux/sound/soc/sunxi/Kconfig | 0 {src => vendor}/linux/sound/soc/tegra/Kconfig | 0 {src => vendor}/linux/sound/soc/txx9/Kconfig | 0 {src => vendor}/linux/sound/soc/ux500/Kconfig | 0 {src => vendor}/linux/sound/soc/xtensa/Kconfig | 0 {src => vendor}/linux/sound/soc/zte/Kconfig | 0 {src => vendor}/linux/sound/sparc/Kconfig | 0 {src => vendor}/linux/sound/spi/Kconfig | 0 {src => vendor}/linux/sound/usb/Kconfig | 0 {src => vendor}/linux/sound/usb/line6/Kconfig | 0 {src => vendor}/linux/tools/accounting/.gitignore | 0 {src => vendor}/linux/tools/build/.gitignore | 0 {src => vendor}/linux/tools/build/Build.include | 0 {src => vendor}/linux/tools/build/Makefile.build | 0 {src => vendor}/linux/tools/build/feature/.gitignore | 0 {src => vendor}/linux/tools/cgroup/.gitignore | 0 {src => vendor}/linux/tools/laptop/dslm/.gitignore | 0 {src => vendor}/linux/tools/lguest/.gitignore | 0 {src => vendor}/linux/tools/lib/bpf/.gitignore | 0 {src => vendor}/linux/tools/lib/lockdep/.gitignore | 0 {src => vendor}/linux/tools/lib/traceevent/.gitignore | 0 {src => vendor}/linux/tools/lkl/.gitignore | 0 {src => vendor}/linux/tools/lkl/Makefile | 0 {src => vendor}/linux/tools/lkl/include/.gitignore | 0 {src => vendor}/linux/tools/lkl/include/lkl.h | 0 {src => vendor}/linux/tools/lkl/include/lkl_host.h | 0 {src => vendor}/linux/tools/lkl/lib/.gitignore | 0 {src => vendor}/linux/tools/lkl/lib/Build | 0 {src => vendor}/linux/tools/lkl/lib/dbg.c | 0 {src => vendor}/linux/tools/lkl/lib/dbg_handler.c | 0 {src => vendor}/linux/tools/lkl/lib/endian.h | 0 {src => vendor}/linux/tools/lkl/lib/fs.c | 0 {src => vendor}/linux/tools/lkl/lib/iomem.c | 0 {src => vendor}/linux/tools/lkl/lib/iomem.h | 0 {src => vendor}/linux/tools/lkl/lib/jmp_buf.c | 0 {src => vendor}/linux/tools/lkl/lib/jmp_buf.h | 0 {src => vendor}/linux/tools/lkl/lib/net.c | 0 {src => vendor}/linux/tools/lkl/lib/nt-host.c | 0 {src => vendor}/linux/tools/lkl/lib/posix-host.c | 0 {src => vendor}/linux/tools/lkl/lib/utils.c | 0 {src => vendor}/linux/tools/lkl/lib/virtio.c | 0 {src => vendor}/linux/tools/lkl/lib/virtio.h | 0 {src => vendor}/linux/tools/lkl/lib/virtio_blk.c | 0 {src => vendor}/linux/tools/lkl/lib/virtio_net.c | 0 {src => vendor}/linux/tools/lkl/lib/virtio_net_fd.c | 0 {src => vendor}/linux/tools/lkl/lib/virtio_net_fd.h | 0 .../linux/tools/lkl/lib/virtio_net_macvtap.c | 0 {src => vendor}/linux/tools/lkl/lib/virtio_net_raw.c | 0 {src => vendor}/linux/tools/lkl/lib/virtio_net_tap.c | 0 {src => vendor}/linux/tools/objtool/.gitignore | 0 {src => vendor}/linux/tools/pcmcia/.gitignore | 0 {src => vendor}/linux/tools/perf/.gitignore | 0 {src => vendor}/linux/tools/perf/tests/.gitignore | 0 {src => vendor}/linux/tools/power/cpupower/.gitignore | 0 .../linux/tools/power/x86/turbostat/.gitignore | 0 {src => vendor}/linux/tools/scripts/Makefile.include | 0 {src => vendor}/linux/tools/spi/.gitignore | 0 .../linux/tools/testing/radix-tree/.gitignore | 0 .../tools/testing/selftests/breakpoints/.gitignore | 0 .../tools/testing/selftests/capabilities/.gitignore | 0 .../linux/tools/testing/selftests/efivarfs/.gitignore | 0 .../linux/tools/testing/selftests/exec/.gitignore | 0 .../tools/testing/selftests/filesystems/.gitignore | 0 .../testing/selftests/futex/functional/.gitignore | 0 .../linux/tools/testing/selftests/ia64/.gitignore | 0 .../linux/tools/testing/selftests/ipc/.gitignore | 0 .../linux/tools/testing/selftests/kcmp/.gitignore | 0 .../tools/testing/selftests/media_tests/.gitignore | 0 .../tools/testing/selftests/membarrier/.gitignore | 0 .../linux/tools/testing/selftests/memfd/.gitignore | 0 .../linux/tools/testing/selftests/mount/.gitignore | 0 .../linux/tools/testing/selftests/mqueue/.gitignore | 0 .../linux/tools/testing/selftests/net/.gitignore | 0 .../selftests/networking/timestamping/.gitignore | 0 .../testing/selftests/powerpc/alignment/.gitignore | 0 .../testing/selftests/powerpc/benchmarks/.gitignore | 0 .../selftests/powerpc/context_switch/.gitignore | 0 .../testing/selftests/powerpc/copyloops/.gitignore | 0 .../testing/selftests/powerpc/copyloops/copyuser_64.S | 0 .../selftests/powerpc/copyloops/copyuser_power7.S | 0 .../testing/selftests/powerpc/copyloops/memcpy_64.S | 0 .../selftests/powerpc/copyloops/memcpy_power7.S | 0 .../tools/testing/selftests/powerpc/dscr/.gitignore | 0 .../tools/testing/selftests/powerpc/math/.gitignore | 0 .../tools/testing/selftests/powerpc/mm/.gitignore | 0 .../tools/testing/selftests/powerpc/pmu/.gitignore | 0 .../tools/testing/selftests/powerpc/pmu/ebb/.gitignore | 0 .../testing/selftests/powerpc/primitives/.gitignore | 0 .../selftests/powerpc/primitives/asm/asm-compat.h | 0 .../selftests/powerpc/primitives/word-at-a-time.h | 0 .../tools/testing/selftests/powerpc/signal/.gitignore | 0 .../testing/selftests/powerpc/stringloops/.gitignore | 0 .../testing/selftests/powerpc/stringloops/memcmp_64.S | 0 .../testing/selftests/powerpc/switch_endian/.gitignore | 0 .../testing/selftests/powerpc/syscalls/.gitignore | 0 .../tools/testing/selftests/powerpc/tm/.gitignore | 0 .../tools/testing/selftests/powerpc/vphn/.gitignore | 0 .../linux/tools/testing/selftests/powerpc/vphn/vphn.c | 0 .../linux/tools/testing/selftests/powerpc/vphn/vphn.h | 0 .../linux/tools/testing/selftests/prctl/.gitignore | 0 .../linux/tools/testing/selftests/ptp/.gitignore | 0 .../linux/tools/testing/selftests/ptrace/.gitignore | 0 .../tools/testing/selftests/rcutorture/.gitignore | 0 .../linux/tools/testing/selftests/seccomp/.gitignore | 0 .../linux/tools/testing/selftests/size/.gitignore | 0 .../linux/tools/testing/selftests/timers/.gitignore | 0 .../linux/tools/testing/selftests/vDSO/.gitignore | 0 .../linux/tools/testing/selftests/vm/.gitignore | 0 .../linux/tools/testing/selftests/watchdog/.gitignore | 0 .../linux/tools/testing/selftests/x86/.gitignore | 0 {src => vendor}/linux/tools/thermal/tmon/.gitignore | 0 {src => vendor}/linux/tools/usb/usbip/.gitignore | 0 {src => vendor}/linux/tools/virtio/.gitignore | 0 {src => vendor}/linux/tools/vm/.gitignore | 0 {src => vendor}/linux/usr/.gitignore | 0 {src => vendor}/linux/usr/Kconfig | 0 {src => vendor}/linux/usr/Makefile | 0 {src => vendor}/linux/virt/Makefile | 0 {src => vendor}/linux/virt/lib/Kconfig | 0 {src => vendor}/linux/virt/lib/Makefile | 0 3720 files changed, 7 insertions(+), 7 deletions(-) rename {src => vendor}/linux/.gitignore (100%) rename {src => vendor}/linux/Documentation/.gitignore (100%) rename {src => vendor}/linux/Documentation/DocBook/.gitignore (100%) rename {src => vendor}/linux/Documentation/arm/SH-Mobile/.gitignore (100%) rename {src => vendor}/linux/Documentation/vm/.gitignore (100%) rename {src => vendor}/linux/Kbuild (100%) rename {src => vendor}/linux/Kconfig (100%) rename {src => vendor}/linux/Makefile (100%) rename {src => vendor}/linux/README.md (100%) rename {src => vendor}/linux/arch/.gitignore (100%) rename {src => vendor}/linux/arch/Kconfig (100%) rename {src => vendor}/linux/arch/alpha/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/arc/boot/.gitignore (100%) rename {src => vendor}/linux/arch/arc/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/arm/boot/.gitignore (100%) rename {src => vendor}/linux/arch/arm/boot/compressed/.gitignore (100%) rename {src => vendor}/linux/arch/arm/boot/dts/include/dt-bindings (100%) rename {src => vendor}/linux/arch/arm/boot/dts/sun8i-a23-ippo-q8h-v1.2.dts (100%) rename {src => vendor}/linux/arch/arm/boot/dts/sun8i-a23-ippo-q8h-v5.dts (100%) rename {src => vendor}/linux/arch/arm/boot/dts/sun8i-a33-et-q8-v1.6.dts (100%) rename {src => vendor}/linux/arch/arm/boot/dts/sun8i-a33-ippo-q8h-v1.2.dts (100%) rename {src => vendor}/linux/arch/arm/crypto/.gitignore (100%) rename {src => vendor}/linux/arch/arm/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/arm/vdso/.gitignore (100%) rename {src => vendor}/linux/arch/arm64/boot/.gitignore (100%) rename {src => vendor}/linux/arch/arm64/boot/dts/.gitignore (100%) rename {src => vendor}/linux/arch/arm64/boot/dts/arm/vexpress-v2m-rs1.dtsi (100%) rename {src => vendor}/linux/arch/arm64/boot/dts/broadcom/bcm2835-rpi.dtsi (100%) rename {src => vendor}/linux/arch/arm64/boot/dts/broadcom/bcm283x-rpi-smsc9514.dtsi (100%) rename {src => vendor}/linux/arch/arm64/boot/dts/broadcom/bcm283x.dtsi (100%) rename {src => vendor}/linux/arch/arm64/boot/dts/include/dt-bindings (100%) rename {src => vendor}/linux/arch/arm64/boot/dts/socionext/uniphier-pinctrl.dtsi (100%) rename {src => vendor}/linux/arch/arm64/boot/dts/socionext/uniphier-ref-daughter.dtsi (100%) rename {src => vendor}/linux/arch/arm64/boot/dts/socionext/uniphier-support-card.dtsi (100%) rename {src => vendor}/linux/arch/arm64/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/arm64/kernel/vdso/.gitignore (100%) rename {src => vendor}/linux/arch/avr32/boot/images/.gitignore (100%) rename {src => vendor}/linux/arch/avr32/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/blackfin/boot/.gitignore (100%) rename {src => vendor}/linux/arch/blackfin/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/cris/boot/.gitignore (100%) rename {src => vendor}/linux/arch/cris/boot/dts/include/dt-bindings (100%) rename {src => vendor}/linux/arch/ia64/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/lkl/.gitignore (100%) rename {src => vendor}/linux/arch/lkl/Kconfig (100%) rename {src => vendor}/linux/arch/lkl/Makefile (100%) rename {src => vendor}/linux/arch/lkl/auto.conf (100%) rename {src => vendor}/linux/arch/lkl/defconfig (100%) rename {src => vendor}/linux/arch/lkl/include/asm/Kbuild (100%) rename {src => vendor}/linux/arch/lkl/include/asm/bitsperlong.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/byteorder.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/cpu.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/dma-mapping.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/elf.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/host_ops.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/io.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/irq.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/mutex.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/page.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/pgtable.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/processor.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/ptrace.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/sched.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/setup.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/syscalls.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/syscalls_32.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/thread_info.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/unistd.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/unistd_32.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/vmlinux.lds.h (100%) rename {src => vendor}/linux/arch/lkl/include/asm/xor.h (100%) rename {src => vendor}/linux/arch/lkl/include/system/stdarg.h (100%) rename {src => vendor}/linux/arch/lkl/include/uapi/asm/Kbuild (100%) rename {src => vendor}/linux/arch/lkl/include/uapi/asm/bitsperlong.h (100%) rename {src => vendor}/linux/arch/lkl/include/uapi/asm/byteorder.h (100%) rename {src => vendor}/linux/arch/lkl/include/uapi/asm/host_ops.h (100%) rename {src => vendor}/linux/arch/lkl/include/uapi/asm/irq.h (100%) rename {src => vendor}/linux/arch/lkl/include/uapi/asm/sigcontext.h (100%) rename {src => vendor}/linux/arch/lkl/include/uapi/asm/siginfo.h (100%) rename {src => vendor}/linux/arch/lkl/include/uapi/asm/syscalls.h (100%) rename {src => vendor}/linux/arch/lkl/include/uapi/asm/unistd.h (100%) rename {src => vendor}/linux/arch/lkl/kernel/Makefile (100%) rename {src => vendor}/linux/arch/lkl/kernel/asm-offsets.c (100%) rename {src => vendor}/linux/arch/lkl/kernel/console.c (100%) rename {src => vendor}/linux/arch/lkl/kernel/cpu.c (100%) rename {src => vendor}/linux/arch/lkl/kernel/irq.c (100%) rename {src => vendor}/linux/arch/lkl/kernel/misc.c (100%) rename {src => vendor}/linux/arch/lkl/kernel/setup.c (100%) rename {src => vendor}/linux/arch/lkl/kernel/syscalls.c (100%) rename {src => vendor}/linux/arch/lkl/kernel/syscalls_32.c (100%) rename {src => vendor}/linux/arch/lkl/kernel/threads.c (100%) rename {src => vendor}/linux/arch/lkl/kernel/time.c (100%) rename {src => vendor}/linux/arch/lkl/kernel/vmlinux.lds.S (100%) rename {src => vendor}/linux/arch/lkl/mm/Makefile (100%) rename {src => vendor}/linux/arch/lkl/mm/bootmem.c (100%) rename {src => vendor}/linux/arch/lkl/scripts/headers_install.py (100%) rename {src => vendor}/linux/arch/m32r/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/m68k/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/metag/boot/.gitignore (100%) rename {src => vendor}/linux/arch/metag/boot/dts/include/dt-bindings (100%) rename {src => vendor}/linux/arch/metag/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/microblaze/boot/.gitignore (100%) rename {src => vendor}/linux/arch/microblaze/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/mips/boot/.gitignore (100%) rename {src => vendor}/linux/arch/mips/boot/dts/include/dt-bindings (100%) rename {src => vendor}/linux/arch/mips/boot/tools/.gitignore (100%) rename {src => vendor}/linux/arch/mips/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/mips/vdso/.gitignore (100%) rename {src => vendor}/linux/arch/mn10300/boot/.gitignore (100%) rename {src => vendor}/linux/arch/parisc/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/powerpc/boot/.gitignore (100%) rename {src => vendor}/linux/arch/powerpc/boot/dts/include/dt-bindings (100%) rename {src => vendor}/linux/arch/powerpc/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/powerpc/kernel/vdso32/.gitignore (100%) rename {src => vendor}/linux/arch/powerpc/kernel/vdso64/.gitignore (100%) rename {src => vendor}/linux/arch/powerpc/platforms/cell/spufs/.gitignore (100%) rename {src => vendor}/linux/arch/s390/boot/.gitignore (100%) rename {src => vendor}/linux/arch/s390/boot/compressed/.gitignore (100%) rename {src => vendor}/linux/arch/s390/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/s390/kernel/vdso32/.gitignore (100%) rename {src => vendor}/linux/arch/s390/kernel/vdso64/.gitignore (100%) rename {src => vendor}/linux/arch/s390/tools/.gitignore (100%) rename {src => vendor}/linux/arch/sh/boot/.gitignore (100%) rename {src => vendor}/linux/arch/sh/boot/compressed/.gitignore (100%) rename {src => vendor}/linux/arch/sh/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/sh/kernel/vsyscall/.gitignore (100%) rename {src => vendor}/linux/arch/sparc/boot/.gitignore (100%) rename {src => vendor}/linux/arch/sparc/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/um/.gitignore (100%) rename {src => vendor}/linux/arch/unicore32/.gitignore (100%) rename {src => vendor}/linux/arch/x86/.gitignore (100%) rename {src => vendor}/linux/arch/x86/boot/.gitignore (100%) rename {src => vendor}/linux/arch/x86/boot/compressed/.gitignore (100%) rename {src => vendor}/linux/arch/x86/boot/tools/.gitignore (100%) rename {src => vendor}/linux/arch/x86/entry/syscalls/syscall_32.tbl (100%) rename {src => vendor}/linux/arch/x86/entry/vdso/.gitignore (100%) rename {src => vendor}/linux/arch/x86/entry/vdso/vdso32/.gitignore (100%) rename {src => vendor}/linux/arch/x86/kernel/.gitignore (100%) rename {src => vendor}/linux/arch/x86/kernel/cpu/.gitignore (100%) rename {src => vendor}/linux/arch/x86/lib/.gitignore (100%) rename {src => vendor}/linux/arch/x86/ras/Kconfig (100%) rename {src => vendor}/linux/arch/x86/realmode/rm/.gitignore (100%) rename {src => vendor}/linux/arch/x86/tools/.gitignore (100%) rename {src => vendor}/linux/arch/x86/um/vdso/.gitignore (100%) rename {src => vendor}/linux/arch/xtensa/boot/.gitignore (100%) rename {src => vendor}/linux/arch/xtensa/boot/boot-elf/.gitignore (100%) rename {src => vendor}/linux/arch/xtensa/boot/lib/.gitignore (100%) rename {src => vendor}/linux/arch/xtensa/kernel/.gitignore (100%) rename {src => vendor}/linux/block/Kconfig (100%) rename {src => vendor}/linux/block/Kconfig.iosched (100%) rename {src => vendor}/linux/block/Makefile (100%) rename {src => vendor}/linux/block/badblocks.c (100%) rename {src => vendor}/linux/block/bio.c (100%) rename {src => vendor}/linux/block/blk-core.c (100%) rename {src => vendor}/linux/block/blk-exec.c (100%) rename {src => vendor}/linux/block/blk-flush.c (100%) rename {src => vendor}/linux/block/blk-ioc.c (100%) rename {src => vendor}/linux/block/blk-lib.c (100%) rename {src => vendor}/linux/block/blk-map.c (100%) rename {src => vendor}/linux/block/blk-merge.c (100%) rename {src => vendor}/linux/block/blk-mq-cpumap.c (100%) rename {src => vendor}/linux/block/blk-mq-sysfs.c (100%) rename {src => vendor}/linux/block/blk-mq-tag.c (100%) rename {src => vendor}/linux/block/blk-mq-tag.h (100%) rename {src => vendor}/linux/block/blk-mq.c (100%) rename {src => vendor}/linux/block/blk-mq.h (100%) rename {src => vendor}/linux/block/blk-settings.c (100%) rename {src => vendor}/linux/block/blk-softirq.c (100%) rename {src => vendor}/linux/block/blk-sysfs.c (100%) rename {src => vendor}/linux/block/blk-tag.c (100%) rename {src => vendor}/linux/block/blk-timeout.c (100%) rename {src => vendor}/linux/block/blk.h (100%) rename {src => vendor}/linux/block/cfq-iosched.c (100%) rename {src => vendor}/linux/block/deadline-iosched.c (100%) rename {src => vendor}/linux/block/elevator.c (100%) rename {src => vendor}/linux/block/genhd.c (100%) rename {src => vendor}/linux/block/ioctl.c (100%) rename {src => vendor}/linux/block/ioprio.c (100%) rename {src => vendor}/linux/block/noop-iosched.c (100%) rename {src => vendor}/linux/block/partition-generic.c (100%) rename {src => vendor}/linux/block/partitions/Kconfig (100%) rename {src => vendor}/linux/block/partitions/Makefile (100%) rename {src => vendor}/linux/block/partitions/acorn.h (100%) rename {src => vendor}/linux/block/partitions/aix.h (100%) rename {src => vendor}/linux/block/partitions/amiga.h (100%) rename {src => vendor}/linux/block/partitions/atari.h (100%) rename {src => vendor}/linux/block/partitions/check.c (100%) rename {src => vendor}/linux/block/partitions/check.h (100%) rename {src => vendor}/linux/block/partitions/cmdline.h (100%) rename {src => vendor}/linux/block/partitions/efi.c (100%) rename {src => vendor}/linux/block/partitions/efi.h (100%) rename {src => vendor}/linux/block/partitions/ibm.h (100%) rename {src => vendor}/linux/block/partitions/karma.h (100%) rename {src => vendor}/linux/block/partitions/ldm.h (100%) rename {src => vendor}/linux/block/partitions/mac.h (100%) rename {src => vendor}/linux/block/partitions/msdos.c (100%) rename {src => vendor}/linux/block/partitions/msdos.h (100%) rename {src => vendor}/linux/block/partitions/osf.h (100%) rename {src => vendor}/linux/block/partitions/sgi.h (100%) rename {src => vendor}/linux/block/partitions/sun.h (100%) rename {src => vendor}/linux/block/partitions/sysv68.h (100%) rename {src => vendor}/linux/block/partitions/ultrix.h (100%) rename {src => vendor}/linux/block/scsi_ioctl.c (100%) rename {src => vendor}/linux/certs/.gitignore (100%) rename {src => vendor}/linux/certs/Kconfig (100%) rename {src => vendor}/linux/certs/Makefile (100%) rename {src => vendor}/linux/crypto/.gitignore (100%) rename {src => vendor}/linux/crypto/Kconfig (100%) rename {src => vendor}/linux/crypto/Makefile (100%) rename {src => vendor}/linux/crypto/ablkcipher.c (100%) rename {src => vendor}/linux/crypto/aead.c (100%) rename {src => vendor}/linux/crypto/aes_generic.c (100%) rename {src => vendor}/linux/crypto/ahash.c (100%) rename {src => vendor}/linux/crypto/akcipher.c (100%) rename {src => vendor}/linux/crypto/algapi.c (100%) rename {src => vendor}/linux/crypto/algboss.c (100%) rename {src => vendor}/linux/crypto/ansi_cprng.c (100%) rename {src => vendor}/linux/crypto/api.c (100%) rename {src => vendor}/linux/crypto/asymmetric_keys/.gitignore (100%) rename {src => vendor}/linux/crypto/asymmetric_keys/Kconfig (100%) rename {src => vendor}/linux/crypto/async_tx/Kconfig (100%) rename {src => vendor}/linux/crypto/blkcipher.c (100%) rename {src => vendor}/linux/crypto/cipher.c (100%) rename {src => vendor}/linux/crypto/compress.c (100%) rename {src => vendor}/linux/crypto/crc32c_generic.c (100%) rename {src => vendor}/linux/crypto/crypto_null.c (100%) rename {src => vendor}/linux/crypto/crypto_wq.c (100%) rename {src => vendor}/linux/crypto/drbg.c (100%) rename {src => vendor}/linux/crypto/echainiv.c (100%) rename {src => vendor}/linux/crypto/hmac.c (100%) rename {src => vendor}/linux/crypto/internal.h (100%) rename {src => vendor}/linux/crypto/jitterentropy-kcapi.c (100%) rename {src => vendor}/linux/crypto/jitterentropy.c (100%) rename {src => vendor}/linux/crypto/kpp.c (100%) rename {src => vendor}/linux/crypto/memneq.c (100%) rename {src => vendor}/linux/crypto/proc.c (100%) rename {src => vendor}/linux/crypto/rng.c (100%) rename {src => vendor}/linux/crypto/scatterwalk.c (100%) rename {src => vendor}/linux/crypto/sha256_generic.c (100%) rename {src => vendor}/linux/crypto/shash.c (100%) rename {src => vendor}/linux/crypto/skcipher.c (100%) rename {src => vendor}/linux/crypto/testmgr.c (100%) rename {src => vendor}/linux/crypto/xor.c (100%) rename {src => vendor}/linux/drivers/Kconfig (100%) rename {src => vendor}/linux/drivers/Makefile (100%) rename {src => vendor}/linux/drivers/accessibility/Kconfig (100%) rename {src => vendor}/linux/drivers/amba/Kconfig (100%) rename {src => vendor}/linux/drivers/amba/Makefile (100%) rename {src => vendor}/linux/drivers/android/Kconfig (100%) rename {src => vendor}/linux/drivers/ata/Kconfig (100%) rename {src => vendor}/linux/drivers/atm/.gitignore (100%) rename {src => vendor}/linux/drivers/atm/Kconfig (100%) rename {src => vendor}/linux/drivers/auxdisplay/Kconfig (100%) rename {src => vendor}/linux/drivers/auxdisplay/Makefile (100%) rename {src => vendor}/linux/drivers/base/Kconfig (100%) rename {src => vendor}/linux/drivers/base/Makefile (100%) rename {src => vendor}/linux/drivers/base/attribute_container.c (100%) rename {src => vendor}/linux/drivers/base/base.h (100%) rename {src => vendor}/linux/drivers/base/bus.c (100%) rename {src => vendor}/linux/drivers/base/cacheinfo.c (100%) rename {src => vendor}/linux/drivers/base/class.c (100%) rename {src => vendor}/linux/drivers/base/component.c (100%) rename {src => vendor}/linux/drivers/base/container.c (100%) rename {src => vendor}/linux/drivers/base/core.c (100%) rename {src => vendor}/linux/drivers/base/cpu.c (100%) rename {src => vendor}/linux/drivers/base/dd.c (100%) rename {src => vendor}/linux/drivers/base/devres.c (100%) rename {src => vendor}/linux/drivers/base/dma-mapping.c (100%) rename {src => vendor}/linux/drivers/base/driver.c (100%) rename {src => vendor}/linux/drivers/base/firmware.c (100%) rename {src => vendor}/linux/drivers/base/init.c (100%) rename {src => vendor}/linux/drivers/base/map.c (100%) rename {src => vendor}/linux/drivers/base/platform.c (100%) rename {src => vendor}/linux/drivers/base/power/Makefile (100%) rename {src => vendor}/linux/drivers/base/power/power.h (100%) rename {src => vendor}/linux/drivers/base/property.c (100%) rename {src => vendor}/linux/drivers/base/regmap/Kconfig (100%) rename {src => vendor}/linux/drivers/base/syscore.c (100%) rename {src => vendor}/linux/drivers/base/topology.c (100%) rename {src => vendor}/linux/drivers/base/transport_class.c (100%) rename {src => vendor}/linux/drivers/bcma/Kconfig (100%) rename {src => vendor}/linux/drivers/block/Kconfig (100%) rename {src => vendor}/linux/drivers/block/Makefile (100%) rename {src => vendor}/linux/drivers/block/drbd/Kconfig (100%) rename {src => vendor}/linux/drivers/block/mtip32xx/Kconfig (100%) rename {src => vendor}/linux/drivers/block/paride/Kconfig (100%) rename {src => vendor}/linux/drivers/block/virtio_blk.c (100%) rename {src => vendor}/linux/drivers/block/zram/Kconfig (100%) rename {src => vendor}/linux/drivers/bluetooth/Kconfig (100%) rename {src => vendor}/linux/drivers/bus/Kconfig (100%) rename {src => vendor}/linux/drivers/bus/Makefile (100%) rename {src => vendor}/linux/drivers/cdrom/Makefile (100%) rename {src => vendor}/linux/drivers/char/Kconfig (100%) rename {src => vendor}/linux/drivers/char/Makefile (100%) rename {src => vendor}/linux/drivers/char/agp/Kconfig (100%) rename {src => vendor}/linux/drivers/char/agp/Makefile (100%) rename {src => vendor}/linux/drivers/char/hw_random/Kconfig (100%) rename {src => vendor}/linux/drivers/char/hw_random/Makefile (100%) rename {src => vendor}/linux/drivers/char/hw_random/core.c (100%) rename {src => vendor}/linux/drivers/char/ipmi/Kconfig (100%) rename {src => vendor}/linux/drivers/char/ipmi/Makefile (100%) rename {src => vendor}/linux/drivers/char/mem.c (100%) rename {src => vendor}/linux/drivers/char/misc.c (100%) rename {src => vendor}/linux/drivers/char/pcmcia/Kconfig (100%) rename {src => vendor}/linux/drivers/char/random.c (100%) rename {src => vendor}/linux/drivers/char/tpm/Kconfig (100%) rename {src => vendor}/linux/drivers/char/tpm/st33zp24/Kconfig (100%) rename {src => vendor}/linux/drivers/char/xillybus/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/Makefile (100%) rename {src => vendor}/linux/drivers/clk/bcm/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/bcm/Makefile (100%) rename {src => vendor}/linux/drivers/clk/hisilicon/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/mediatek/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/meson/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/mvebu/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/mvebu/Makefile (100%) rename {src => vendor}/linux/drivers/clk/qcom/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/renesas/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/samsung/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/sunxi-ng/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/tegra/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/ti/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/ti/Makefile (100%) rename {src => vendor}/linux/drivers/clk/uniphier/Kconfig (100%) rename {src => vendor}/linux/drivers/clk/versatile/Kconfig (100%) rename {src => vendor}/linux/drivers/clocksource/Kconfig (100%) rename {src => vendor}/linux/drivers/clocksource/Makefile (100%) rename {src => vendor}/linux/drivers/connector/Kconfig (100%) rename {src => vendor}/linux/drivers/crypto/Kconfig (100%) rename {src => vendor}/linux/drivers/crypto/Makefile (100%) rename {src => vendor}/linux/drivers/crypto/caam/Kconfig (100%) rename {src => vendor}/linux/drivers/crypto/ccp/Kconfig (100%) rename {src => vendor}/linux/drivers/crypto/chelsio/Kconfig (100%) rename {src => vendor}/linux/drivers/crypto/nx/Kconfig (100%) rename {src => vendor}/linux/drivers/crypto/qat/Kconfig (100%) rename {src => vendor}/linux/drivers/crypto/qat/qat_common/.gitignore (100%) rename {src => vendor}/linux/drivers/crypto/ux500/Kconfig (100%) rename {src => vendor}/linux/drivers/crypto/vmx/.gitignore (100%) rename {src => vendor}/linux/drivers/crypto/vmx/Kconfig (100%) rename {src => vendor}/linux/drivers/dax/Kconfig (100%) rename {src => vendor}/linux/drivers/dca/Kconfig (100%) rename {src => vendor}/linux/drivers/devfreq/Kconfig (100%) rename {src => vendor}/linux/drivers/devfreq/event/Kconfig (100%) rename {src => vendor}/linux/drivers/dma-buf/Kconfig (100%) rename {src => vendor}/linux/drivers/dma/Kconfig (100%) rename {src => vendor}/linux/drivers/dma/bestcomm/Kconfig (100%) rename {src => vendor}/linux/drivers/dma/dw/Kconfig (100%) rename {src => vendor}/linux/drivers/dma/hsu/Kconfig (100%) rename {src => vendor}/linux/drivers/dma/qcom/Kconfig (100%) rename {src => vendor}/linux/drivers/dma/sh/Kconfig (100%) rename {src => vendor}/linux/drivers/edac/Kconfig (100%) rename {src => vendor}/linux/drivers/eisa/.gitignore (100%) rename {src => vendor}/linux/drivers/extcon/Kconfig (100%) rename {src => vendor}/linux/drivers/firewire/Kconfig (100%) rename {src => vendor}/linux/drivers/firewire/Makefile (100%) rename {src => vendor}/linux/drivers/firmware/Makefile (100%) rename {src => vendor}/linux/drivers/firmware/broadcom/Makefile (100%) rename {src => vendor}/linux/drivers/firmware/meson/Makefile (100%) rename {src => vendor}/linux/drivers/fmc/Kconfig (100%) rename {src => vendor}/linux/drivers/fpga/Kconfig (100%) rename {src => vendor}/linux/drivers/gpio/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/Makefile (100%) rename {src => vendor}/linux/drivers/gpu/drm/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/Makefile (100%) rename {src => vendor}/linux/drivers/gpu/drm/amd/acp/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/amd/amdgpu/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/amd/amdkfd/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/arc/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/arm/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/armada/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/ast/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/atmel-hlcdc/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/bochs/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/bridge/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/bridge/Makefile (100%) rename {src => vendor}/linux/drivers/gpu/drm/bridge/adv7511/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/bridge/analogix/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/cirrus/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/etnaviv/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/exynos/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/fsl-dcu/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/gma500/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/hisilicon/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/hisilicon/Makefile (100%) rename {src => vendor}/linux/drivers/gpu/drm/hisilicon/kirin/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/i2c/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/i2c/Makefile (100%) rename {src => vendor}/linux/drivers/gpu/drm/i915/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/i915/Kconfig.debug (100%) rename {src => vendor}/linux/drivers/gpu/drm/imx/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/mediatek/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/mgag200/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/msm/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/nouveau/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/omapdrm/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/omapdrm/Makefile (100%) rename {src => vendor}/linux/drivers/gpu/drm/omapdrm/displays/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/omapdrm/displays/Makefile (100%) rename {src => vendor}/linux/drivers/gpu/drm/omapdrm/dss/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/omapdrm/dss/Makefile (100%) rename {src => vendor}/linux/drivers/gpu/drm/panel/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/panel/Makefile (100%) rename {src => vendor}/linux/drivers/gpu/drm/qxl/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/radeon/.gitignore (100%) rename {src => vendor}/linux/drivers/gpu/drm/radeon/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/rcar-du/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/rockchip/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/shmobile/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/sti/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/sun4i/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/tegra/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/tilcdc/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/tilcdc/Makefile (100%) rename {src => vendor}/linux/drivers/gpu/drm/udl/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/vc4/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/virtio/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/drm/vmwgfx/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/host1x/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/ipu-v3/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/vga/Kconfig (100%) rename {src => vendor}/linux/drivers/gpu/vga/Makefile (100%) rename {src => vendor}/linux/drivers/hid/Kconfig (100%) rename {src => vendor}/linux/drivers/hid/Makefile (100%) rename {src => vendor}/linux/drivers/hid/hid-core.c (100%) rename {src => vendor}/linux/drivers/hid/hid-generic.c (100%) rename {src => vendor}/linux/drivers/hid/hid-ids.h (100%) rename {src => vendor}/linux/drivers/hid/hid-input.c (100%) rename {src => vendor}/linux/drivers/hid/i2c-hid/Kconfig (100%) rename {src => vendor}/linux/drivers/hid/intel-ish-hid/Kconfig (100%) rename {src => vendor}/linux/drivers/hid/usbhid/Kconfig (100%) rename {src => vendor}/linux/drivers/hsi/Kconfig (100%) rename {src => vendor}/linux/drivers/hsi/clients/Kconfig (100%) rename {src => vendor}/linux/drivers/hsi/controllers/Kconfig (100%) rename {src => vendor}/linux/drivers/hv/Kconfig (100%) rename {src => vendor}/linux/drivers/hwmon/Kconfig (100%) rename {src => vendor}/linux/drivers/hwmon/Makefile (100%) rename {src => vendor}/linux/drivers/hwmon/hwmon.c (100%) rename {src => vendor}/linux/drivers/hwmon/pmbus/Kconfig (100%) rename {src => vendor}/linux/drivers/hwspinlock/Kconfig (100%) rename {src => vendor}/linux/drivers/hwtracing/intel_th/Kconfig (100%) rename {src => vendor}/linux/drivers/hwtracing/intel_th/Makefile (100%) rename {src => vendor}/linux/drivers/hwtracing/stm/Kconfig (100%) rename {src => vendor}/linux/drivers/i2c/Kconfig (100%) rename {src => vendor}/linux/drivers/i2c/Makefile (100%) rename {src => vendor}/linux/drivers/i2c/algos/Kconfig (100%) rename {src => vendor}/linux/drivers/i2c/algos/Makefile (100%) rename {src => vendor}/linux/drivers/i2c/busses/Kconfig (100%) rename {src => vendor}/linux/drivers/i2c/busses/Makefile (100%) rename {src => vendor}/linux/drivers/i2c/muxes/Kconfig (100%) rename {src => vendor}/linux/drivers/i2c/muxes/Makefile (100%) rename {src => vendor}/linux/drivers/ide/Kconfig (100%) rename {src => vendor}/linux/drivers/idle/Makefile (100%) rename {src => vendor}/linux/drivers/iio/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/accel/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/adc/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/amplifiers/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/buffer/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/chemical/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/common/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/common/hid-sensors/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/common/ms_sensors/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/common/ssp_sensors/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/common/st_sensors/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/dac/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/dummy/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/frequency/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/gyro/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/health/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/humidity/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/imu/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/imu/bmi160/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/imu/inv_mpu6050/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/light/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/magnetometer/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/orientation/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/potentiometer/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/pressure/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/proximity/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/temperature/Kconfig (100%) rename {src => vendor}/linux/drivers/iio/trigger/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/cxgb3/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/cxgb4/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/hfi1/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/hns/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/i40iw/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/mlx4/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/mlx5/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/mthca/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/nes/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/ocrdma/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/qedr/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/qib/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/hw/usnic/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/sw/rdmavt/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/sw/rxe/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/ulp/ipoib/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/ulp/iser/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/ulp/isert/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/ulp/srp/Kconfig (100%) rename {src => vendor}/linux/drivers/infiniband/ulp/srpt/Kconfig (100%) rename {src => vendor}/linux/drivers/input/Kconfig (100%) rename {src => vendor}/linux/drivers/input/Makefile (100%) rename {src => vendor}/linux/drivers/input/ff-core.c (100%) rename {src => vendor}/linux/drivers/input/gameport/Kconfig (100%) rename {src => vendor}/linux/drivers/input/input-compat.c (100%) rename {src => vendor}/linux/drivers/input/input-compat.h (100%) rename {src => vendor}/linux/drivers/input/input-mt.c (100%) rename {src => vendor}/linux/drivers/input/input.c (100%) rename {src => vendor}/linux/drivers/input/joystick/Kconfig (100%) rename {src => vendor}/linux/drivers/input/joystick/iforce/Kconfig (100%) rename {src => vendor}/linux/drivers/input/keyboard/Kconfig (100%) rename {src => vendor}/linux/drivers/input/keyboard/Makefile (100%) rename {src => vendor}/linux/drivers/input/keyboard/atkbd.c (100%) rename {src => vendor}/linux/drivers/input/misc/Kconfig (100%) rename {src => vendor}/linux/drivers/input/mouse/Kconfig (100%) rename {src => vendor}/linux/drivers/input/mouse/Makefile (100%) rename {src => vendor}/linux/drivers/input/mouse/alps.c (100%) rename {src => vendor}/linux/drivers/input/mouse/alps.h (100%) rename {src => vendor}/linux/drivers/input/mouse/byd.c (100%) rename {src => vendor}/linux/drivers/input/mouse/byd.h (100%) rename {src => vendor}/linux/drivers/input/mouse/cypress_ps2.c (100%) rename {src => vendor}/linux/drivers/input/mouse/cypress_ps2.h (100%) rename {src => vendor}/linux/drivers/input/mouse/elantech.h (100%) rename {src => vendor}/linux/drivers/input/mouse/focaltech.c (100%) rename {src => vendor}/linux/drivers/input/mouse/focaltech.h (100%) rename {src => vendor}/linux/drivers/input/mouse/hgpk.h (100%) rename {src => vendor}/linux/drivers/input/mouse/lifebook.h (100%) rename {src => vendor}/linux/drivers/input/mouse/logips2pp.c (100%) rename {src => vendor}/linux/drivers/input/mouse/logips2pp.h (100%) rename {src => vendor}/linux/drivers/input/mouse/psmouse-base.c (100%) rename {src => vendor}/linux/drivers/input/mouse/psmouse.h (100%) rename {src => vendor}/linux/drivers/input/mouse/sentelic.h (100%) rename {src => vendor}/linux/drivers/input/mouse/synaptics.c (100%) rename {src => vendor}/linux/drivers/input/mouse/synaptics.h (100%) rename {src => vendor}/linux/drivers/input/mouse/touchkit_ps2.h (100%) rename {src => vendor}/linux/drivers/input/mouse/trackpoint.c (100%) rename {src => vendor}/linux/drivers/input/mouse/trackpoint.h (100%) rename {src => vendor}/linux/drivers/input/mouse/vmmouse.h (100%) rename {src => vendor}/linux/drivers/input/mousedev.c (100%) rename {src => vendor}/linux/drivers/input/rmi4/Kconfig (100%) rename {src => vendor}/linux/drivers/input/serio/Kconfig (100%) rename {src => vendor}/linux/drivers/input/serio/Makefile (100%) rename {src => vendor}/linux/drivers/input/serio/libps2.c (100%) rename {src => vendor}/linux/drivers/input/serio/serio.c (100%) rename {src => vendor}/linux/drivers/input/serio/serport.c (100%) rename {src => vendor}/linux/drivers/input/tablet/Kconfig (100%) rename {src => vendor}/linux/drivers/input/touchscreen/Kconfig (100%) rename {src => vendor}/linux/drivers/iommu/Kconfig (100%) rename {src => vendor}/linux/drivers/ipack/Kconfig (100%) rename {src => vendor}/linux/drivers/ipack/carriers/Kconfig (100%) rename {src => vendor}/linux/drivers/ipack/devices/Kconfig (100%) rename {src => vendor}/linux/drivers/irqchip/Kconfig (100%) rename {src => vendor}/linux/drivers/irqchip/Makefile (100%) rename {src => vendor}/linux/drivers/isdn/Kconfig (100%) rename {src => vendor}/linux/drivers/isdn/capi/Kconfig (100%) rename {src => vendor}/linux/drivers/isdn/gigaset/Kconfig (100%) rename {src => vendor}/linux/drivers/isdn/hardware/Kconfig (100%) rename {src => vendor}/linux/drivers/isdn/hardware/avm/Kconfig (100%) rename {src => vendor}/linux/drivers/isdn/hardware/eicon/Kconfig (100%) rename {src => vendor}/linux/drivers/isdn/hardware/mISDN/Kconfig (100%) rename {src => vendor}/linux/drivers/isdn/hisax/Kconfig (100%) rename {src => vendor}/linux/drivers/isdn/hysdn/Kconfig (100%) rename {src => vendor}/linux/drivers/isdn/i4l/Kconfig (100%) rename {src => vendor}/linux/drivers/isdn/mISDN/Kconfig (100%) rename {src => vendor}/linux/drivers/leds/Kconfig (100%) rename {src => vendor}/linux/drivers/leds/trigger/Kconfig (100%) rename {src => vendor}/linux/drivers/lguest/Makefile (100%) rename {src => vendor}/linux/drivers/lightnvm/Kconfig (100%) rename {src => vendor}/linux/drivers/macintosh/Kconfig (100%) rename {src => vendor}/linux/drivers/macintosh/Makefile (100%) rename {src => vendor}/linux/drivers/mailbox/Kconfig (100%) rename {src => vendor}/linux/drivers/mcb/Kconfig (100%) rename {src => vendor}/linux/drivers/md/Kconfig (100%) rename {src => vendor}/linux/drivers/md/bcache/Kconfig (100%) rename {src => vendor}/linux/drivers/md/persistent-data/Kconfig (100%) rename {src => vendor}/linux/drivers/media/Kconfig (100%) rename {src => vendor}/linux/drivers/media/Makefile (100%) rename {src => vendor}/linux/drivers/media/common/Kconfig (100%) rename {src => vendor}/linux/drivers/media/common/Makefile (100%) rename {src => vendor}/linux/drivers/media/common/b2c2/Kconfig (100%) rename {src => vendor}/linux/drivers/media/common/b2c2/Makefile (100%) rename {src => vendor}/linux/drivers/media/common/saa7146/Kconfig (100%) rename {src => vendor}/linux/drivers/media/common/saa7146/Makefile (100%) rename {src => vendor}/linux/drivers/media/common/siano/Kconfig (100%) rename {src => vendor}/linux/drivers/media/common/siano/Makefile (100%) rename {src => vendor}/linux/drivers/media/common/v4l2-tpg/Kconfig (100%) rename {src => vendor}/linux/drivers/media/common/v4l2-tpg/Makefile (100%) rename {src => vendor}/linux/drivers/media/dvb-core/Kconfig (100%) rename {src => vendor}/linux/drivers/media/dvb-frontends/Kconfig (100%) rename {src => vendor}/linux/drivers/media/dvb-frontends/drx39xyj/Kconfig (100%) rename {src => vendor}/linux/drivers/media/firewire/Kconfig (100%) rename {src => vendor}/linux/drivers/media/firewire/Makefile (100%) rename {src => vendor}/linux/drivers/media/i2c/Kconfig (100%) rename {src => vendor}/linux/drivers/media/i2c/Makefile (100%) rename {src => vendor}/linux/drivers/media/i2c/cx25840/Kconfig (100%) rename {src => vendor}/linux/drivers/media/i2c/m5mols/Kconfig (100%) rename {src => vendor}/linux/drivers/media/i2c/smiapp/Kconfig (100%) rename {src => vendor}/linux/drivers/media/i2c/soc_camera/Kconfig (100%) rename {src => vendor}/linux/drivers/media/i2c/soc_camera/Makefile (100%) rename {src => vendor}/linux/drivers/media/mmc/Kconfig (100%) rename {src => vendor}/linux/drivers/media/mmc/Makefile (100%) rename {src => vendor}/linux/drivers/media/mmc/siano/Kconfig (100%) rename {src => vendor}/linux/drivers/media/mmc/siano/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/b2c2/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/b2c2/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/bt8xx/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/cobalt/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/cx18/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/cx23885/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/cx25821/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/cx88/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/ddbridge/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/ddbridge/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/dm1105/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/dm1105/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/dt3155/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/ivtv/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/mantis/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/mantis/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/meye/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/netup_unidvb/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/netup_unidvb/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/ngene/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/ngene/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/pluto2/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/pluto2/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/pt1/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/pt1/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/pt3/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/pt3/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/saa7134/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/saa7146/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/saa7146/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/saa7164/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/smipcie/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/smipcie/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/solo6x10/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/sta2x11/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/ttpci/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/ttpci/Makefile (100%) rename {src => vendor}/linux/drivers/media/pci/tw5864/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/tw68/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/tw686x/Kconfig (100%) rename {src => vendor}/linux/drivers/media/pci/zoran/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/Makefile (100%) rename {src => vendor}/linux/drivers/media/platform/am437x/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/atmel/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/blackfin/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/davinci/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/exynos4-is/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/marvell-ccic/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/omap/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/omap/Makefile (100%) rename {src => vendor}/linux/drivers/media/platform/rcar-vin/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/soc_camera/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/sti/c8sectpfe/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/vivid/Kconfig (100%) rename {src => vendor}/linux/drivers/media/platform/xilinx/Kconfig (100%) rename {src => vendor}/linux/drivers/media/radio/Kconfig (100%) rename {src => vendor}/linux/drivers/media/radio/si470x/Kconfig (100%) rename {src => vendor}/linux/drivers/media/radio/si4713/Kconfig (100%) rename {src => vendor}/linux/drivers/media/radio/wl128x/Kconfig (100%) rename {src => vendor}/linux/drivers/media/rc/Kconfig (100%) rename {src => vendor}/linux/drivers/media/rc/Makefile (100%) rename {src => vendor}/linux/drivers/media/rc/img-ir/Kconfig (100%) rename {src => vendor}/linux/drivers/media/rc/keymaps/Kconfig (100%) rename {src => vendor}/linux/drivers/media/rc/keymaps/Makefile (100%) rename {src => vendor}/linux/drivers/media/spi/Kconfig (100%) rename {src => vendor}/linux/drivers/media/spi/Makefile (100%) rename {src => vendor}/linux/drivers/media/tuners/Kconfig (100%) rename {src => vendor}/linux/drivers/media/tuners/Makefile (100%) rename {src => vendor}/linux/drivers/media/usb/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/Makefile (100%) rename {src => vendor}/linux/drivers/media/usb/airspy/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/as102/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/au0828/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/b2c2/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/b2c2/Makefile (100%) rename {src => vendor}/linux/drivers/media/usb/cpia2/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/cx231xx/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/dvb-usb-v2/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/dvb-usb-v2/Makefile (100%) rename {src => vendor}/linux/drivers/media/usb/dvb-usb/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/dvb-usb/Makefile (100%) rename {src => vendor}/linux/drivers/media/usb/em28xx/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/go7007/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/gspca/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/gspca/gl860/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/gspca/m5602/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/gspca/stv06xx/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/hackrf/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/hdpvr/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/msi2500/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/pvrusb2/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/pwc/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/s2255/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/s2255/Makefile (100%) rename {src => vendor}/linux/drivers/media/usb/siano/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/siano/Makefile (100%) rename {src => vendor}/linux/drivers/media/usb/stk1160/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/stkwebcam/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/stkwebcam/Makefile (100%) rename {src => vendor}/linux/drivers/media/usb/tm6000/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/ttusb-budget/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/ttusb-budget/Makefile (100%) rename {src => vendor}/linux/drivers/media/usb/ttusb-dec/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/ttusb-dec/Makefile (100%) rename {src => vendor}/linux/drivers/media/usb/usbtv/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/usbvision/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/uvc/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/zr364xx/Kconfig (100%) rename {src => vendor}/linux/drivers/media/usb/zr364xx/Makefile (100%) rename {src => vendor}/linux/drivers/media/v4l2-core/Kconfig (100%) rename {src => vendor}/linux/drivers/memory/Kconfig (100%) rename {src => vendor}/linux/drivers/memory/samsung/Kconfig (100%) rename {src => vendor}/linux/drivers/memory/tegra/Kconfig (100%) rename {src => vendor}/linux/drivers/memstick/Kconfig (100%) rename {src => vendor}/linux/drivers/memstick/core/Kconfig (100%) rename {src => vendor}/linux/drivers/memstick/host/Kconfig (100%) rename {src => vendor}/linux/drivers/message/fusion/Kconfig (100%) rename {src => vendor}/linux/drivers/mfd/Kconfig (100%) rename {src => vendor}/linux/drivers/mfd/Makefile (100%) rename {src => vendor}/linux/drivers/misc/Kconfig (100%) rename {src => vendor}/linux/drivers/misc/Makefile (100%) rename {src => vendor}/linux/drivers/misc/altera-stapl/Kconfig (100%) rename {src => vendor}/linux/drivers/misc/c2port/Kconfig (100%) rename {src => vendor}/linux/drivers/misc/cb710/Kconfig (100%) rename {src => vendor}/linux/drivers/misc/cb710/Makefile (100%) rename {src => vendor}/linux/drivers/misc/cxl/Kconfig (100%) rename {src => vendor}/linux/drivers/misc/echo/Kconfig (100%) rename {src => vendor}/linux/drivers/misc/eeprom/Kconfig (100%) rename {src => vendor}/linux/drivers/misc/eeprom/Makefile (100%) rename {src => vendor}/linux/drivers/misc/genwqe/Kconfig (100%) rename {src => vendor}/linux/drivers/misc/lis3lv02d/Kconfig (100%) rename {src => vendor}/linux/drivers/misc/lis3lv02d/Makefile (100%) rename {src => vendor}/linux/drivers/misc/mei/Kconfig (100%) rename {src => vendor}/linux/drivers/misc/mic/Kconfig (100%) rename {src => vendor}/linux/drivers/misc/mic/Makefile (100%) rename {src => vendor}/linux/drivers/misc/mic/bus/Makefile (100%) rename {src => vendor}/linux/drivers/misc/ti-st/Kconfig (100%) rename {src => vendor}/linux/drivers/misc/ti-st/Makefile (100%) rename {src => vendor}/linux/drivers/misc/vmw_vmci/Kconfig (100%) rename {src => vendor}/linux/drivers/mmc/Kconfig (100%) rename {src => vendor}/linux/drivers/mmc/Makefile (100%) rename {src => vendor}/linux/drivers/mmc/card/Kconfig (100%) rename {src => vendor}/linux/drivers/mmc/core/Kconfig (100%) rename {src => vendor}/linux/drivers/mmc/host/Kconfig (100%) rename {src => vendor}/linux/drivers/mtd/Kconfig (100%) rename {src => vendor}/linux/drivers/mtd/chips/Kconfig (100%) rename {src => vendor}/linux/drivers/mtd/devices/Kconfig (100%) rename {src => vendor}/linux/drivers/mtd/lpddr/Kconfig (100%) rename {src => vendor}/linux/drivers/mtd/maps/Kconfig (100%) rename {src => vendor}/linux/drivers/mtd/nand/Kconfig (100%) rename {src => vendor}/linux/drivers/mtd/onenand/Kconfig (100%) rename {src => vendor}/linux/drivers/mtd/spi-nor/Kconfig (100%) rename {src => vendor}/linux/drivers/mtd/ubi/Kconfig (100%) rename {src => vendor}/linux/drivers/net/Kconfig (100%) rename {src => vendor}/linux/drivers/net/Makefile (100%) rename {src => vendor}/linux/drivers/net/Space.c (100%) rename {src => vendor}/linux/drivers/net/appletalk/Kconfig (100%) rename {src => vendor}/linux/drivers/net/arcnet/Kconfig (100%) rename {src => vendor}/linux/drivers/net/caif/Kconfig (100%) rename {src => vendor}/linux/drivers/net/can/Kconfig (100%) rename {src => vendor}/linux/drivers/net/can/c_can/Kconfig (100%) rename {src => vendor}/linux/drivers/net/can/cc770/Kconfig (100%) rename {src => vendor}/linux/drivers/net/can/ifi_canfd/Kconfig (100%) rename {src => vendor}/linux/drivers/net/can/m_can/Kconfig (100%) rename {src => vendor}/linux/drivers/net/can/mscan/Kconfig (100%) rename {src => vendor}/linux/drivers/net/can/rcar/Kconfig (100%) rename {src => vendor}/linux/drivers/net/can/sja1000/Kconfig (100%) rename {src => vendor}/linux/drivers/net/can/softing/Kconfig (100%) rename {src => vendor}/linux/drivers/net/can/spi/Kconfig (100%) rename {src => vendor}/linux/drivers/net/can/usb/Kconfig (100%) rename {src => vendor}/linux/drivers/net/dsa/Kconfig (100%) rename {src => vendor}/linux/drivers/net/dsa/b53/Kconfig (100%) rename {src => vendor}/linux/drivers/net/dsa/mv88e6xxx/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/3com/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/8390/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/adaptec/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/adi/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/aeroflex/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/agere/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/allwinner/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/alteon/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/altera/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/amazon/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/amd/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/apm/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/apm/xgene/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/apple/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/arc/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/atheros/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/aurora/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/broadcom/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/brocade/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/brocade/bna/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/cadence/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/calxeda/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/cavium/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/chelsio/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/cirrus/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/cisco/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/cisco/enic/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/davicom/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/dec/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/dec/tulip/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/dlink/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/emulex/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/emulex/benet/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/ezchip/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/faraday/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/freescale/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/freescale/fman/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/freescale/fs_enet/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/fujitsu/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/hisilicon/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/hp/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/i825xx/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/ibm/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/ibm/emac/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/intel/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/marvell/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/mediatek/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/mellanox/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/mellanox/mlx4/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/mellanox/mlx5/core/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/mellanox/mlxsw/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/micrel/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/microchip/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/moxa/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/myricom/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/natsemi/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/neterion/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/netronome/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/nuvoton/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/nvidia/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/nxp/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/oki-semi/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/packetengines/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/pasemi/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/qlogic/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/qualcomm/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/rdc/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/realtek/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/renesas/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/rocker/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/samsung/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/seeq/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/sfc/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/sgi/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/silan/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/sis/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/smsc/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/stmicro/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/stmicro/stmmac/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/sun/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/synopsys/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/tehuti/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/ti/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/tile/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/toshiba/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/tundra/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/via/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/wiznet/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/xilinx/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/xircom/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ethernet/xscale/Kconfig (100%) rename {src => vendor}/linux/drivers/net/fddi/Kconfig (100%) rename {src => vendor}/linux/drivers/net/hamradio/Kconfig (100%) rename {src => vendor}/linux/drivers/net/hippi/Kconfig (100%) rename {src => vendor}/linux/drivers/net/hyperv/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ieee802154/Kconfig (100%) rename {src => vendor}/linux/drivers/net/irda/Kconfig (100%) rename {src => vendor}/linux/drivers/net/loopback.c (100%) rename {src => vendor}/linux/drivers/net/phy/Kconfig (100%) rename {src => vendor}/linux/drivers/net/plip/Kconfig (100%) rename {src => vendor}/linux/drivers/net/ppp/Kconfig (100%) rename {src => vendor}/linux/drivers/net/slip/Kconfig (100%) rename {src => vendor}/linux/drivers/net/team/Kconfig (100%) rename {src => vendor}/linux/drivers/net/usb/Kconfig (100%) rename {src => vendor}/linux/drivers/net/virtio_net.c (100%) rename {src => vendor}/linux/drivers/net/wan/.gitignore (100%) rename {src => vendor}/linux/drivers/net/wan/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wimax/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wimax/i2400m/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/admtek/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ath/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ath/ar5523/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ath/ath10k/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ath/ath5k/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ath/ath6kl/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ath/ath9k/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ath/carl9170/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ath/wcn36xx/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ath/wil6210/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/atmel/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/broadcom/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/broadcom/b43/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/broadcom/b43legacy/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/broadcom/brcm80211/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/cisco/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/intel/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/intel/ipw2x00/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/intel/iwlegacy/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/intel/iwlwifi/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/intersil/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/intersil/hostap/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/intersil/orinoco/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/intersil/p54/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/marvell/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/marvell/libertas/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/marvell/libertas_tf/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/marvell/mwifiex/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/mediatek/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/mediatek/mt7601u/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ralink/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ralink/rt2x00/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/realtek/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/realtek/rtl818x/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/realtek/rtl8xxxu/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/realtek/rtlwifi/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/rsi/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/st/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/st/cw1200/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ti/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ti/wl1251/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ti/wl12xx/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ti/wl18xx/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/ti/wlcore/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/zydas/Kconfig (100%) rename {src => vendor}/linux/drivers/net/wireless/zydas/zd1211rw/Kconfig (100%) rename {src => vendor}/linux/drivers/nfc/Kconfig (100%) rename {src => vendor}/linux/drivers/nfc/Makefile (100%) rename {src => vendor}/linux/drivers/nfc/fdp/Kconfig (100%) rename {src => vendor}/linux/drivers/nfc/microread/Kconfig (100%) rename {src => vendor}/linux/drivers/nfc/nfcmrvl/Kconfig (100%) rename {src => vendor}/linux/drivers/nfc/nxp-nci/Kconfig (100%) rename {src => vendor}/linux/drivers/nfc/pn533/Kconfig (100%) rename {src => vendor}/linux/drivers/nfc/pn544/Kconfig (100%) rename {src => vendor}/linux/drivers/nfc/s3fwrn5/Kconfig (100%) rename {src => vendor}/linux/drivers/nfc/st-nci/Kconfig (100%) rename {src => vendor}/linux/drivers/nfc/st21nfca/Kconfig (100%) rename {src => vendor}/linux/drivers/nfc/st95hf/Kconfig (100%) rename {src => vendor}/linux/drivers/ntb/Kconfig (100%) rename {src => vendor}/linux/drivers/ntb/hw/Kconfig (100%) rename {src => vendor}/linux/drivers/ntb/hw/amd/Kconfig (100%) rename {src => vendor}/linux/drivers/ntb/hw/intel/Kconfig (100%) rename {src => vendor}/linux/drivers/ntb/test/Kconfig (100%) rename {src => vendor}/linux/drivers/nvdimm/Kconfig (100%) rename {src => vendor}/linux/drivers/nvme/Kconfig (100%) rename {src => vendor}/linux/drivers/nvme/Makefile (100%) rename {src => vendor}/linux/drivers/nvme/host/Kconfig (100%) rename {src => vendor}/linux/drivers/nvme/host/Makefile (100%) rename {src => vendor}/linux/drivers/nvme/target/Kconfig (100%) rename {src => vendor}/linux/drivers/nvme/target/Makefile (100%) rename {src => vendor}/linux/drivers/nvmem/Kconfig (100%) rename {src => vendor}/linux/drivers/of/Kconfig (100%) rename {src => vendor}/linux/drivers/of/unittest-data/.gitignore (100%) rename {src => vendor}/linux/drivers/parport/Kconfig (100%) rename {src => vendor}/linux/drivers/perf/Kconfig (100%) rename {src => vendor}/linux/drivers/phy/Kconfig (100%) rename {src => vendor}/linux/drivers/phy/tegra/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/aspeed/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/bcm/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/berlin/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/freescale/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/intel/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/mediatek/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/mvebu/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/nomadik/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/pxa/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/qcom/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/samsung/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/sh-pfc/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/spear/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/stm32/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/sunxi/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/tegra/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/uniphier/Kconfig (100%) rename {src => vendor}/linux/drivers/pinctrl/vt8500/Kconfig (100%) rename {src => vendor}/linux/drivers/platform/Kconfig (100%) rename {src => vendor}/linux/drivers/platform/Makefile (100%) rename {src => vendor}/linux/drivers/platform/chrome/Kconfig (100%) rename {src => vendor}/linux/drivers/platform/goldfish/Kconfig (100%) rename {src => vendor}/linux/drivers/platform/mips/Kconfig (100%) rename {src => vendor}/linux/drivers/platform/x86/Kconfig (100%) rename {src => vendor}/linux/drivers/pnp/Kconfig (100%) rename {src => vendor}/linux/drivers/pnp/isapnp/Kconfig (100%) rename {src => vendor}/linux/drivers/pnp/pnpacpi/Kconfig (100%) rename {src => vendor}/linux/drivers/pnp/pnpbios/Kconfig (100%) rename {src => vendor}/linux/drivers/power/Kconfig (100%) rename {src => vendor}/linux/drivers/power/Makefile (100%) rename {src => vendor}/linux/drivers/power/avs/Kconfig (100%) rename {src => vendor}/linux/drivers/power/reset/Kconfig (100%) rename {src => vendor}/linux/drivers/power/supply/Kconfig (100%) rename {src => vendor}/linux/drivers/powercap/Kconfig (100%) rename {src => vendor}/linux/drivers/pps/Kconfig (100%) rename {src => vendor}/linux/drivers/pps/clients/Kconfig (100%) rename {src => vendor}/linux/drivers/pps/generators/Kconfig (100%) rename {src => vendor}/linux/drivers/ptp/Kconfig (100%) rename {src => vendor}/linux/drivers/pwm/Kconfig (100%) rename {src => vendor}/linux/drivers/pwm/Makefile (100%) rename {src => vendor}/linux/drivers/ras/Kconfig (100%) rename {src => vendor}/linux/drivers/regulator/Kconfig (100%) rename {src => vendor}/linux/drivers/remoteproc/Kconfig (100%) rename {src => vendor}/linux/drivers/reset/Kconfig (100%) rename {src => vendor}/linux/drivers/reset/hisilicon/Kconfig (100%) rename {src => vendor}/linux/drivers/reset/sti/Kconfig (100%) rename {src => vendor}/linux/drivers/rpmsg/Kconfig (100%) rename {src => vendor}/linux/drivers/rtc/Kconfig (100%) rename {src => vendor}/linux/drivers/s390/block/Kconfig (100%) rename {src => vendor}/linux/drivers/s390/char/Kconfig (100%) rename {src => vendor}/linux/drivers/s390/net/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/.gitignore (100%) rename {src => vendor}/linux/drivers/scsi/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/aic7xxx/.gitignore (100%) rename {src => vendor}/linux/drivers/scsi/aic7xxx/Kconfig.aic79xx (100%) rename {src => vendor}/linux/drivers/scsi/aic7xxx/Kconfig.aic7xxx (100%) rename {src => vendor}/linux/drivers/scsi/aic94xx/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/arm/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/be2iscsi/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/bnx2fc/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/bnx2i/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/csiostor/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/cxgbi/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/cxgbi/cxgb3i/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/cxgbi/cxgb4i/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/cxlflash/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/device_handler/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/esas2r/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/hisi_sas/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/libsas/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/megaraid/Kconfig.megaraid (100%) rename {src => vendor}/linux/drivers/scsi/mpt3sas/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/mvsas/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/osd/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/pcmcia/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/qla2xxx/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/qla4xxx/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/smartpqi/Kconfig (100%) rename {src => vendor}/linux/drivers/scsi/ufs/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/Makefile (100%) rename {src => vendor}/linux/drivers/soc/bcm/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/bcm/Makefile (100%) rename {src => vendor}/linux/drivers/soc/fsl/Makefile (100%) rename {src => vendor}/linux/drivers/soc/fsl/qbman/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/fsl/qe/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/mediatek/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/qcom/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/rockchip/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/samsung/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/sunxi/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/tegra/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/ti/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/ux500/Kconfig (100%) rename {src => vendor}/linux/drivers/soc/versatile/Kconfig (100%) rename {src => vendor}/linux/drivers/spi/Kconfig (100%) rename {src => vendor}/linux/drivers/spmi/Kconfig (100%) rename {src => vendor}/linux/drivers/ssb/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/android/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/android/ion/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/android/ion/hisilicon/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/board/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/clocking-wizard/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/comedi/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/dgnc/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/emxx_udc/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/fbtft/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/fsl-mc/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/fsl-mc/bus/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/fwserial/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/gdm724x/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/goldfish/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/greybus/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/greybus/tools/.gitignore (100%) rename {src => vendor}/linux/drivers/staging/gs_fpgaboot/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/i4l/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/i4l/act2000/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/i4l/icn/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/i4l/pcbit/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/iio/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/iio/accel/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/iio/adc/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/iio/addac/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/iio/cdc/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/iio/frequency/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/iio/gyro/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/iio/impedance-analyzer/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/iio/light/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/iio/meter/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/iio/resolver/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/iio/trigger/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/ks7010/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/lustre/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/lustre/lnet/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/lustre/lustre/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/media/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/media/bcm2048/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/media/cec/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/media/cxd2099/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/media/davinci_vpfe/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/media/lirc/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/media/omap4iss/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/media/pulse8-cec/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/media/s5p-cec/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/media/st-cec/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/most/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/most/aim-cdev/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/most/aim-network/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/most/aim-sound/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/most/aim-v4l2/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/most/hdm-dim2/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/most/hdm-i2c/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/most/hdm-usb/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/most/mostcore/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/mt29f_spinand/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/netlogic/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/nvec/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/octeon-usb/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/octeon/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/olpc_dcon/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/rtl8188eu/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/rtl8192e/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/rtl8192e/rtl8192e/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/rtl8192u/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/rtl8712/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/rts5208/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/skein/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/slicoss/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/sm750fb/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/speakup/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/unisys/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/unisys/visorbus/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/unisys/visorhba/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/unisys/visorinput/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/unisys/visornic/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/vc04_services/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/vme/devices/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/vt6655/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/vt6656/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/wilc1000/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/wlan-ng/Kconfig (100%) rename {src => vendor}/linux/drivers/staging/xgifb/Kconfig (100%) rename {src => vendor}/linux/drivers/target/Kconfig (100%) rename {src => vendor}/linux/drivers/target/iscsi/Kconfig (100%) rename {src => vendor}/linux/drivers/target/iscsi/cxgbit/Kconfig (100%) rename {src => vendor}/linux/drivers/target/loopback/Kconfig (100%) rename {src => vendor}/linux/drivers/target/sbp/Kconfig (100%) rename {src => vendor}/linux/drivers/target/tcm_fc/Kconfig (100%) rename {src => vendor}/linux/drivers/thermal/Kconfig (100%) rename {src => vendor}/linux/drivers/thermal/int340x_thermal/Kconfig (100%) rename {src => vendor}/linux/drivers/thermal/qcom/Kconfig (100%) rename {src => vendor}/linux/drivers/thermal/samsung/Kconfig (100%) rename {src => vendor}/linux/drivers/thermal/st/Kconfig (100%) rename {src => vendor}/linux/drivers/thermal/tegra/Kconfig (100%) rename {src => vendor}/linux/drivers/thermal/ti-soc-thermal/Kconfig (100%) rename {src => vendor}/linux/drivers/thunderbolt/Kconfig (100%) rename {src => vendor}/linux/drivers/tty/Kconfig (100%) rename {src => vendor}/linux/drivers/tty/Makefile (100%) rename {src => vendor}/linux/drivers/tty/hvc/Kconfig (100%) rename {src => vendor}/linux/drivers/tty/ipwireless/Makefile (100%) rename {src => vendor}/linux/drivers/tty/n_tty.c (100%) rename {src => vendor}/linux/drivers/tty/pty.c (100%) rename {src => vendor}/linux/drivers/tty/serial/8250/Kconfig (100%) rename {src => vendor}/linux/drivers/tty/serial/Kconfig (100%) rename {src => vendor}/linux/drivers/tty/serial/Makefile (100%) rename {src => vendor}/linux/drivers/tty/tty_buffer.c (100%) rename {src => vendor}/linux/drivers/tty/tty_io.c (100%) rename {src => vendor}/linux/drivers/tty/tty_ioctl.c (100%) rename {src => vendor}/linux/drivers/tty/tty_ldisc.c (100%) rename {src => vendor}/linux/drivers/tty/tty_ldsem.c (100%) rename {src => vendor}/linux/drivers/tty/tty_mutex.c (100%) rename {src => vendor}/linux/drivers/tty/tty_port.c (100%) rename {src => vendor}/linux/drivers/tty/vt/.gitignore (100%) rename {src => vendor}/linux/drivers/tty/vt/Makefile (100%) rename {src => vendor}/linux/drivers/uio/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/atm/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/chipidea/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/class/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/core/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/dwc2/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/dwc3/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/gadget/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/gadget/legacy/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/gadget/udc/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/gadget/udc/bdc/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/host/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/image/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/isp1760/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/misc/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/misc/sisusbvga/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/mon/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/musb/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/phy/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/renesas_usbhs/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/serial/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/storage/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/usbip/Kconfig (100%) rename {src => vendor}/linux/drivers/usb/wusbcore/Kconfig (100%) rename {src => vendor}/linux/drivers/uwb/Kconfig (100%) rename {src => vendor}/linux/drivers/vfio/Kconfig (100%) rename {src => vendor}/linux/drivers/vfio/pci/Kconfig (100%) rename {src => vendor}/linux/drivers/vfio/platform/Kconfig (100%) rename {src => vendor}/linux/drivers/vfio/platform/reset/Kconfig (100%) rename {src => vendor}/linux/drivers/vhost/Kconfig.vringh (100%) rename {src => vendor}/linux/drivers/video/Kconfig (100%) rename {src => vendor}/linux/drivers/video/Makefile (100%) rename {src => vendor}/linux/drivers/video/backlight/Kconfig (100%) rename {src => vendor}/linux/drivers/video/backlight/Makefile (100%) rename {src => vendor}/linux/drivers/video/console/Kconfig (100%) rename {src => vendor}/linux/drivers/video/fbdev/Kconfig (100%) rename {src => vendor}/linux/drivers/video/fbdev/Makefile (100%) rename {src => vendor}/linux/drivers/video/fbdev/core/Makefile (100%) rename {src => vendor}/linux/drivers/video/fbdev/geode/Kconfig (100%) rename {src => vendor}/linux/drivers/video/fbdev/mmp/Kconfig (100%) rename {src => vendor}/linux/drivers/video/fbdev/mmp/fb/Kconfig (100%) rename {src => vendor}/linux/drivers/video/fbdev/mmp/hw/Kconfig (100%) rename {src => vendor}/linux/drivers/video/fbdev/mmp/panel/Kconfig (100%) rename {src => vendor}/linux/drivers/video/fbdev/omap/Kconfig (100%) rename {src => vendor}/linux/drivers/video/fbdev/omap2/Kconfig (100%) rename {src => vendor}/linux/drivers/video/fbdev/omap2/Makefile (100%) rename {src => vendor}/linux/drivers/video/fbdev/omap2/omapfb/Kconfig (100%) rename {src => vendor}/linux/drivers/video/fbdev/omap2/omapfb/Makefile (100%) rename {src => vendor}/linux/drivers/video/fbdev/omap2/omapfb/displays/Kconfig (100%) rename {src => vendor}/linux/drivers/video/fbdev/omap2/omapfb/displays/Makefile (100%) rename {src => vendor}/linux/drivers/video/fbdev/omap2/omapfb/dss/Kconfig (100%) rename {src => vendor}/linux/drivers/video/fbdev/omap2/omapfb/dss/Makefile (100%) rename {src => vendor}/linux/drivers/video/logo/.gitignore (100%) rename {src => vendor}/linux/drivers/video/logo/Kconfig (100%) rename {src => vendor}/linux/drivers/virt/Kconfig (100%) rename {src => vendor}/linux/drivers/virtio/Kconfig (100%) rename {src => vendor}/linux/drivers/virtio/Makefile (100%) rename {src => vendor}/linux/drivers/virtio/virtio.c (100%) rename {src => vendor}/linux/drivers/virtio/virtio_mmio.c (100%) rename {src => vendor}/linux/drivers/virtio/virtio_ring.c (100%) rename {src => vendor}/linux/drivers/vlynq/Kconfig (100%) rename {src => vendor}/linux/drivers/vme/Kconfig (100%) rename {src => vendor}/linux/drivers/vme/boards/Kconfig (100%) rename {src => vendor}/linux/drivers/vme/bridges/Kconfig (100%) rename {src => vendor}/linux/drivers/w1/Kconfig (100%) rename {src => vendor}/linux/drivers/w1/masters/Kconfig (100%) rename {src => vendor}/linux/drivers/w1/slaves/Kconfig (100%) rename {src => vendor}/linux/drivers/watchdog/Kconfig (100%) rename {src => vendor}/linux/drivers/xen/Kconfig (100%) rename {src => vendor}/linux/drivers/zorro/.gitignore (100%) rename {src => vendor}/linux/firmware/.gitignore (100%) rename {src => vendor}/linux/firmware/Makefile (100%) rename {src => vendor}/linux/firmware/cis/.gitignore (100%) rename {src => vendor}/linux/fs/9p/Kconfig (100%) rename {src => vendor}/linux/fs/Kconfig (100%) rename {src => vendor}/linux/fs/Makefile (100%) rename {src => vendor}/linux/fs/adfs/Kconfig (100%) rename {src => vendor}/linux/fs/affs/Kconfig (100%) rename {src => vendor}/linux/fs/afs/Kconfig (100%) rename {src => vendor}/linux/fs/anon_inodes.c (100%) rename {src => vendor}/linux/fs/attr.c (100%) rename {src => vendor}/linux/fs/autofs4/Kconfig (100%) rename {src => vendor}/linux/fs/bad_inode.c (100%) rename {src => vendor}/linux/fs/befs/Kconfig (100%) rename {src => vendor}/linux/fs/bfs/Kconfig (100%) rename {src => vendor}/linux/fs/block_dev.c (100%) rename {src => vendor}/linux/fs/btrfs/Kconfig (100%) rename {src => vendor}/linux/fs/btrfs/Makefile (100%) rename {src => vendor}/linux/fs/btrfs/acl.c (100%) rename {src => vendor}/linux/fs/btrfs/async-thread.c (100%) rename {src => vendor}/linux/fs/btrfs/async-thread.h (100%) rename {src => vendor}/linux/fs/btrfs/backref.c (100%) rename {src => vendor}/linux/fs/btrfs/backref.h (100%) rename {src => vendor}/linux/fs/btrfs/btrfs_inode.h (100%) rename {src => vendor}/linux/fs/btrfs/check-integrity.h (100%) rename {src => vendor}/linux/fs/btrfs/compression.c (100%) rename {src => vendor}/linux/fs/btrfs/compression.h (100%) rename {src => vendor}/linux/fs/btrfs/ctree.c (100%) rename {src => vendor}/linux/fs/btrfs/ctree.h (100%) rename {src => vendor}/linux/fs/btrfs/dedupe.h (100%) rename {src => vendor}/linux/fs/btrfs/delayed-inode.c (100%) rename {src => vendor}/linux/fs/btrfs/delayed-inode.h (100%) rename {src => vendor}/linux/fs/btrfs/delayed-ref.c (100%) rename {src => vendor}/linux/fs/btrfs/delayed-ref.h (100%) rename {src => vendor}/linux/fs/btrfs/dev-replace.c (100%) rename {src => vendor}/linux/fs/btrfs/dev-replace.h (100%) rename {src => vendor}/linux/fs/btrfs/dir-item.c (100%) rename {src => vendor}/linux/fs/btrfs/disk-io.c (100%) rename {src => vendor}/linux/fs/btrfs/disk-io.h (100%) rename {src => vendor}/linux/fs/btrfs/export.c (100%) rename {src => vendor}/linux/fs/btrfs/export.h (100%) rename {src => vendor}/linux/fs/btrfs/extent-tree.c (100%) rename {src => vendor}/linux/fs/btrfs/extent_io.c (100%) rename {src => vendor}/linux/fs/btrfs/extent_io.h (100%) rename {src => vendor}/linux/fs/btrfs/extent_map.c (100%) rename {src => vendor}/linux/fs/btrfs/extent_map.h (100%) rename {src => vendor}/linux/fs/btrfs/file-item.c (100%) rename {src => vendor}/linux/fs/btrfs/file.c (100%) rename {src => vendor}/linux/fs/btrfs/free-space-cache.c (100%) rename {src => vendor}/linux/fs/btrfs/free-space-cache.h (100%) rename {src => vendor}/linux/fs/btrfs/free-space-tree.c (100%) rename {src => vendor}/linux/fs/btrfs/free-space-tree.h (100%) rename {src => vendor}/linux/fs/btrfs/hash.c (100%) rename {src => vendor}/linux/fs/btrfs/hash.h (100%) rename {src => vendor}/linux/fs/btrfs/inode-item.c (100%) rename {src => vendor}/linux/fs/btrfs/inode-map.c (100%) rename {src => vendor}/linux/fs/btrfs/inode-map.h (100%) rename {src => vendor}/linux/fs/btrfs/inode.c (100%) rename {src => vendor}/linux/fs/btrfs/ioctl.c (100%) rename {src => vendor}/linux/fs/btrfs/locking.c (100%) rename {src => vendor}/linux/fs/btrfs/locking.h (100%) rename {src => vendor}/linux/fs/btrfs/lzo.c (100%) rename {src => vendor}/linux/fs/btrfs/math.h (100%) rename {src => vendor}/linux/fs/btrfs/ordered-data.c (100%) rename {src => vendor}/linux/fs/btrfs/ordered-data.h (100%) rename {src => vendor}/linux/fs/btrfs/orphan.c (100%) rename {src => vendor}/linux/fs/btrfs/print-tree.c (100%) rename {src => vendor}/linux/fs/btrfs/print-tree.h (100%) rename {src => vendor}/linux/fs/btrfs/props.c (100%) rename {src => vendor}/linux/fs/btrfs/props.h (100%) rename {src => vendor}/linux/fs/btrfs/qgroup.c (100%) rename {src => vendor}/linux/fs/btrfs/qgroup.h (100%) rename {src => vendor}/linux/fs/btrfs/raid56.c (100%) rename {src => vendor}/linux/fs/btrfs/raid56.h (100%) rename {src => vendor}/linux/fs/btrfs/rcu-string.h (100%) rename {src => vendor}/linux/fs/btrfs/reada.c (100%) rename {src => vendor}/linux/fs/btrfs/relocation.c (100%) rename {src => vendor}/linux/fs/btrfs/root-tree.c (100%) rename {src => vendor}/linux/fs/btrfs/scrub.c (100%) rename {src => vendor}/linux/fs/btrfs/send.c (100%) rename {src => vendor}/linux/fs/btrfs/send.h (100%) rename {src => vendor}/linux/fs/btrfs/struct-funcs.c (100%) rename {src => vendor}/linux/fs/btrfs/super.c (100%) rename {src => vendor}/linux/fs/btrfs/sysfs.c (100%) rename {src => vendor}/linux/fs/btrfs/sysfs.h (100%) rename {src => vendor}/linux/fs/btrfs/tests/btrfs-tests.h (100%) rename {src => vendor}/linux/fs/btrfs/transaction.c (100%) rename {src => vendor}/linux/fs/btrfs/transaction.h (100%) rename {src => vendor}/linux/fs/btrfs/tree-defrag.c (100%) rename {src => vendor}/linux/fs/btrfs/tree-log.c (100%) rename {src => vendor}/linux/fs/btrfs/tree-log.h (100%) rename {src => vendor}/linux/fs/btrfs/ulist.c (100%) rename {src => vendor}/linux/fs/btrfs/ulist.h (100%) rename {src => vendor}/linux/fs/btrfs/uuid-tree.c (100%) rename {src => vendor}/linux/fs/btrfs/volumes.c (100%) rename {src => vendor}/linux/fs/btrfs/volumes.h (100%) rename {src => vendor}/linux/fs/btrfs/xattr.c (100%) rename {src => vendor}/linux/fs/btrfs/xattr.h (100%) rename {src => vendor}/linux/fs/btrfs/zlib.c (100%) rename {src => vendor}/linux/fs/buffer.c (100%) rename {src => vendor}/linux/fs/cachefiles/Kconfig (100%) rename {src => vendor}/linux/fs/ceph/Kconfig (100%) rename {src => vendor}/linux/fs/char_dev.c (100%) rename {src => vendor}/linux/fs/cifs/Kconfig (100%) rename {src => vendor}/linux/fs/coda/Kconfig (100%) rename {src => vendor}/linux/fs/configfs/Kconfig (100%) rename {src => vendor}/linux/fs/cramfs/Kconfig (100%) rename {src => vendor}/linux/fs/crypto/Kconfig (100%) rename {src => vendor}/linux/fs/dcache.c (100%) rename {src => vendor}/linux/fs/devpts/Makefile (100%) rename {src => vendor}/linux/fs/devpts/inode.c (100%) rename {src => vendor}/linux/fs/direct-io.c (100%) rename {src => vendor}/linux/fs/dlm/Kconfig (100%) rename {src => vendor}/linux/fs/drop_caches.c (100%) rename {src => vendor}/linux/fs/ecryptfs/Kconfig (100%) rename {src => vendor}/linux/fs/efivarfs/Kconfig (100%) rename {src => vendor}/linux/fs/efs/Kconfig (100%) rename {src => vendor}/linux/fs/eventfd.c (100%) rename {src => vendor}/linux/fs/eventpoll.c (100%) rename {src => vendor}/linux/fs/exec.c (100%) rename {src => vendor}/linux/fs/exofs/Kbuild (100%) rename {src => vendor}/linux/fs/exofs/Kconfig (100%) rename {src => vendor}/linux/fs/exofs/Kconfig.ore (100%) rename {src => vendor}/linux/fs/exportfs/Makefile (100%) rename {src => vendor}/linux/fs/exportfs/expfs.c (100%) rename {src => vendor}/linux/fs/ext2/Kconfig (100%) rename {src => vendor}/linux/fs/ext4/Kconfig (100%) rename {src => vendor}/linux/fs/ext4/Makefile (100%) rename {src => vendor}/linux/fs/ext4/acl.c (100%) rename {src => vendor}/linux/fs/ext4/acl.h (100%) rename {src => vendor}/linux/fs/ext4/balloc.c (100%) rename {src => vendor}/linux/fs/ext4/bitmap.c (100%) rename {src => vendor}/linux/fs/ext4/block_validity.c (100%) rename {src => vendor}/linux/fs/ext4/dir.c (100%) rename {src => vendor}/linux/fs/ext4/ext4.h (100%) rename {src => vendor}/linux/fs/ext4/ext4_extents.h (100%) rename {src => vendor}/linux/fs/ext4/ext4_jbd2.c (100%) rename {src => vendor}/linux/fs/ext4/ext4_jbd2.h (100%) rename {src => vendor}/linux/fs/ext4/extents.c (100%) rename {src => vendor}/linux/fs/ext4/extents_status.c (100%) rename {src => vendor}/linux/fs/ext4/extents_status.h (100%) rename {src => vendor}/linux/fs/ext4/file.c (100%) rename {src => vendor}/linux/fs/ext4/fsync.c (100%) rename {src => vendor}/linux/fs/ext4/hash.c (100%) rename {src => vendor}/linux/fs/ext4/ialloc.c (100%) rename {src => vendor}/linux/fs/ext4/indirect.c (100%) rename {src => vendor}/linux/fs/ext4/inline.c (100%) rename {src => vendor}/linux/fs/ext4/inode.c (100%) rename {src => vendor}/linux/fs/ext4/ioctl.c (100%) rename {src => vendor}/linux/fs/ext4/mballoc.c (100%) rename {src => vendor}/linux/fs/ext4/mballoc.h (100%) rename {src => vendor}/linux/fs/ext4/migrate.c (100%) rename {src => vendor}/linux/fs/ext4/mmp.c (100%) rename {src => vendor}/linux/fs/ext4/move_extent.c (100%) rename {src => vendor}/linux/fs/ext4/namei.c (100%) rename {src => vendor}/linux/fs/ext4/page-io.c (100%) rename {src => vendor}/linux/fs/ext4/readpage.c (100%) rename {src => vendor}/linux/fs/ext4/resize.c (100%) rename {src => vendor}/linux/fs/ext4/super.c (100%) rename {src => vendor}/linux/fs/ext4/symlink.c (100%) rename {src => vendor}/linux/fs/ext4/sysfs.c (100%) rename {src => vendor}/linux/fs/ext4/truncate.h (100%) rename {src => vendor}/linux/fs/ext4/xattr.c (100%) rename {src => vendor}/linux/fs/ext4/xattr.h (100%) rename {src => vendor}/linux/fs/ext4/xattr_security.c (100%) rename {src => vendor}/linux/fs/ext4/xattr_trusted.c (100%) rename {src => vendor}/linux/fs/ext4/xattr_user.c (100%) rename {src => vendor}/linux/fs/f2fs/Kconfig (100%) rename {src => vendor}/linux/fs/fat/Kconfig (100%) rename {src => vendor}/linux/fs/fat/Makefile (100%) rename {src => vendor}/linux/fs/fat/cache.c (100%) rename {src => vendor}/linux/fs/fat/dir.c (100%) rename {src => vendor}/linux/fs/fat/fat.h (100%) rename {src => vendor}/linux/fs/fat/fatent.c (100%) rename {src => vendor}/linux/fs/fat/file.c (100%) rename {src => vendor}/linux/fs/fat/inode.c (100%) rename {src => vendor}/linux/fs/fat/misc.c (100%) rename {src => vendor}/linux/fs/fat/namei_vfat.c (100%) rename {src => vendor}/linux/fs/fat/nfs.c (100%) rename {src => vendor}/linux/fs/fcntl.c (100%) rename {src => vendor}/linux/fs/fhandle.c (100%) rename {src => vendor}/linux/fs/file.c (100%) rename {src => vendor}/linux/fs/file_table.c (100%) rename {src => vendor}/linux/fs/filesystems.c (100%) rename {src => vendor}/linux/fs/freevxfs/Kconfig (100%) rename {src => vendor}/linux/fs/fs-writeback.c (100%) rename {src => vendor}/linux/fs/fs_pin.c (100%) rename {src => vendor}/linux/fs/fs_struct.c (100%) rename {src => vendor}/linux/fs/fscache/Kconfig (100%) rename {src => vendor}/linux/fs/fuse/Kconfig (100%) rename {src => vendor}/linux/fs/gfs2/Kconfig (100%) rename {src => vendor}/linux/fs/hfs/Kconfig (100%) rename {src => vendor}/linux/fs/hfsplus/Kconfig (100%) rename {src => vendor}/linux/fs/hpfs/Kconfig (100%) rename {src => vendor}/linux/fs/inode.c (100%) rename {src => vendor}/linux/fs/internal.h (100%) rename {src => vendor}/linux/fs/ioctl.c (100%) rename {src => vendor}/linux/fs/iomap.c (100%) rename {src => vendor}/linux/fs/isofs/Kconfig (100%) rename {src => vendor}/linux/fs/jbd2/Kconfig (100%) rename {src => vendor}/linux/fs/jbd2/Makefile (100%) rename {src => vendor}/linux/fs/jbd2/checkpoint.c (100%) rename {src => vendor}/linux/fs/jbd2/commit.c (100%) rename {src => vendor}/linux/fs/jbd2/journal.c (100%) rename {src => vendor}/linux/fs/jbd2/recovery.c (100%) rename {src => vendor}/linux/fs/jbd2/revoke.c (100%) rename {src => vendor}/linux/fs/jbd2/transaction.c (100%) rename {src => vendor}/linux/fs/jffs2/Kconfig (100%) rename {src => vendor}/linux/fs/jfs/Kconfig (100%) rename {src => vendor}/linux/fs/kernfs/Kconfig (100%) rename {src => vendor}/linux/fs/kernfs/Makefile (100%) rename {src => vendor}/linux/fs/kernfs/dir.c (100%) rename {src => vendor}/linux/fs/kernfs/file.c (100%) rename {src => vendor}/linux/fs/kernfs/inode.c (100%) rename {src => vendor}/linux/fs/kernfs/kernfs-internal.h (100%) rename {src => vendor}/linux/fs/kernfs/mount.c (100%) rename {src => vendor}/linux/fs/kernfs/symlink.c (100%) rename {src => vendor}/linux/fs/libfs.c (100%) rename {src => vendor}/linux/fs/logfs/Kconfig (100%) rename {src => vendor}/linux/fs/mbcache.c (100%) rename {src => vendor}/linux/fs/minix/Kconfig (100%) rename {src => vendor}/linux/fs/mount.h (100%) rename {src => vendor}/linux/fs/mpage.c (100%) rename {src => vendor}/linux/fs/namei.c (100%) rename {src => vendor}/linux/fs/namespace.c (100%) rename {src => vendor}/linux/fs/ncpfs/Kconfig (100%) rename {src => vendor}/linux/fs/nfs/Kconfig (100%) rename {src => vendor}/linux/fs/nfsd/Kconfig (100%) rename {src => vendor}/linux/fs/nilfs2/Kconfig (100%) rename {src => vendor}/linux/fs/nls/Kconfig (100%) rename {src => vendor}/linux/fs/nls/Makefile (100%) rename {src => vendor}/linux/fs/nls/mac-celtic.c (100%) rename {src => vendor}/linux/fs/nls/mac-centeuro.c (100%) rename {src => vendor}/linux/fs/nls/mac-croatian.c (100%) rename {src => vendor}/linux/fs/nls/mac-cyrillic.c (100%) rename {src => vendor}/linux/fs/nls/mac-gaelic.c (100%) rename {src => vendor}/linux/fs/nls/mac-greek.c (100%) rename {src => vendor}/linux/fs/nls/mac-iceland.c (100%) rename {src => vendor}/linux/fs/nls/mac-inuit.c (100%) rename {src => vendor}/linux/fs/nls/mac-roman.c (100%) rename {src => vendor}/linux/fs/nls/mac-romanian.c (100%) rename {src => vendor}/linux/fs/nls/mac-turkish.c (100%) rename {src => vendor}/linux/fs/nls/nls_ascii.c (100%) rename {src => vendor}/linux/fs/nls/nls_base.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp1250.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp1251.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp1255.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp437.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp737.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp775.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp850.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp852.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp855.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp857.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp860.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp861.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp862.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp863.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp864.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp865.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp866.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp869.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp874.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp932.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp936.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp949.c (100%) rename {src => vendor}/linux/fs/nls/nls_cp950.c (100%) rename {src => vendor}/linux/fs/nls/nls_euc-jp.c (100%) rename {src => vendor}/linux/fs/nls/nls_iso8859-1.c (100%) rename {src => vendor}/linux/fs/nls/nls_iso8859-13.c (100%) rename {src => vendor}/linux/fs/nls/nls_iso8859-14.c (100%) rename {src => vendor}/linux/fs/nls/nls_iso8859-15.c (100%) rename {src => vendor}/linux/fs/nls/nls_iso8859-2.c (100%) rename {src => vendor}/linux/fs/nls/nls_iso8859-3.c (100%) rename {src => vendor}/linux/fs/nls/nls_iso8859-4.c (100%) rename {src => vendor}/linux/fs/nls/nls_iso8859-5.c (100%) rename {src => vendor}/linux/fs/nls/nls_iso8859-6.c (100%) rename {src => vendor}/linux/fs/nls/nls_iso8859-7.c (100%) rename {src => vendor}/linux/fs/nls/nls_iso8859-9.c (100%) rename {src => vendor}/linux/fs/nls/nls_koi8-r.c (100%) rename {src => vendor}/linux/fs/nls/nls_koi8-ru.c (100%) rename {src => vendor}/linux/fs/nls/nls_koi8-u.c (100%) rename {src => vendor}/linux/fs/nls/nls_utf8.c (100%) rename {src => vendor}/linux/fs/notify/Kconfig (100%) rename {src => vendor}/linux/fs/notify/Makefile (100%) rename {src => vendor}/linux/fs/notify/dnotify/Kconfig (100%) rename {src => vendor}/linux/fs/notify/dnotify/Makefile (100%) rename {src => vendor}/linux/fs/notify/fanotify/Kconfig (100%) rename {src => vendor}/linux/fs/notify/fanotify/Makefile (100%) rename {src => vendor}/linux/fs/notify/inotify/Kconfig (100%) rename {src => vendor}/linux/fs/notify/inotify/Makefile (100%) rename {src => vendor}/linux/fs/nsfs.c (100%) rename {src => vendor}/linux/fs/ntfs/Kconfig (100%) rename {src => vendor}/linux/fs/ocfs2/Kconfig (100%) rename {src => vendor}/linux/fs/omfs/Kconfig (100%) rename {src => vendor}/linux/fs/open.c (100%) rename {src => vendor}/linux/fs/orangefs/Kconfig (100%) rename {src => vendor}/linux/fs/overlayfs/Kconfig (100%) rename {src => vendor}/linux/fs/pipe.c (100%) rename {src => vendor}/linux/fs/pnode.c (100%) rename {src => vendor}/linux/fs/pnode.h (100%) rename {src => vendor}/linux/fs/posix_acl.c (100%) rename {src => vendor}/linux/fs/proc/Kconfig (100%) rename {src => vendor}/linux/fs/proc/Makefile (100%) rename {src => vendor}/linux/fs/proc/array.c (100%) rename {src => vendor}/linux/fs/proc/base.c (100%) rename {src => vendor}/linux/fs/proc/cmdline.c (100%) rename {src => vendor}/linux/fs/proc/consoles.c (100%) rename {src => vendor}/linux/fs/proc/cpuinfo.c (100%) rename {src => vendor}/linux/fs/proc/devices.c (100%) rename {src => vendor}/linux/fs/proc/fd.c (100%) rename {src => vendor}/linux/fs/proc/fd.h (100%) rename {src => vendor}/linux/fs/proc/generic.c (100%) rename {src => vendor}/linux/fs/proc/inode.c (100%) rename {src => vendor}/linux/fs/proc/internal.h (100%) rename {src => vendor}/linux/fs/proc/interrupts.c (100%) rename {src => vendor}/linux/fs/proc/kmsg.c (100%) rename {src => vendor}/linux/fs/proc/loadavg.c (100%) rename {src => vendor}/linux/fs/proc/meminfo.c (100%) rename {src => vendor}/linux/fs/proc/namespaces.c (100%) rename {src => vendor}/linux/fs/proc/nommu.c (100%) rename {src => vendor}/linux/fs/proc/proc_net.c (100%) rename {src => vendor}/linux/fs/proc/proc_sysctl.c (100%) rename {src => vendor}/linux/fs/proc/proc_tty.c (100%) rename {src => vendor}/linux/fs/proc/root.c (100%) rename {src => vendor}/linux/fs/proc/self.c (100%) rename {src => vendor}/linux/fs/proc/softirqs.c (100%) rename {src => vendor}/linux/fs/proc/stat.c (100%) rename {src => vendor}/linux/fs/proc/task_nommu.c (100%) rename {src => vendor}/linux/fs/proc/thread_self.c (100%) rename {src => vendor}/linux/fs/proc/uptime.c (100%) rename {src => vendor}/linux/fs/proc/version.c (100%) rename {src => vendor}/linux/fs/proc_namespace.c (100%) rename {src => vendor}/linux/fs/pstore/Kconfig (100%) rename {src => vendor}/linux/fs/qnx4/Kconfig (100%) rename {src => vendor}/linux/fs/qnx6/Kconfig (100%) rename {src => vendor}/linux/fs/quota/Kconfig (100%) rename {src => vendor}/linux/fs/quota/Makefile (100%) rename {src => vendor}/linux/fs/ramfs/Makefile (100%) rename {src => vendor}/linux/fs/ramfs/file-nommu.c (100%) rename {src => vendor}/linux/fs/ramfs/inode.c (100%) rename {src => vendor}/linux/fs/ramfs/internal.h (100%) rename {src => vendor}/linux/fs/read_write.c (100%) rename {src => vendor}/linux/fs/readdir.c (100%) rename {src => vendor}/linux/fs/reiserfs/Kconfig (100%) rename {src => vendor}/linux/fs/romfs/Kconfig (100%) rename {src => vendor}/linux/fs/select.c (100%) rename {src => vendor}/linux/fs/seq_file.c (100%) rename {src => vendor}/linux/fs/splice.c (100%) rename {src => vendor}/linux/fs/squashfs/Kconfig (100%) rename {src => vendor}/linux/fs/stack.c (100%) rename {src => vendor}/linux/fs/stat.c (100%) rename {src => vendor}/linux/fs/statfs.c (100%) rename {src => vendor}/linux/fs/super.c (100%) rename {src => vendor}/linux/fs/sync.c (100%) rename {src => vendor}/linux/fs/sysfs/Kconfig (100%) rename {src => vendor}/linux/fs/sysfs/Makefile (100%) rename {src => vendor}/linux/fs/sysfs/dir.c (100%) rename {src => vendor}/linux/fs/sysfs/file.c (100%) rename {src => vendor}/linux/fs/sysfs/group.c (100%) rename {src => vendor}/linux/fs/sysfs/mount.c (100%) rename {src => vendor}/linux/fs/sysfs/symlink.c (100%) rename {src => vendor}/linux/fs/sysfs/sysfs.h (100%) rename {src => vendor}/linux/fs/sysv/Kconfig (100%) rename {src => vendor}/linux/fs/ubifs/Kconfig (100%) rename {src => vendor}/linux/fs/udf/Kconfig (100%) rename {src => vendor}/linux/fs/ufs/Kconfig (100%) rename {src => vendor}/linux/fs/utimes.c (100%) rename {src => vendor}/linux/fs/xattr.c (100%) rename {src => vendor}/linux/fs/xfs/Kconfig (100%) rename {src => vendor}/linux/fs/xfs/Makefile (100%) rename {src => vendor}/linux/fs/xfs/kmem.c (100%) rename {src => vendor}/linux/fs/xfs/kmem.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_ag_resv.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_ag_resv.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_alloc.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_alloc.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_alloc_btree.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_alloc_btree.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_attr.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_attr_leaf.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_attr_leaf.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_attr_remote.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_attr_remote.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_attr_sf.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_bit.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_bit.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_bmap.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_bmap.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_bmap_btree.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_bmap_btree.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_btree.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_btree.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_cksum.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_da_btree.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_da_btree.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_da_format.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_da_format.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_defer.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_defer.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2_block.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2_data.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2_leaf.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2_node.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2_priv.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_dir2_sf.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_dquot_buf.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_format.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_fs.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_ialloc.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_ialloc.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_ialloc_btree.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_ialloc_btree.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_inode_buf.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_inode_buf.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_inode_fork.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_inode_fork.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_log_format.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_log_recover.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_log_rlimit.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_quota_defs.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_refcount.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_refcount.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_refcount_btree.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_refcount_btree.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_rmap.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_rmap.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_rmap_btree.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_rmap_btree.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_sb.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_sb.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_shared.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_symlink_remote.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_trans_resv.c (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_trans_resv.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_trans_space.h (100%) rename {src => vendor}/linux/fs/xfs/libxfs/xfs_types.h (100%) rename {src => vendor}/linux/fs/xfs/mrlock.h (100%) rename {src => vendor}/linux/fs/xfs/uuid.c (100%) rename {src => vendor}/linux/fs/xfs/uuid.h (100%) rename {src => vendor}/linux/fs/xfs/xfs.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_acl.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_acl.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_aops.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_aops.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_attr.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_attr_inactive.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_attr_list.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_bmap_item.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_bmap_item.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_bmap_util.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_bmap_util.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_buf.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_buf.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_buf_item.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_buf_item.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_dir2_readdir.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_discard.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_discard.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_dquot.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_dquot_item.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_error.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_error.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_export.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_export.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_extent_busy.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_extent_busy.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_extfree_item.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_extfree_item.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_file.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_filestream.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_filestream.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_fsops.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_fsops.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_globals.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_icache.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_icache.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_icreate_item.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_icreate_item.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_inode.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_inode.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_inode_item.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_inode_item.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_ioctl.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_ioctl.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_iomap.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_iomap.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_iops.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_iops.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_itable.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_itable.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_linux.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_log.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_log.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_log_cil.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_log_priv.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_log_recover.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_message.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_message.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_mount.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_mount.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_mru_cache.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_mru_cache.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_ondisk.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_pnfs.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_qm.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_quota.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_refcount_item.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_refcount_item.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_reflink.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_reflink.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_rmap_item.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_rmap_item.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_rtalloc.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_stats.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_stats.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_super.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_super.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_symlink.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_symlink.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_sysctl.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_sysctl.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_sysfs.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_sysfs.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_trace.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_trace.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_trans.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_trans.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_trans_ail.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_trans_bmap.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_trans_buf.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_trans_extfree.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_trans_inode.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_trans_priv.h (100%) rename {src => vendor}/linux/fs/xfs/xfs_trans_refcount.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_trans_rmap.c (100%) rename {src => vendor}/linux/fs/xfs/xfs_xattr.c (100%) rename {src => vendor}/linux/include/acpi/acbuffer.h (100%) rename {src => vendor}/linux/include/acpi/acconfig.h (100%) rename {src => vendor}/linux/include/acpi/acexcep.h (100%) rename {src => vendor}/linux/include/acpi/acnames.h (100%) rename {src => vendor}/linux/include/acpi/acoutput.h (100%) rename {src => vendor}/linux/include/acpi/acpi.h (100%) rename {src => vendor}/linux/include/acpi/acpiosxf.h (100%) rename {src => vendor}/linux/include/acpi/acpixf.h (100%) rename {src => vendor}/linux/include/acpi/acrestyp.h (100%) rename {src => vendor}/linux/include/acpi/actbl.h (100%) rename {src => vendor}/linux/include/acpi/actbl1.h (100%) rename {src => vendor}/linux/include/acpi/actbl2.h (100%) rename {src => vendor}/linux/include/acpi/actbl3.h (100%) rename {src => vendor}/linux/include/acpi/actypes.h (100%) rename {src => vendor}/linux/include/acpi/platform/acenv.h (100%) rename {src => vendor}/linux/include/acpi/platform/acenvex.h (100%) rename {src => vendor}/linux/include/acpi/platform/acgcc.h (100%) rename {src => vendor}/linux/include/acpi/platform/acgccex.h (100%) rename {src => vendor}/linux/include/acpi/platform/aclinux.h (100%) rename {src => vendor}/linux/include/acpi/platform/aclinuxex.h (100%) rename {src => vendor}/linux/include/asm-generic/4level-fixup.h (100%) rename {src => vendor}/linux/include/asm-generic/atomic-long.h (100%) rename {src => vendor}/linux/include/asm-generic/atomic.h (100%) rename {src => vendor}/linux/include/asm-generic/atomic64.h (100%) rename {src => vendor}/linux/include/asm-generic/barrier.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/__ffs.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/__fls.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/arch_hweight.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/atomic.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/const_hweight.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/ext2-atomic.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/ffs.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/ffz.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/find.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/fls.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/fls64.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/hweight.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/le.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/lock.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/non-atomic.h (100%) rename {src => vendor}/linux/include/asm-generic/bitops/sched.h (100%) rename {src => vendor}/linux/include/asm-generic/bug.h (100%) rename {src => vendor}/linux/include/asm-generic/bugs.h (100%) rename {src => vendor}/linux/include/asm-generic/cache.h (100%) rename {src => vendor}/linux/include/asm-generic/cacheflush.h (100%) rename {src => vendor}/linux/include/asm-generic/checksum.h (100%) rename {src => vendor}/linux/include/asm-generic/cmpxchg-local.h (100%) rename {src => vendor}/linux/include/asm-generic/cmpxchg.h (100%) rename {src => vendor}/linux/include/asm-generic/cputime.h (100%) rename {src => vendor}/linux/include/asm-generic/cputime_jiffies.h (100%) rename {src => vendor}/linux/include/asm-generic/current.h (100%) rename {src => vendor}/linux/include/asm-generic/delay.h (100%) rename {src => vendor}/linux/include/asm-generic/device.h (100%) rename {src => vendor}/linux/include/asm-generic/div64.h (100%) rename {src => vendor}/linux/include/asm-generic/dma.h (100%) rename {src => vendor}/linux/include/asm-generic/emergency-restart.h (100%) rename {src => vendor}/linux/include/asm-generic/exec.h (100%) rename {src => vendor}/linux/include/asm-generic/ftrace.h (100%) rename {src => vendor}/linux/include/asm-generic/getorder.h (100%) rename {src => vendor}/linux/include/asm-generic/hardirq.h (100%) rename {src => vendor}/linux/include/asm-generic/hw_irq.h (100%) rename {src => vendor}/linux/include/asm-generic/int-ll64.h (100%) rename {src => vendor}/linux/include/asm-generic/io.h (100%) rename {src => vendor}/linux/include/asm-generic/ioctl.h (100%) rename {src => vendor}/linux/include/asm-generic/irq_regs.h (100%) rename {src => vendor}/linux/include/asm-generic/irq_work.h (100%) rename {src => vendor}/linux/include/asm-generic/irqflags.h (100%) rename {src => vendor}/linux/include/asm-generic/kdebug.h (100%) rename {src => vendor}/linux/include/asm-generic/kmap_types.h (100%) rename {src => vendor}/linux/include/asm-generic/linkage.h (100%) rename {src => vendor}/linux/include/asm-generic/local.h (100%) rename {src => vendor}/linux/include/asm-generic/memory_model.h (100%) rename {src => vendor}/linux/include/asm-generic/mm_hooks.h (100%) rename {src => vendor}/linux/include/asm-generic/mmu.h (100%) rename {src => vendor}/linux/include/asm-generic/mmu_context.h (100%) rename {src => vendor}/linux/include/asm-generic/module.h (100%) rename {src => vendor}/linux/include/asm-generic/mutex-dec.h (100%) rename {src => vendor}/linux/include/asm-generic/page.h (100%) rename {src => vendor}/linux/include/asm-generic/param.h (100%) rename {src => vendor}/linux/include/asm-generic/pci.h (100%) rename {src => vendor}/linux/include/asm-generic/pci_iomap.h (100%) rename {src => vendor}/linux/include/asm-generic/percpu.h (100%) rename {src => vendor}/linux/include/asm-generic/pgalloc.h (100%) rename {src => vendor}/linux/include/asm-generic/pgtable.h (100%) rename {src => vendor}/linux/include/asm-generic/preempt.h (100%) rename {src => vendor}/linux/include/asm-generic/resource.h (100%) rename {src => vendor}/linux/include/asm-generic/sections.h (100%) rename {src => vendor}/linux/include/asm-generic/segment.h (100%) rename {src => vendor}/linux/include/asm-generic/siginfo.h (100%) rename {src => vendor}/linux/include/asm-generic/signal.h (100%) rename {src => vendor}/linux/include/asm-generic/statfs.h (100%) rename {src => vendor}/linux/include/asm-generic/string.h (100%) rename {src => vendor}/linux/include/asm-generic/switch_to.h (100%) rename {src => vendor}/linux/include/asm-generic/syscalls.h (100%) rename {src => vendor}/linux/include/asm-generic/termios.h (100%) rename {src => vendor}/linux/include/asm-generic/timex.h (100%) rename {src => vendor}/linux/include/asm-generic/tlb.h (100%) rename {src => vendor}/linux/include/asm-generic/tlbflush.h (100%) rename {src => vendor}/linux/include/asm-generic/topology.h (100%) rename {src => vendor}/linux/include/asm-generic/trace_clock.h (100%) rename {src => vendor}/linux/include/asm-generic/uaccess.h (100%) rename {src => vendor}/linux/include/asm-generic/unaligned.h (100%) rename {src => vendor}/linux/include/asm-generic/unistd.h (100%) rename {src => vendor}/linux/include/asm-generic/vmlinux.lds.h (100%) rename {src => vendor}/linux/include/asm-generic/word-at-a-time.h (100%) rename {src => vendor}/linux/include/asm-generic/xor.h (100%) rename {src => vendor}/linux/include/crypto/aead.h (100%) rename {src => vendor}/linux/include/crypto/aes.h (100%) rename {src => vendor}/linux/include/crypto/akcipher.h (100%) rename {src => vendor}/linux/include/crypto/algapi.h (100%) rename {src => vendor}/linux/include/crypto/chacha20.h (100%) rename {src => vendor}/linux/include/crypto/crypto_wq.h (100%) rename {src => vendor}/linux/include/crypto/drbg.h (100%) rename {src => vendor}/linux/include/crypto/hash.h (100%) rename {src => vendor}/linux/include/crypto/internal/aead.h (100%) rename {src => vendor}/linux/include/crypto/internal/akcipher.h (100%) rename {src => vendor}/linux/include/crypto/internal/geniv.h (100%) rename {src => vendor}/linux/include/crypto/internal/hash.h (100%) rename {src => vendor}/linux/include/crypto/internal/kpp.h (100%) rename {src => vendor}/linux/include/crypto/internal/rng.h (100%) rename {src => vendor}/linux/include/crypto/internal/skcipher.h (100%) rename {src => vendor}/linux/include/crypto/kpp.h (100%) rename {src => vendor}/linux/include/crypto/null.h (100%) rename {src => vendor}/linux/include/crypto/rng.h (100%) rename {src => vendor}/linux/include/crypto/scatterwalk.h (100%) rename {src => vendor}/linux/include/crypto/sha.h (100%) rename {src => vendor}/linux/include/crypto/sha256_base.h (100%) rename {src => vendor}/linux/include/crypto/skcipher.h (100%) rename {src => vendor}/linux/include/dt-bindings/input/linux-event-codes.h (100%) rename {src => vendor}/linux/include/linux/acct.h (100%) rename {src => vendor}/linux/include/linux/acpi.h (100%) rename {src => vendor}/linux/include/linux/aio.h (100%) rename {src => vendor}/linux/include/linux/alarmtimer.h (100%) rename {src => vendor}/linux/include/linux/anon_inodes.h (100%) rename {src => vendor}/linux/include/linux/assoc_array.h (100%) rename {src => vendor}/linux/include/linux/async.h (100%) rename {src => vendor}/linux/include/linux/atalk.h (100%) rename {src => vendor}/linux/include/linux/atomic.h (100%) rename {src => vendor}/linux/include/linux/attribute_container.h (100%) rename {src => vendor}/linux/include/linux/audit.h (100%) rename {src => vendor}/linux/include/linux/auxvec.h (100%) rename {src => vendor}/linux/include/linux/average.h (100%) rename {src => vendor}/linux/include/linux/backing-dev-defs.h (100%) rename {src => vendor}/linux/include/linux/backing-dev.h (100%) rename {src => vendor}/linux/include/linux/badblocks.h (100%) rename {src => vendor}/linux/include/linux/balloon_compaction.h (100%) rename {src => vendor}/linux/include/linux/bcd.h (100%) rename {src => vendor}/linux/include/linux/binfmts.h (100%) rename {src => vendor}/linux/include/linux/bio.h (100%) rename {src => vendor}/linux/include/linux/bit_spinlock.h (100%) rename {src => vendor}/linux/include/linux/bitmap.h (100%) rename {src => vendor}/linux/include/linux/bitops.h (100%) rename {src => vendor}/linux/include/linux/bitrev.h (100%) rename {src => vendor}/linux/include/linux/blk-cgroup.h (100%) rename {src => vendor}/linux/include/linux/blk-mq.h (100%) rename {src => vendor}/linux/include/linux/blk_types.h (100%) rename {src => vendor}/linux/include/linux/blkdev.h (100%) rename {src => vendor}/linux/include/linux/blkpg.h (100%) rename {src => vendor}/linux/include/linux/blktrace_api.h (100%) rename {src => vendor}/linux/include/linux/blockgroup_lock.h (100%) rename {src => vendor}/linux/include/linux/bootmem.h (100%) rename {src => vendor}/linux/include/linux/bottom_half.h (100%) rename {src => vendor}/linux/include/linux/bpf.h (100%) rename {src => vendor}/linux/include/linux/bsearch.h (100%) rename {src => vendor}/linux/include/linux/bsg.h (100%) rename {src => vendor}/linux/include/linux/btrfs.h (100%) rename {src => vendor}/linux/include/linux/buffer_head.h (100%) rename {src => vendor}/linux/include/linux/bug.h (100%) rename {src => vendor}/linux/include/linux/bvec.h (100%) rename {src => vendor}/linux/include/linux/byteorder/generic.h (100%) rename {src => vendor}/linux/include/linux/byteorder/little_endian.h (100%) rename {src => vendor}/linux/include/linux/cache.h (100%) rename {src => vendor}/linux/include/linux/cacheinfo.h (100%) rename {src => vendor}/linux/include/linux/capability.h (100%) rename {src => vendor}/linux/include/linux/cdev.h (100%) rename {src => vendor}/linux/include/linux/cdrom.h (100%) rename {src => vendor}/linux/include/linux/cgroup-defs.h (100%) rename {src => vendor}/linux/include/linux/cgroup.h (100%) rename {src => vendor}/linux/include/linux/cleancache.h (100%) rename {src => vendor}/linux/include/linux/clk-provider.h (100%) rename {src => vendor}/linux/include/linux/clk.h (100%) rename {src => vendor}/linux/include/linux/clk/clk-conf.h (100%) rename {src => vendor}/linux/include/linux/clockchips.h (100%) rename {src => vendor}/linux/include/linux/clocksource.h (100%) rename {src => vendor}/linux/include/linux/cma.h (100%) rename {src => vendor}/linux/include/linux/cn_proc.h (100%) rename {src => vendor}/linux/include/linux/compaction.h (100%) rename {src => vendor}/linux/include/linux/compat.h (100%) rename {src => vendor}/linux/include/linux/compiler-gcc.h (100%) rename {src => vendor}/linux/include/linux/compiler.h (100%) rename {src => vendor}/linux/include/linux/completion.h (100%) rename {src => vendor}/linux/include/linux/component.h (100%) rename {src => vendor}/linux/include/linux/console.h (100%) rename {src => vendor}/linux/include/linux/console_struct.h (100%) rename {src => vendor}/linux/include/linux/consolemap.h (100%) rename {src => vendor}/linux/include/linux/container.h (100%) rename {src => vendor}/linux/include/linux/context_tracking.h (100%) rename {src => vendor}/linux/include/linux/context_tracking_state.h (100%) rename {src => vendor}/linux/include/linux/coredump.h (100%) rename {src => vendor}/linux/include/linux/cpu.h (100%) rename {src => vendor}/linux/include/linux/cpu_rmap.h (100%) rename {src => vendor}/linux/include/linux/cpufeature.h (100%) rename {src => vendor}/linux/include/linux/cpuhotplug.h (100%) rename {src => vendor}/linux/include/linux/cpuidle.h (100%) rename {src => vendor}/linux/include/linux/cpumask.h (100%) rename {src => vendor}/linux/include/linux/cpuset.h (100%) rename {src => vendor}/linux/include/linux/cputime.h (100%) rename {src => vendor}/linux/include/linux/crash_dump.h (100%) rename {src => vendor}/linux/include/linux/crc-ccitt.h (100%) rename {src => vendor}/linux/include/linux/crc16.h (100%) rename {src => vendor}/linux/include/linux/crc32.h (100%) rename {src => vendor}/linux/include/linux/crc32c.h (100%) rename {src => vendor}/linux/include/linux/cred.h (100%) rename {src => vendor}/linux/include/linux/crypto.h (100%) rename {src => vendor}/linux/include/linux/cryptohash.h (100%) rename {src => vendor}/linux/include/linux/ctype.h (100%) rename {src => vendor}/linux/include/linux/dax.h (100%) rename {src => vendor}/linux/include/linux/dcache.h (100%) rename {src => vendor}/linux/include/linux/dccp.h (100%) rename {src => vendor}/linux/include/linux/dcookies.h (100%) rename {src => vendor}/linux/include/linux/debug_locks.h (100%) rename {src => vendor}/linux/include/linux/debugfs.h (100%) rename {src => vendor}/linux/include/linux/debugobjects.h (100%) rename {src => vendor}/linux/include/linux/decompress/bunzip2.h (100%) rename {src => vendor}/linux/include/linux/decompress/generic.h (100%) rename {src => vendor}/linux/include/linux/decompress/inflate.h (100%) rename {src => vendor}/linux/include/linux/decompress/unlz4.h (100%) rename {src => vendor}/linux/include/linux/decompress/unlzma.h (100%) rename {src => vendor}/linux/include/linux/decompress/unlzo.h (100%) rename {src => vendor}/linux/include/linux/decompress/unxz.h (100%) rename {src => vendor}/linux/include/linux/delay.h (100%) rename {src => vendor}/linux/include/linux/delayacct.h (100%) rename {src => vendor}/linux/include/linux/delayed_call.h (100%) rename {src => vendor}/linux/include/linux/device.h (100%) rename {src => vendor}/linux/include/linux/device_cgroup.h (100%) rename {src => vendor}/linux/include/linux/devpts_fs.h (100%) rename {src => vendor}/linux/include/linux/dirent.h (100%) rename {src => vendor}/linux/include/linux/dma-debug.h (100%) rename {src => vendor}/linux/include/linux/dma-direction.h (100%) rename {src => vendor}/linux/include/linux/dma-mapping.h (100%) rename {src => vendor}/linux/include/linux/dmaengine.h (100%) rename {src => vendor}/linux/include/linux/dmapool.h (100%) rename {src => vendor}/linux/include/linux/dmi.h (100%) rename {src => vendor}/linux/include/linux/dnotify.h (100%) rename {src => vendor}/linux/include/linux/dqblk_qtree.h (100%) rename {src => vendor}/linux/include/linux/dqblk_v1.h (100%) rename {src => vendor}/linux/include/linux/dqblk_v2.h (100%) rename {src => vendor}/linux/include/linux/dynamic_debug.h (100%) rename {src => vendor}/linux/include/linux/dynamic_queue_limits.h (100%) rename {src => vendor}/linux/include/linux/earlycpio.h (100%) rename {src => vendor}/linux/include/linux/efi.h (100%) rename {src => vendor}/linux/include/linux/elevator.h (100%) rename {src => vendor}/linux/include/linux/elf.h (100%) rename {src => vendor}/linux/include/linux/err.h (100%) rename {src => vendor}/linux/include/linux/errno.h (100%) rename {src => vendor}/linux/include/linux/errqueue.h (100%) rename {src => vendor}/linux/include/linux/etherdevice.h (100%) rename {src => vendor}/linux/include/linux/ethtool.h (100%) rename {src => vendor}/linux/include/linux/eventfd.h (100%) rename {src => vendor}/linux/include/linux/eventpoll.h (100%) rename {src => vendor}/linux/include/linux/evm.h (100%) rename {src => vendor}/linux/include/linux/export.h (100%) rename {src => vendor}/linux/include/linux/exportfs.h (100%) rename {src => vendor}/linux/include/linux/extable.h (100%) rename {src => vendor}/linux/include/linux/falloc.h (100%) rename {src => vendor}/linux/include/linux/fault-inject.h (100%) rename {src => vendor}/linux/include/linux/fcntl.h (100%) rename {src => vendor}/linux/include/linux/fd.h (100%) rename {src => vendor}/linux/include/linux/fddidevice.h (100%) rename {src => vendor}/linux/include/linux/fdtable.h (100%) rename {src => vendor}/linux/include/linux/file.h (100%) rename {src => vendor}/linux/include/linux/filter.h (100%) rename {src => vendor}/linux/include/linux/fips.h (100%) rename {src => vendor}/linux/include/linux/flex_array.h (100%) rename {src => vendor}/linux/include/linux/flex_proportions.h (100%) rename {src => vendor}/linux/include/linux/frame.h (100%) rename {src => vendor}/linux/include/linux/freezer.h (100%) rename {src => vendor}/linux/include/linux/fs.h (100%) rename {src => vendor}/linux/include/linux/fs_pin.h (100%) rename {src => vendor}/linux/include/linux/fs_stack.h (100%) rename {src => vendor}/linux/include/linux/fs_struct.h (100%) rename {src => vendor}/linux/include/linux/fscache-cache.h (100%) rename {src => vendor}/linux/include/linux/fscache.h (100%) rename {src => vendor}/linux/include/linux/fscrypto.h (100%) rename {src => vendor}/linux/include/linux/fsnotify.h (100%) rename {src => vendor}/linux/include/linux/fsnotify_backend.h (100%) rename {src => vendor}/linux/include/linux/ftrace.h (100%) rename {src => vendor}/linux/include/linux/ftrace_irq.h (100%) rename {src => vendor}/linux/include/linux/futex.h (100%) rename {src => vendor}/linux/include/linux/fwnode.h (100%) rename {src => vendor}/linux/include/linux/gcd.h (100%) rename {src => vendor}/linux/include/linux/genetlink.h (100%) rename {src => vendor}/linux/include/linux/genhd.h (100%) rename {src => vendor}/linux/include/linux/getcpu.h (100%) rename {src => vendor}/linux/include/linux/gfp.h (100%) rename {src => vendor}/linux/include/linux/hardirq.h (100%) rename {src => vendor}/linux/include/linux/hash.h (100%) rename {src => vendor}/linux/include/linux/hashtable.h (100%) rename {src => vendor}/linux/include/linux/hid-debug.h (100%) rename {src => vendor}/linux/include/linux/hid.h (100%) rename {src => vendor}/linux/include/linux/hiddev.h (100%) rename {src => vendor}/linux/include/linux/hidraw.h (100%) rename {src => vendor}/linux/include/linux/highmem.h (100%) rename {src => vendor}/linux/include/linux/highuid.h (100%) rename {src => vendor}/linux/include/linux/hrtimer.h (100%) rename {src => vendor}/linux/include/linux/huge_mm.h (100%) rename {src => vendor}/linux/include/linux/hugetlb.h (100%) rename {src => vendor}/linux/include/linux/hugetlb_inline.h (100%) rename {src => vendor}/linux/include/linux/hw_breakpoint.h (100%) rename {src => vendor}/linux/include/linux/hw_random.h (100%) rename {src => vendor}/linux/include/linux/hwmon.h (100%) rename {src => vendor}/linux/include/linux/hypervisor.h (100%) rename {src => vendor}/linux/include/linux/i8042.h (100%) rename {src => vendor}/linux/include/linux/icmp.h (100%) rename {src => vendor}/linux/include/linux/icmpv6.h (100%) rename {src => vendor}/linux/include/linux/idr.h (100%) rename {src => vendor}/linux/include/linux/ieee802154.h (100%) rename {src => vendor}/linux/include/linux/if_arp.h (100%) rename {src => vendor}/linux/include/linux/if_bridge.h (100%) rename {src => vendor}/linux/include/linux/if_ether.h (100%) rename {src => vendor}/linux/include/linux/if_fddi.h (100%) rename {src => vendor}/linux/include/linux/if_frad.h (100%) rename {src => vendor}/linux/include/linux/if_link.h (100%) rename {src => vendor}/linux/include/linux/if_macvlan.h (100%) rename {src => vendor}/linux/include/linux/if_pppol2tp.h (100%) rename {src => vendor}/linux/include/linux/if_pppox.h (100%) rename {src => vendor}/linux/include/linux/if_tun.h (100%) rename {src => vendor}/linux/include/linux/if_tunnel.h (100%) rename {src => vendor}/linux/include/linux/if_vlan.h (100%) rename {src => vendor}/linux/include/linux/igmp.h (100%) rename {src => vendor}/linux/include/linux/ima.h (100%) rename {src => vendor}/linux/include/linux/in.h (100%) rename {src => vendor}/linux/include/linux/in6.h (100%) rename {src => vendor}/linux/include/linux/inet.h (100%) rename {src => vendor}/linux/include/linux/inet_diag.h (100%) rename {src => vendor}/linux/include/linux/inetdevice.h (100%) rename {src => vendor}/linux/include/linux/init.h (100%) rename {src => vendor}/linux/include/linux/init_task.h (100%) rename {src => vendor}/linux/include/linux/initrd.h (100%) rename {src => vendor}/linux/include/linux/input.h (100%) rename {src => vendor}/linux/include/linux/input/mt.h (100%) rename {src => vendor}/linux/include/linux/integrity.h (100%) rename {src => vendor}/linux/include/linux/interrupt.h (100%) rename {src => vendor}/linux/include/linux/interval_tree_generic.h (100%) rename {src => vendor}/linux/include/linux/io.h (100%) rename {src => vendor}/linux/include/linux/iocontext.h (100%) rename {src => vendor}/linux/include/linux/iomap.h (100%) rename {src => vendor}/linux/include/linux/ioport.h (100%) rename {src => vendor}/linux/include/linux/ioprio.h (100%) rename {src => vendor}/linux/include/linux/ip.h (100%) rename {src => vendor}/linux/include/linux/ipc.h (100%) rename {src => vendor}/linux/include/linux/ipc_namespace.h (100%) rename {src => vendor}/linux/include/linux/ipv6.h (100%) rename {src => vendor}/linux/include/linux/ipv6_route.h (100%) rename {src => vendor}/linux/include/linux/irq.h (100%) rename {src => vendor}/linux/include/linux/irq_cpustat.h (100%) rename {src => vendor}/linux/include/linux/irq_work.h (100%) rename {src => vendor}/linux/include/linux/irqdesc.h (100%) rename {src => vendor}/linux/include/linux/irqdomain.h (100%) rename {src => vendor}/linux/include/linux/irqflags.h (100%) rename {src => vendor}/linux/include/linux/irqhandler.h (100%) rename {src => vendor}/linux/include/linux/irqnr.h (100%) rename {src => vendor}/linux/include/linux/irqreturn.h (100%) rename {src => vendor}/linux/include/linux/jbd2.h (100%) rename {src => vendor}/linux/include/linux/jhash.h (100%) rename {src => vendor}/linux/include/linux/jiffies.h (100%) rename {src => vendor}/linux/include/linux/journal-head.h (100%) rename {src => vendor}/linux/include/linux/jump_label.h (100%) rename {src => vendor}/linux/include/linux/jump_label_ratelimit.h (100%) rename {src => vendor}/linux/include/linux/kallsyms.h (100%) rename {src => vendor}/linux/include/linux/kasan.h (100%) rename {src => vendor}/linux/include/linux/kbd_kern.h (100%) rename {src => vendor}/linux/include/linux/kbuild.h (100%) rename {src => vendor}/linux/include/linux/kconfig.h (100%) rename {src => vendor}/linux/include/linux/kcov.h (100%) rename {src => vendor}/linux/include/linux/kd.h (100%) rename {src => vendor}/linux/include/linux/kdb.h (100%) rename {src => vendor}/linux/include/linux/kdebug.h (100%) rename {src => vendor}/linux/include/linux/kdev_t.h (100%) rename {src => vendor}/linux/include/linux/kern_levels.h (100%) rename {src => vendor}/linux/include/linux/kernel.h (100%) rename {src => vendor}/linux/include/linux/kernel_stat.h (100%) rename {src => vendor}/linux/include/linux/kernfs.h (100%) rename {src => vendor}/linux/include/linux/kexec.h (100%) rename {src => vendor}/linux/include/linux/key.h (100%) rename {src => vendor}/linux/include/linux/keyboard.h (100%) rename {src => vendor}/linux/include/linux/kfifo.h (100%) rename {src => vendor}/linux/include/linux/kgdb.h (100%) rename {src => vendor}/linux/include/linux/khugepaged.h (100%) rename {src => vendor}/linux/include/linux/klist.h (100%) rename {src => vendor}/linux/include/linux/kmemcheck.h (100%) rename {src => vendor}/linux/include/linux/kmemleak.h (100%) rename {src => vendor}/linux/include/linux/kmod.h (100%) rename {src => vendor}/linux/include/linux/kmsg_dump.h (100%) rename {src => vendor}/linux/include/linux/kobj_map.h (100%) rename {src => vendor}/linux/include/linux/kobject.h (100%) rename {src => vendor}/linux/include/linux/kobject_ns.h (100%) rename {src => vendor}/linux/include/linux/kprobes.h (100%) rename {src => vendor}/linux/include/linux/kref.h (100%) rename {src => vendor}/linux/include/linux/ksm.h (100%) rename {src => vendor}/linux/include/linux/kthread.h (100%) rename {src => vendor}/linux/include/linux/ktime.h (100%) rename {src => vendor}/linux/include/linux/latencytop.h (100%) rename {src => vendor}/linux/include/linux/lcm.h (100%) rename {src => vendor}/linux/include/linux/leds.h (100%) rename {src => vendor}/linux/include/linux/libps2.h (100%) rename {src => vendor}/linux/include/linux/license.h (100%) rename {src => vendor}/linux/include/linux/linkage.h (100%) rename {src => vendor}/linux/include/linux/list.h (100%) rename {src => vendor}/linux/include/linux/list_bl.h (100%) rename {src => vendor}/linux/include/linux/list_lru.h (100%) rename {src => vendor}/linux/include/linux/list_nulls.h (100%) rename {src => vendor}/linux/include/linux/list_sort.h (100%) rename {src => vendor}/linux/include/linux/llist.h (100%) rename {src => vendor}/linux/include/linux/lockdep.h (100%) rename {src => vendor}/linux/include/linux/lockref.h (100%) rename {src => vendor}/linux/include/linux/log2.h (100%) rename {src => vendor}/linux/include/linux/lsm_hooks.h (100%) rename {src => vendor}/linux/include/linux/lzo.h (100%) rename {src => vendor}/linux/include/linux/math64.h (100%) rename {src => vendor}/linux/include/linux/mbcache.h (100%) rename {src => vendor}/linux/include/linux/mdio.h (100%) rename {src => vendor}/linux/include/linux/memblock.h (100%) rename {src => vendor}/linux/include/linux/memcontrol.h (100%) rename {src => vendor}/linux/include/linux/memory.h (100%) rename {src => vendor}/linux/include/linux/memory_hotplug.h (100%) rename {src => vendor}/linux/include/linux/mempolicy.h (100%) rename {src => vendor}/linux/include/linux/mempool.h (100%) rename {src => vendor}/linux/include/linux/memremap.h (100%) rename {src => vendor}/linux/include/linux/migrate.h (100%) rename {src => vendor}/linux/include/linux/migrate_mode.h (100%) rename {src => vendor}/linux/include/linux/mii.h (100%) rename {src => vendor}/linux/include/linux/miscdevice.h (100%) rename {src => vendor}/linux/include/linux/mm.h (100%) rename {src => vendor}/linux/include/linux/mm_inline.h (100%) rename {src => vendor}/linux/include/linux/mm_types.h (100%) rename {src => vendor}/linux/include/linux/mman.h (100%) rename {src => vendor}/linux/include/linux/mmdebug.h (100%) rename {src => vendor}/linux/include/linux/mmu_context.h (100%) rename {src => vendor}/linux/include/linux/mmu_notifier.h (100%) rename {src => vendor}/linux/include/linux/mmzone.h (100%) rename {src => vendor}/linux/include/linux/mnt_namespace.h (100%) rename {src => vendor}/linux/include/linux/mod_devicetable.h (100%) rename {src => vendor}/linux/include/linux/module.h (100%) rename {src => vendor}/linux/include/linux/moduleloader.h (100%) rename {src => vendor}/linux/include/linux/moduleparam.h (100%) rename {src => vendor}/linux/include/linux/mount.h (100%) rename {src => vendor}/linux/include/linux/mpage.h (100%) rename {src => vendor}/linux/include/linux/mpls.h (100%) rename {src => vendor}/linux/include/linux/mroute.h (100%) rename {src => vendor}/linux/include/linux/mroute6.h (100%) rename {src => vendor}/linux/include/linux/msdos_fs.h (100%) rename {src => vendor}/linux/include/linux/msi.h (100%) rename {src => vendor}/linux/include/linux/mutex.h (100%) rename {src => vendor}/linux/include/linux/namei.h (100%) rename {src => vendor}/linux/include/linux/net.h (100%) rename {src => vendor}/linux/include/linux/netdev_features.h (100%) rename {src => vendor}/linux/include/linux/netdevice.h (100%) rename {src => vendor}/linux/include/linux/netfilter.h (100%) rename {src => vendor}/linux/include/linux/netfilter_bridge.h (100%) rename {src => vendor}/linux/include/linux/netfilter_defs.h (100%) rename {src => vendor}/linux/include/linux/netfilter_ingress.h (100%) rename {src => vendor}/linux/include/linux/netfilter_ipv4.h (100%) rename {src => vendor}/linux/include/linux/netfilter_ipv6.h (100%) rename {src => vendor}/linux/include/linux/netlink.h (100%) rename {src => vendor}/linux/include/linux/netpoll.h (100%) rename {src => vendor}/linux/include/linux/nfs.h (100%) rename {src => vendor}/linux/include/linux/nfs3.h (100%) rename {src => vendor}/linux/include/linux/nfs4.h (100%) rename {src => vendor}/linux/include/linux/nfs_fs.h (100%) rename {src => vendor}/linux/include/linux/nfs_fs_i.h (100%) rename {src => vendor}/linux/include/linux/nfs_fs_sb.h (100%) rename {src => vendor}/linux/include/linux/nfs_xdr.h (100%) rename {src => vendor}/linux/include/linux/nfsacl.h (100%) rename {src => vendor}/linux/include/linux/nls.h (100%) rename {src => vendor}/linux/include/linux/nmi.h (100%) rename {src => vendor}/linux/include/linux/node.h (100%) rename {src => vendor}/linux/include/linux/nodemask.h (100%) rename {src => vendor}/linux/include/linux/notifier.h (100%) rename {src => vendor}/linux/include/linux/ns_common.h (100%) rename {src => vendor}/linux/include/linux/nsproxy.h (100%) rename {src => vendor}/linux/include/linux/numa.h (100%) rename {src => vendor}/linux/include/linux/of.h (100%) rename {src => vendor}/linux/include/linux/of_address.h (100%) rename {src => vendor}/linux/include/linux/of_device.h (100%) rename {src => vendor}/linux/include/linux/of_irq.h (100%) rename {src => vendor}/linux/include/linux/of_net.h (100%) rename {src => vendor}/linux/include/linux/of_platform.h (100%) rename {src => vendor}/linux/include/linux/once.h (100%) rename {src => vendor}/linux/include/linux/oom.h (100%) rename {src => vendor}/linux/include/linux/osq_lock.h (100%) rename {src => vendor}/linux/include/linux/page-flags-layout.h (100%) rename {src => vendor}/linux/include/linux/page-flags.h (100%) rename {src => vendor}/linux/include/linux/page-isolation.h (100%) rename {src => vendor}/linux/include/linux/page_counter.h (100%) rename {src => vendor}/linux/include/linux/page_ext.h (100%) rename {src => vendor}/linux/include/linux/page_idle.h (100%) rename {src => vendor}/linux/include/linux/page_owner.h (100%) rename {src => vendor}/linux/include/linux/page_ref.h (100%) rename {src => vendor}/linux/include/linux/pageblock-flags.h (100%) rename {src => vendor}/linux/include/linux/pagemap.h (100%) rename {src => vendor}/linux/include/linux/pagevec.h (100%) rename {src => vendor}/linux/include/linux/parser.h (100%) rename {src => vendor}/linux/include/linux/path.h (100%) rename {src => vendor}/linux/include/linux/pci-dma-compat.h (100%) rename {src => vendor}/linux/include/linux/pci.h (100%) rename {src => vendor}/linux/include/linux/pci_ids.h (100%) rename {src => vendor}/linux/include/linux/percpu-defs.h (100%) rename {src => vendor}/linux/include/linux/percpu-refcount.h (100%) rename {src => vendor}/linux/include/linux/percpu-rwsem.h (100%) rename {src => vendor}/linux/include/linux/percpu.h (100%) rename {src => vendor}/linux/include/linux/percpu_counter.h (100%) rename {src => vendor}/linux/include/linux/percpu_ida.h (100%) rename {src => vendor}/linux/include/linux/perf_event.h (100%) rename {src => vendor}/linux/include/linux/perf_regs.h (100%) rename {src => vendor}/linux/include/linux/personality.h (100%) rename {src => vendor}/linux/include/linux/pfn.h (100%) rename {src => vendor}/linux/include/linux/pfn_t.h (100%) rename {src => vendor}/linux/include/linux/phy.h (100%) rename {src => vendor}/linux/include/linux/phy_fixed.h (100%) rename {src => vendor}/linux/include/linux/pid.h (100%) rename {src => vendor}/linux/include/linux/pid_namespace.h (100%) rename {src => vendor}/linux/include/linux/pim.h (100%) rename {src => vendor}/linux/include/linux/pinctrl/devinfo.h (100%) rename {src => vendor}/linux/include/linux/pipe_fs_i.h (100%) rename {src => vendor}/linux/include/linux/platform_device.h (100%) rename {src => vendor}/linux/include/linux/plist.h (100%) rename {src => vendor}/linux/include/linux/pm.h (100%) rename {src => vendor}/linux/include/linux/pm_domain.h (100%) rename {src => vendor}/linux/include/linux/pm_qos.h (100%) rename {src => vendor}/linux/include/linux/pm_runtime.h (100%) rename {src => vendor}/linux/include/linux/pm_wakeup.h (100%) rename {src => vendor}/linux/include/linux/poison.h (100%) rename {src => vendor}/linux/include/linux/poll.h (100%) rename {src => vendor}/linux/include/linux/posix-clock.h (100%) rename {src => vendor}/linux/include/linux/posix-timers.h (100%) rename {src => vendor}/linux/include/linux/posix_acl.h (100%) rename {src => vendor}/linux/include/linux/posix_acl_xattr.h (100%) rename {src => vendor}/linux/include/linux/power_supply.h (100%) rename {src => vendor}/linux/include/linux/ppp_channel.h (100%) rename {src => vendor}/linux/include/linux/ppp_defs.h (100%) rename {src => vendor}/linux/include/linux/pr.h (100%) rename {src => vendor}/linux/include/linux/preempt.h (100%) rename {src => vendor}/linux/include/linux/prefetch.h (100%) rename {src => vendor}/linux/include/linux/printk.h (100%) rename {src => vendor}/linux/include/linux/proc_fs.h (100%) rename {src => vendor}/linux/include/linux/proc_ns.h (100%) rename {src => vendor}/linux/include/linux/profile.h (100%) rename {src => vendor}/linux/include/linux/projid.h (100%) rename {src => vendor}/linux/include/linux/property.h (100%) rename {src => vendor}/linux/include/linux/pstore.h (100%) rename {src => vendor}/linux/include/linux/ptp_classify.h (100%) rename {src => vendor}/linux/include/linux/ptrace.h (100%) rename {src => vendor}/linux/include/linux/pvclock_gtod.h (100%) rename {src => vendor}/linux/include/linux/quicklist.h (100%) rename {src => vendor}/linux/include/linux/quota.h (100%) rename {src => vendor}/linux/include/linux/quotaops.h (100%) rename {src => vendor}/linux/include/linux/radix-tree.h (100%) rename {src => vendor}/linux/include/linux/raid/pq.h (100%) rename {src => vendor}/linux/include/linux/raid/xor.h (100%) rename {src => vendor}/linux/include/linux/ramfs.h (100%) rename {src => vendor}/linux/include/linux/random.h (100%) rename {src => vendor}/linux/include/linux/range.h (100%) rename {src => vendor}/linux/include/linux/ratelimit.h (100%) rename {src => vendor}/linux/include/linux/rbtree.h (100%) rename {src => vendor}/linux/include/linux/rbtree_augmented.h (100%) rename {src => vendor}/linux/include/linux/rbtree_latch.h (100%) rename {src => vendor}/linux/include/linux/rcu_sync.h (100%) rename {src => vendor}/linux/include/linux/rculist.h (100%) rename {src => vendor}/linux/include/linux/rculist_bl.h (100%) rename {src => vendor}/linux/include/linux/rculist_nulls.h (100%) rename {src => vendor}/linux/include/linux/rcupdate.h (100%) rename {src => vendor}/linux/include/linux/rcutiny.h (100%) rename {src => vendor}/linux/include/linux/reboot.h (100%) rename {src => vendor}/linux/include/linux/reciprocal_div.h (100%) rename {src => vendor}/linux/include/linux/regset.h (100%) rename {src => vendor}/linux/include/linux/relay.h (100%) rename {src => vendor}/linux/include/linux/resource.h (100%) rename {src => vendor}/linux/include/linux/resource_ext.h (100%) rename {src => vendor}/linux/include/linux/rhashtable.h (100%) rename {src => vendor}/linux/include/linux/ring_buffer.h (100%) rename {src => vendor}/linux/include/linux/rmap.h (100%) rename {src => vendor}/linux/include/linux/root_dev.h (100%) rename {src => vendor}/linux/include/linux/rtc.h (100%) rename {src => vendor}/linux/include/linux/rtmutex.h (100%) rename {src => vendor}/linux/include/linux/rtnetlink.h (100%) rename {src => vendor}/linux/include/linux/rwlock.h (100%) rename {src => vendor}/linux/include/linux/rwlock_types.h (100%) rename {src => vendor}/linux/include/linux/rwsem-spinlock.h (100%) rename {src => vendor}/linux/include/linux/rwsem.h (100%) rename {src => vendor}/linux/include/linux/sbitmap.h (100%) rename {src => vendor}/linux/include/linux/scatterlist.h (100%) rename {src => vendor}/linux/include/linux/sched.h (100%) rename {src => vendor}/linux/include/linux/sched/deadline.h (100%) rename {src => vendor}/linux/include/linux/sched/prio.h (100%) rename {src => vendor}/linux/include/linux/sched/rt.h (100%) rename {src => vendor}/linux/include/linux/sched/sysctl.h (100%) rename {src => vendor}/linux/include/linux/sched_clock.h (100%) rename {src => vendor}/linux/include/linux/screen_info.h (100%) rename {src => vendor}/linux/include/linux/sctp.h (100%) rename {src => vendor}/linux/include/linux/seccomp.h (100%) rename {src => vendor}/linux/include/linux/securebits.h (100%) rename {src => vendor}/linux/include/linux/security.h (100%) rename {src => vendor}/linux/include/linux/selection.h (100%) rename {src => vendor}/linux/include/linux/selinux.h (100%) rename {src => vendor}/linux/include/linux/sem.h (100%) rename {src => vendor}/linux/include/linux/semaphore.h (100%) rename {src => vendor}/linux/include/linux/seq_buf.h (100%) rename {src => vendor}/linux/include/linux/seq_file.h (100%) rename {src => vendor}/linux/include/linux/seq_file_net.h (100%) rename {src => vendor}/linux/include/linux/seqlock.h (100%) rename {src => vendor}/linux/include/linux/serial.h (100%) rename {src => vendor}/linux/include/linux/serio.h (100%) rename {src => vendor}/linux/include/linux/sfi.h (100%) rename {src => vendor}/linux/include/linux/shm.h (100%) rename {src => vendor}/linux/include/linux/shmem_fs.h (100%) rename {src => vendor}/linux/include/linux/shrinker.h (100%) rename {src => vendor}/linux/include/linux/signal.h (100%) rename {src => vendor}/linux/include/linux/signalfd.h (100%) rename {src => vendor}/linux/include/linux/sizes.h (100%) rename {src => vendor}/linux/include/linux/skbuff.h (100%) rename {src => vendor}/linux/include/linux/slab.h (100%) rename {src => vendor}/linux/include/linux/slub_def.h (100%) rename {src => vendor}/linux/include/linux/smp.h (100%) rename {src => vendor}/linux/include/linux/smpboot.h (100%) rename {src => vendor}/linux/include/linux/sock_diag.h (100%) rename {src => vendor}/linux/include/linux/socket.h (100%) rename {src => vendor}/linux/include/linux/sort.h (100%) rename {src => vendor}/linux/include/linux/spinlock.h (100%) rename {src => vendor}/linux/include/linux/spinlock_api_up.h (100%) rename {src => vendor}/linux/include/linux/spinlock_types.h (100%) rename {src => vendor}/linux/include/linux/spinlock_types_up.h (100%) rename {src => vendor}/linux/include/linux/spinlock_up.h (100%) rename {src => vendor}/linux/include/linux/splice.h (100%) rename {src => vendor}/linux/include/linux/srcu.h (100%) rename {src => vendor}/linux/include/linux/stackdepot.h (100%) rename {src => vendor}/linux/include/linux/stackprotector.h (100%) rename {src => vendor}/linux/include/linux/stacktrace.h (100%) rename {src => vendor}/linux/include/linux/start_kernel.h (100%) rename {src => vendor}/linux/include/linux/stat.h (100%) rename {src => vendor}/linux/include/linux/statfs.h (100%) rename {src => vendor}/linux/include/linux/static_key.h (100%) rename {src => vendor}/linux/include/linux/stddef.h (100%) rename {src => vendor}/linux/include/linux/stop_machine.h (100%) rename {src => vendor}/linux/include/linux/string.h (100%) rename {src => vendor}/linux/include/linux/string_helpers.h (100%) rename {src => vendor}/linux/include/linux/stringhash.h (100%) rename {src => vendor}/linux/include/linux/stringify.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/auth.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/clnt.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/debug.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/gss_api.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/msg_prot.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/rpc_pipe_fs.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/sched.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/stats.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/timer.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/types.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/xdr.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/xprt.h (100%) rename {src => vendor}/linux/include/linux/sunrpc/xprtmultipath.h (100%) rename {src => vendor}/linux/include/linux/suspend.h (100%) rename {src => vendor}/linux/include/linux/swab.h (100%) rename {src => vendor}/linux/include/linux/swait.h (100%) rename {src => vendor}/linux/include/linux/swap.h (100%) rename {src => vendor}/linux/include/linux/swapops.h (100%) rename {src => vendor}/linux/include/linux/syscalls.h (100%) rename {src => vendor}/linux/include/linux/syscore_ops.h (100%) rename {src => vendor}/linux/include/linux/sysctl.h (100%) rename {src => vendor}/linux/include/linux/sysfs.h (100%) rename {src => vendor}/linux/include/linux/syslog.h (100%) rename {src => vendor}/linux/include/linux/sysrq.h (100%) rename {src => vendor}/linux/include/linux/task_io_accounting.h (100%) rename {src => vendor}/linux/include/linux/task_io_accounting_ops.h (100%) rename {src => vendor}/linux/include/linux/task_work.h (100%) rename {src => vendor}/linux/include/linux/taskstats_kern.h (100%) rename {src => vendor}/linux/include/linux/tcp.h (100%) rename {src => vendor}/linux/include/linux/textsearch.h (100%) rename {src => vendor}/linux/include/linux/thermal.h (100%) rename {src => vendor}/linux/include/linux/thread_info.h (100%) rename {src => vendor}/linux/include/linux/threads.h (100%) rename {src => vendor}/linux/include/linux/tick.h (100%) rename {src => vendor}/linux/include/linux/time.h (100%) rename {src => vendor}/linux/include/linux/time64.h (100%) rename {src => vendor}/linux/include/linux/timecounter.h (100%) rename {src => vendor}/linux/include/linux/timekeeper_internal.h (100%) rename {src => vendor}/linux/include/linux/timekeeping.h (100%) rename {src => vendor}/linux/include/linux/timer.h (100%) rename {src => vendor}/linux/include/linux/timerqueue.h (100%) rename {src => vendor}/linux/include/linux/timex.h (100%) rename {src => vendor}/linux/include/linux/topology.h (100%) rename {src => vendor}/linux/include/linux/trace_clock.h (100%) rename {src => vendor}/linux/include/linux/trace_events.h (100%) rename {src => vendor}/linux/include/linux/trace_seq.h (100%) rename {src => vendor}/linux/include/linux/tracehook.h (100%) rename {src => vendor}/linux/include/linux/tracepoint-defs.h (100%) rename {src => vendor}/linux/include/linux/tracepoint.h (100%) rename {src => vendor}/linux/include/linux/transport_class.h (100%) rename {src => vendor}/linux/include/linux/tsacct_kern.h (100%) rename {src => vendor}/linux/include/linux/tty.h (100%) rename {src => vendor}/linux/include/linux/tty_driver.h (100%) rename {src => vendor}/linux/include/linux/tty_flip.h (100%) rename {src => vendor}/linux/include/linux/tty_ldisc.h (100%) rename {src => vendor}/linux/include/linux/typecheck.h (100%) rename {src => vendor}/linux/include/linux/types.h (100%) rename {src => vendor}/linux/include/linux/u64_stats_sync.h (100%) rename {src => vendor}/linux/include/linux/uaccess.h (100%) rename {src => vendor}/linux/include/linux/udp.h (100%) rename {src => vendor}/linux/include/linux/uidgid.h (100%) rename {src => vendor}/linux/include/linux/uio.h (100%) rename {src => vendor}/linux/include/linux/unaligned/be_byteshift.h (100%) rename {src => vendor}/linux/include/linux/unaligned/generic.h (100%) rename {src => vendor}/linux/include/linux/unaligned/le_struct.h (100%) rename {src => vendor}/linux/include/linux/unaligned/packed_struct.h (100%) rename {src => vendor}/linux/include/linux/uprobes.h (100%) rename {src => vendor}/linux/include/linux/user-return-notifier.h (100%) rename {src => vendor}/linux/include/linux/user_namespace.h (100%) rename {src => vendor}/linux/include/linux/uts.h (100%) rename {src => vendor}/linux/include/linux/utsname.h (100%) rename {src => vendor}/linux/include/linux/uuid.h (100%) rename {src => vendor}/linux/include/linux/vfs.h (100%) rename {src => vendor}/linux/include/linux/virtio.h (100%) rename {src => vendor}/linux/include/linux/virtio_byteorder.h (100%) rename {src => vendor}/linux/include/linux/virtio_config.h (100%) rename {src => vendor}/linux/include/linux/virtio_mmio.h (100%) rename {src => vendor}/linux/include/linux/virtio_net.h (100%) rename {src => vendor}/linux/include/linux/virtio_ring.h (100%) rename {src => vendor}/linux/include/linux/vm_event_item.h (100%) rename {src => vendor}/linux/include/linux/vmacache.h (100%) rename {src => vendor}/linux/include/linux/vmalloc.h (100%) rename {src => vendor}/linux/include/linux/vmpressure.h (100%) rename {src => vendor}/linux/include/linux/vmstat.h (100%) rename {src => vendor}/linux/include/linux/vringh.h (100%) rename {src => vendor}/linux/include/linux/vt.h (100%) rename {src => vendor}/linux/include/linux/vt_buffer.h (100%) rename {src => vendor}/linux/include/linux/vt_kern.h (100%) rename {src => vendor}/linux/include/linux/vtime.h (100%) rename {src => vendor}/linux/include/linux/wait.h (100%) rename {src => vendor}/linux/include/linux/win_minmax.h (100%) rename {src => vendor}/linux/include/linux/wireless.h (100%) rename {src => vendor}/linux/include/linux/workqueue.h (100%) rename {src => vendor}/linux/include/linux/writeback.h (100%) rename {src => vendor}/linux/include/linux/ww_mutex.h (100%) rename {src => vendor}/linux/include/linux/xattr.h (100%) rename {src => vendor}/linux/include/linux/zconf.h (100%) rename {src => vendor}/linux/include/linux/zlib.h (100%) rename {src => vendor}/linux/include/linux/zutil.h (100%) rename {src => vendor}/linux/include/net/6lowpan.h (100%) rename {src => vendor}/linux/include/net/Space.h (100%) rename {src => vendor}/linux/include/net/addrconf.h (100%) rename {src => vendor}/linux/include/net/af_ieee802154.h (100%) rename {src => vendor}/linux/include/net/arp.h (100%) rename {src => vendor}/linux/include/net/ax25.h (100%) rename {src => vendor}/linux/include/net/busy_poll.h (100%) rename {src => vendor}/linux/include/net/calipso.h (100%) rename {src => vendor}/linux/include/net/cfg802154.h (100%) rename {src => vendor}/linux/include/net/checksum.h (100%) rename {src => vendor}/linux/include/net/cipso_ipv4.h (100%) rename {src => vendor}/linux/include/net/cls_cgroup.h (100%) rename {src => vendor}/linux/include/net/compat.h (100%) rename {src => vendor}/linux/include/net/dsa.h (100%) rename {src => vendor}/linux/include/net/dsfield.h (100%) rename {src => vendor}/linux/include/net/dst.h (100%) rename {src => vendor}/linux/include/net/dst_cache.h (100%) rename {src => vendor}/linux/include/net/dst_metadata.h (100%) rename {src => vendor}/linux/include/net/dst_ops.h (100%) rename {src => vendor}/linux/include/net/fib_rules.h (100%) rename {src => vendor}/linux/include/net/firewire.h (100%) rename {src => vendor}/linux/include/net/flow.h (100%) rename {src => vendor}/linux/include/net/flow_dissector.h (100%) rename {src => vendor}/linux/include/net/flowcache.h (100%) rename {src => vendor}/linux/include/net/gen_stats.h (100%) rename {src => vendor}/linux/include/net/genetlink.h (100%) rename {src => vendor}/linux/include/net/gre.h (100%) rename {src => vendor}/linux/include/net/gro_cells.h (100%) rename {src => vendor}/linux/include/net/icmp.h (100%) rename {src => vendor}/linux/include/net/if_inet6.h (100%) rename {src => vendor}/linux/include/net/inet6_connection_sock.h (100%) rename {src => vendor}/linux/include/net/inet6_hashtables.h (100%) rename {src => vendor}/linux/include/net/inet_common.h (100%) rename {src => vendor}/linux/include/net/inet_connection_sock.h (100%) rename {src => vendor}/linux/include/net/inet_ecn.h (100%) rename {src => vendor}/linux/include/net/inet_frag.h (100%) rename {src => vendor}/linux/include/net/inet_hashtables.h (100%) rename {src => vendor}/linux/include/net/inet_sock.h (100%) rename {src => vendor}/linux/include/net/inet_timewait_sock.h (100%) rename {src => vendor}/linux/include/net/inetpeer.h (100%) rename {src => vendor}/linux/include/net/ip.h (100%) rename {src => vendor}/linux/include/net/ip6_checksum.h (100%) rename {src => vendor}/linux/include/net/ip6_fib.h (100%) rename {src => vendor}/linux/include/net/ip6_route.h (100%) rename {src => vendor}/linux/include/net/ip6_tunnel.h (100%) rename {src => vendor}/linux/include/net/ip_fib.h (100%) rename {src => vendor}/linux/include/net/ip_tunnels.h (100%) rename {src => vendor}/linux/include/net/ipconfig.h (100%) rename {src => vendor}/linux/include/net/ipv6.h (100%) rename {src => vendor}/linux/include/net/iw_handler.h (100%) rename {src => vendor}/linux/include/net/l3mdev.h (100%) rename {src => vendor}/linux/include/net/lwtunnel.h (100%) rename {src => vendor}/linux/include/net/mac802154.h (100%) rename {src => vendor}/linux/include/net/mld.h (100%) rename {src => vendor}/linux/include/net/mpls.h (100%) rename {src => vendor}/linux/include/net/ndisc.h (100%) rename {src => vendor}/linux/include/net/neighbour.h (100%) rename {src => vendor}/linux/include/net/net_namespace.h (100%) rename {src => vendor}/linux/include/net/net_ratelimit.h (100%) rename {src => vendor}/linux/include/net/netevent.h (100%) rename {src => vendor}/linux/include/net/netlabel.h (100%) rename {src => vendor}/linux/include/net/netlink.h (100%) rename {src => vendor}/linux/include/net/netns/core.h (100%) rename {src => vendor}/linux/include/net/netns/dccp.h (100%) rename {src => vendor}/linux/include/net/netns/generic.h (100%) rename {src => vendor}/linux/include/net/netns/hash.h (100%) rename {src => vendor}/linux/include/net/netns/ieee802154_6lowpan.h (100%) rename {src => vendor}/linux/include/net/netns/ipv4.h (100%) rename {src => vendor}/linux/include/net/netns/ipv6.h (100%) rename {src => vendor}/linux/include/net/netns/mib.h (100%) rename {src => vendor}/linux/include/net/netns/mpls.h (100%) rename {src => vendor}/linux/include/net/netns/netfilter.h (100%) rename {src => vendor}/linux/include/net/netns/nftables.h (100%) rename {src => vendor}/linux/include/net/netns/packet.h (100%) rename {src => vendor}/linux/include/net/netns/sctp.h (100%) rename {src => vendor}/linux/include/net/netns/unix.h (100%) rename {src => vendor}/linux/include/net/netns/x_tables.h (100%) rename {src => vendor}/linux/include/net/netns/xfrm.h (100%) rename {src => vendor}/linux/include/net/netprio_cgroup.h (100%) rename {src => vendor}/linux/include/net/netrom.h (100%) rename {src => vendor}/linux/include/net/nexthop.h (100%) rename {src => vendor}/linux/include/net/nl802154.h (100%) rename {src => vendor}/linux/include/net/ping.h (100%) rename {src => vendor}/linux/include/net/pkt_sched.h (100%) rename {src => vendor}/linux/include/net/pptp.h (100%) rename {src => vendor}/linux/include/net/protocol.h (100%) rename {src => vendor}/linux/include/net/raw.h (100%) rename {src => vendor}/linux/include/net/rawv6.h (100%) rename {src => vendor}/linux/include/net/request_sock.h (100%) rename {src => vendor}/linux/include/net/route.h (100%) rename {src => vendor}/linux/include/net/rtnetlink.h (100%) rename {src => vendor}/linux/include/net/sch_generic.h (100%) rename {src => vendor}/linux/include/net/scm.h (100%) rename {src => vendor}/linux/include/net/secure_seq.h (100%) rename {src => vendor}/linux/include/net/snmp.h (100%) rename {src => vendor}/linux/include/net/sock.h (100%) rename {src => vendor}/linux/include/net/sock_reuseport.h (100%) rename {src => vendor}/linux/include/net/switchdev.h (100%) rename {src => vendor}/linux/include/net/tcp.h (100%) rename {src => vendor}/linux/include/net/tcp_states.h (100%) rename {src => vendor}/linux/include/net/timewait_sock.h (100%) rename {src => vendor}/linux/include/net/transp_v6.h (100%) rename {src => vendor}/linux/include/net/tso.h (100%) rename {src => vendor}/linux/include/net/udp.h (100%) rename {src => vendor}/linux/include/net/udplite.h (100%) rename {src => vendor}/linux/include/net/wext.h (100%) rename {src => vendor}/linux/include/net/xfrm.h (100%) rename {src => vendor}/linux/include/scsi/fc/fc_fcoe.h (100%) rename {src => vendor}/linux/include/scsi/scsi.h (100%) rename {src => vendor}/linux/include/scsi/scsi_cmnd.h (100%) rename {src => vendor}/linux/include/scsi/scsi_common.h (100%) rename {src => vendor}/linux/include/scsi/scsi_device.h (100%) rename {src => vendor}/linux/include/scsi/scsi_ioctl.h (100%) rename {src => vendor}/linux/include/scsi/scsi_proto.h (100%) rename {src => vendor}/linux/include/scsi/sg.h (100%) rename {src => vendor}/linux/include/trace/define_trace.h (100%) rename {src => vendor}/linux/include/trace/events/block.h (100%) rename {src => vendor}/linux/include/trace/events/btrfs.h (100%) rename {src => vendor}/linux/include/trace/events/cpuhp.h (100%) rename {src => vendor}/linux/include/trace/events/ext4.h (100%) rename {src => vendor}/linux/include/trace/events/fib.h (100%) rename {src => vendor}/linux/include/trace/events/fib6.h (100%) rename {src => vendor}/linux/include/trace/events/filemap.h (100%) rename {src => vendor}/linux/include/trace/events/irq.h (100%) rename {src => vendor}/linux/include/trace/events/jbd2.h (100%) rename {src => vendor}/linux/include/trace/events/kmem.h (100%) rename {src => vendor}/linux/include/trace/events/mmflags.h (100%) rename {src => vendor}/linux/include/trace/events/module.h (100%) rename {src => vendor}/linux/include/trace/events/napi.h (100%) rename {src => vendor}/linux/include/trace/events/net.h (100%) rename {src => vendor}/linux/include/trace/events/oom.h (100%) rename {src => vendor}/linux/include/trace/events/pagemap.h (100%) rename {src => vendor}/linux/include/trace/events/power.h (100%) rename {src => vendor}/linux/include/trace/events/printk.h (100%) rename {src => vendor}/linux/include/trace/events/random.h (100%) rename {src => vendor}/linux/include/trace/events/rcu.h (100%) rename {src => vendor}/linux/include/trace/events/sched.h (100%) rename {src => vendor}/linux/include/trace/events/signal.h (100%) rename {src => vendor}/linux/include/trace/events/skb.h (100%) rename {src => vendor}/linux/include/trace/events/sock.h (100%) rename {src => vendor}/linux/include/trace/events/task.h (100%) rename {src => vendor}/linux/include/trace/events/timer.h (100%) rename {src => vendor}/linux/include/trace/events/udp.h (100%) rename {src => vendor}/linux/include/trace/events/vmscan.h (100%) rename {src => vendor}/linux/include/trace/events/workqueue.h (100%) rename {src => vendor}/linux/include/trace/events/writeback.h (100%) rename {src => vendor}/linux/include/trace/syscall.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/Kbuild.asm (100%) rename {src => vendor}/linux/include/uapi/asm-generic/auxvec.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/errno-base.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/errno.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/fcntl.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/int-ll64.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/ioctl.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/ioctls.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/ipcbuf.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/mman-common.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/mman.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/msgbuf.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/param.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/poll.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/posix_types.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/resource.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/sembuf.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/shmbuf.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/shmparam.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/siginfo.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/signal-defs.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/signal.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/socket.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/sockios.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/stat.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/statfs.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/swab.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/termbits.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/termios.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/types.h (100%) rename {src => vendor}/linux/include/uapi/asm-generic/unistd.h (100%) rename {src => vendor}/linux/include/uapi/linux/acct.h (100%) rename {src => vendor}/linux/include/uapi/linux/aio_abi.h (100%) rename {src => vendor}/linux/include/uapi/linux/atalk.h (100%) rename {src => vendor}/linux/include/uapi/linux/audit.h (100%) rename {src => vendor}/linux/include/uapi/linux/auxvec.h (100%) rename {src => vendor}/linux/include/uapi/linux/ax25.h (100%) rename {src => vendor}/linux/include/uapi/linux/binfmts.h (100%) rename {src => vendor}/linux/include/uapi/linux/blkpg.h (100%) rename {src => vendor}/linux/include/uapi/linux/blktrace_api.h (100%) rename {src => vendor}/linux/include/uapi/linux/bpf.h (100%) rename {src => vendor}/linux/include/uapi/linux/bpf_common.h (100%) rename {src => vendor}/linux/include/uapi/linux/bsg.h (100%) rename {src => vendor}/linux/include/uapi/linux/btrfs.h (100%) rename {src => vendor}/linux/include/uapi/linux/btrfs_tree.h (100%) rename {src => vendor}/linux/include/uapi/linux/byteorder/big_endian.h (100%) rename {src => vendor}/linux/include/uapi/linux/byteorder/little_endian.h (100%) rename {src => vendor}/linux/include/uapi/linux/capability.h (100%) rename {src => vendor}/linux/include/uapi/linux/cdrom.h (100%) rename {src => vendor}/linux/include/uapi/linux/cgroupstats.h (100%) rename {src => vendor}/linux/include/uapi/linux/cn_proc.h (100%) rename {src => vendor}/linux/include/uapi/linux/const.h (100%) rename {src => vendor}/linux/include/uapi/linux/cryptouser.h (100%) rename {src => vendor}/linux/include/uapi/linux/dccp.h (100%) rename {src => vendor}/linux/include/uapi/linux/dqblk_xfs.h (100%) rename {src => vendor}/linux/include/uapi/linux/elf-em.h (100%) rename {src => vendor}/linux/include/uapi/linux/elf.h (100%) rename {src => vendor}/linux/include/uapi/linux/errno.h (100%) rename {src => vendor}/linux/include/uapi/linux/errqueue.h (100%) rename {src => vendor}/linux/include/uapi/linux/ethtool.h (100%) rename {src => vendor}/linux/include/uapi/linux/eventpoll.h (100%) rename {src => vendor}/linux/include/uapi/linux/falloc.h (100%) rename {src => vendor}/linux/include/uapi/linux/fcntl.h (100%) rename {src => vendor}/linux/include/uapi/linux/fd.h (100%) rename {src => vendor}/linux/include/uapi/linux/fib_rules.h (100%) rename {src => vendor}/linux/include/uapi/linux/fiemap.h (100%) rename {src => vendor}/linux/include/uapi/linux/filter.h (100%) rename {src => vendor}/linux/include/uapi/linux/fs.h (100%) rename {src => vendor}/linux/include/uapi/linux/futex.h (100%) rename {src => vendor}/linux/include/uapi/linux/gen_stats.h (100%) rename {src => vendor}/linux/include/uapi/linux/genetlink.h (100%) rename {src => vendor}/linux/include/uapi/linux/hdlc/ioctl.h (100%) rename {src => vendor}/linux/include/uapi/linux/hdreg.h (100%) rename {src => vendor}/linux/include/uapi/linux/hid.h (100%) rename {src => vendor}/linux/include/uapi/linux/hiddev.h (100%) rename {src => vendor}/linux/include/uapi/linux/hidraw.h (100%) rename {src => vendor}/linux/include/uapi/linux/hw_breakpoint.h (100%) rename {src => vendor}/linux/include/uapi/linux/icmp.h (100%) rename {src => vendor}/linux/include/uapi/linux/icmpv6.h (100%) rename {src => vendor}/linux/include/uapi/linux/if.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_addr.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_addrlabel.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_arcnet.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_arp.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_bonding.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_bridge.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_ether.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_fddi.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_frad.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_infiniband.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_link.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_packet.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_pppol2tp.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_pppox.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_tun.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_tunnel.h (100%) rename {src => vendor}/linux/include/uapi/linux/if_vlan.h (100%) rename {src => vendor}/linux/include/uapi/linux/igmp.h (100%) rename {src => vendor}/linux/include/uapi/linux/in.h (100%) rename {src => vendor}/linux/include/uapi/linux/in6.h (100%) rename {src => vendor}/linux/include/uapi/linux/in_route.h (100%) rename {src => vendor}/linux/include/uapi/linux/inet_diag.h (100%) rename {src => vendor}/linux/include/uapi/linux/input-event-codes.h (100%) rename {src => vendor}/linux/include/uapi/linux/input.h (100%) rename {src => vendor}/linux/include/uapi/linux/ioctl.h (100%) rename {src => vendor}/linux/include/uapi/linux/ip.h (100%) rename {src => vendor}/linux/include/uapi/linux/ip6_tunnel.h (100%) rename {src => vendor}/linux/include/uapi/linux/ipc.h (100%) rename {src => vendor}/linux/include/uapi/linux/ipsec.h (100%) rename {src => vendor}/linux/include/uapi/linux/ipv6.h (100%) rename {src => vendor}/linux/include/uapi/linux/ipv6_route.h (100%) rename {src => vendor}/linux/include/uapi/linux/irqnr.h (100%) rename {src => vendor}/linux/include/uapi/linux/kcov.h (100%) rename {src => vendor}/linux/include/uapi/linux/kd.h (100%) rename {src => vendor}/linux/include/uapi/linux/kdev_t.h (100%) rename {src => vendor}/linux/include/uapi/linux/kernel.h (100%) rename {src => vendor}/linux/include/uapi/linux/kexec.h (100%) rename {src => vendor}/linux/include/uapi/linux/keyboard.h (100%) rename {src => vendor}/linux/include/uapi/linux/keyctl.h (100%) rename {src => vendor}/linux/include/uapi/linux/libc-compat.h (100%) rename {src => vendor}/linux/include/uapi/linux/limits.h (100%) rename {src => vendor}/linux/include/uapi/linux/lwtunnel.h (100%) rename {src => vendor}/linux/include/uapi/linux/magic.h (100%) rename {src => vendor}/linux/include/uapi/linux/major.h (100%) rename {src => vendor}/linux/include/uapi/linux/mdio.h (100%) rename {src => vendor}/linux/include/uapi/linux/membarrier.h (100%) rename {src => vendor}/linux/include/uapi/linux/mempolicy.h (100%) rename {src => vendor}/linux/include/uapi/linux/mii.h (100%) rename {src => vendor}/linux/include/uapi/linux/mman.h (100%) rename {src => vendor}/linux/include/uapi/linux/mpls.h (100%) rename {src => vendor}/linux/include/uapi/linux/mqueue.h (100%) rename {src => vendor}/linux/include/uapi/linux/mroute.h (100%) rename {src => vendor}/linux/include/uapi/linux/mroute6.h (100%) rename {src => vendor}/linux/include/uapi/linux/msdos_fs.h (100%) rename {src => vendor}/linux/include/uapi/linux/msg.h (100%) rename {src => vendor}/linux/include/uapi/linux/neighbour.h (100%) rename {src => vendor}/linux/include/uapi/linux/net.h (100%) rename {src => vendor}/linux/include/uapi/linux/net_namespace.h (100%) rename {src => vendor}/linux/include/uapi/linux/net_tstamp.h (100%) rename {src => vendor}/linux/include/uapi/linux/netconf.h (100%) rename {src => vendor}/linux/include/uapi/linux/netdevice.h (100%) rename {src => vendor}/linux/include/uapi/linux/netfilter.h (100%) rename {src => vendor}/linux/include/uapi/linux/netfilter_arp.h (100%) rename {src => vendor}/linux/include/uapi/linux/netfilter_bridge.h (100%) rename {src => vendor}/linux/include/uapi/linux/netfilter_ipv4.h (100%) rename {src => vendor}/linux/include/uapi/linux/netfilter_ipv6.h (100%) rename {src => vendor}/linux/include/uapi/linux/netlink.h (100%) rename {src => vendor}/linux/include/uapi/linux/netrom.h (100%) rename {src => vendor}/linux/include/uapi/linux/nfs.h (100%) rename {src => vendor}/linux/include/uapi/linux/nfs2.h (100%) rename {src => vendor}/linux/include/uapi/linux/nfs3.h (100%) rename {src => vendor}/linux/include/uapi/linux/nfs4.h (100%) rename {src => vendor}/linux/include/uapi/linux/nfs_fs.h (100%) rename {src => vendor}/linux/include/uapi/linux/nfs_mount.h (100%) rename {src => vendor}/linux/include/uapi/linux/nfsacl.h (100%) rename {src => vendor}/linux/include/uapi/linux/nsfs.h (100%) rename {src => vendor}/linux/include/uapi/linux/oom.h (100%) rename {src => vendor}/linux/include/uapi/linux/param.h (100%) rename {src => vendor}/linux/include/uapi/linux/pci.h (100%) rename {src => vendor}/linux/include/uapi/linux/pci_regs.h (100%) rename {src => vendor}/linux/include/uapi/linux/perf_event.h (100%) rename {src => vendor}/linux/include/uapi/linux/personality.h (100%) rename {src => vendor}/linux/include/uapi/linux/pfkeyv2.h (100%) rename {src => vendor}/linux/include/uapi/linux/pkt_cls.h (100%) rename {src => vendor}/linux/include/uapi/linux/pkt_sched.h (100%) rename {src => vendor}/linux/include/uapi/linux/poll.h (100%) rename {src => vendor}/linux/include/uapi/linux/posix_acl.h (100%) rename {src => vendor}/linux/include/uapi/linux/posix_acl_xattr.h (100%) rename {src => vendor}/linux/include/uapi/linux/posix_types.h (100%) rename {src => vendor}/linux/include/uapi/linux/ppp_defs.h (100%) rename {src => vendor}/linux/include/uapi/linux/pr.h (100%) rename {src => vendor}/linux/include/uapi/linux/prctl.h (100%) rename {src => vendor}/linux/include/uapi/linux/ptrace.h (100%) rename {src => vendor}/linux/include/uapi/linux/quota.h (100%) rename {src => vendor}/linux/include/uapi/linux/random.h (100%) rename {src => vendor}/linux/include/uapi/linux/raw.h (100%) rename {src => vendor}/linux/include/uapi/linux/reboot.h (100%) rename {src => vendor}/linux/include/uapi/linux/resource.h (100%) rename {src => vendor}/linux/include/uapi/linux/route.h (100%) rename {src => vendor}/linux/include/uapi/linux/rtc.h (100%) rename {src => vendor}/linux/include/uapi/linux/rtnetlink.h (100%) rename {src => vendor}/linux/include/uapi/linux/sched.h (100%) rename {src => vendor}/linux/include/uapi/linux/screen_info.h (100%) rename {src => vendor}/linux/include/uapi/linux/sctp.h (100%) rename {src => vendor}/linux/include/uapi/linux/seccomp.h (100%) rename {src => vendor}/linux/include/uapi/linux/securebits.h (100%) rename {src => vendor}/linux/include/uapi/linux/sem.h (100%) rename {src => vendor}/linux/include/uapi/linux/serial.h (100%) rename {src => vendor}/linux/include/uapi/linux/serio.h (100%) rename {src => vendor}/linux/include/uapi/linux/shm.h (100%) rename {src => vendor}/linux/include/uapi/linux/signal.h (100%) rename {src => vendor}/linux/include/uapi/linux/signalfd.h (100%) rename {src => vendor}/linux/include/uapi/linux/snmp.h (100%) rename {src => vendor}/linux/include/uapi/linux/sock_diag.h (100%) rename {src => vendor}/linux/include/uapi/linux/socket.h (100%) rename {src => vendor}/linux/include/uapi/linux/sockios.h (100%) rename {src => vendor}/linux/include/uapi/linux/stat.h (100%) rename {src => vendor}/linux/include/uapi/linux/stddef.h (100%) rename {src => vendor}/linux/include/uapi/linux/string.h (100%) rename {src => vendor}/linux/include/uapi/linux/sunrpc/debug.h (100%) rename {src => vendor}/linux/include/uapi/linux/swab.h (100%) rename {src => vendor}/linux/include/uapi/linux/sysctl.h (100%) rename {src => vendor}/linux/include/uapi/linux/sysinfo.h (100%) rename {src => vendor}/linux/include/uapi/linux/taskstats.h (100%) rename {src => vendor}/linux/include/uapi/linux/tcp.h (100%) rename {src => vendor}/linux/include/uapi/linux/tcp_metrics.h (100%) rename {src => vendor}/linux/include/uapi/linux/termios.h (100%) rename {src => vendor}/linux/include/uapi/linux/thermal.h (100%) rename {src => vendor}/linux/include/uapi/linux/time.h (100%) rename {src => vendor}/linux/include/uapi/linux/times.h (100%) rename {src => vendor}/linux/include/uapi/linux/timex.h (100%) rename {src => vendor}/linux/include/uapi/linux/tiocl.h (100%) rename {src => vendor}/linux/include/uapi/linux/tty.h (100%) rename {src => vendor}/linux/include/uapi/linux/tty_flags.h (100%) rename {src => vendor}/linux/include/uapi/linux/types.h (100%) rename {src => vendor}/linux/include/uapi/linux/udp.h (100%) rename {src => vendor}/linux/include/uapi/linux/uio.h (100%) rename {src => vendor}/linux/include/uapi/linux/un.h (100%) rename {src => vendor}/linux/include/uapi/linux/unistd.h (100%) rename {src => vendor}/linux/include/uapi/linux/utime.h (100%) rename {src => vendor}/linux/include/uapi/linux/utsname.h (100%) rename {src => vendor}/linux/include/uapi/linux/uuid.h (100%) rename {src => vendor}/linux/include/uapi/linux/virtio_blk.h (100%) rename {src => vendor}/linux/include/uapi/linux/virtio_config.h (100%) rename {src => vendor}/linux/include/uapi/linux/virtio_ids.h (100%) rename {src => vendor}/linux/include/uapi/linux/virtio_net.h (100%) rename {src => vendor}/linux/include/uapi/linux/virtio_ring.h (100%) rename {src => vendor}/linux/include/uapi/linux/virtio_types.h (100%) rename {src => vendor}/linux/include/uapi/linux/vt.h (100%) rename {src => vendor}/linux/include/uapi/linux/wait.h (100%) rename {src => vendor}/linux/include/uapi/linux/wireless.h (100%) rename {src => vendor}/linux/include/uapi/linux/xattr.h (100%) rename {src => vendor}/linux/include/uapi/linux/xfrm.h (100%) rename {src => vendor}/linux/include/xen/xen.h (100%) rename {src => vendor}/linux/init/Kconfig (100%) rename {src => vendor}/linux/init/Makefile (100%) rename {src => vendor}/linux/init/do_mounts.c (100%) rename {src => vendor}/linux/init/do_mounts.h (100%) rename {src => vendor}/linux/init/init_task.c (100%) rename {src => vendor}/linux/init/main.c (100%) rename {src => vendor}/linux/init/noinitramfs.c (100%) rename {src => vendor}/linux/init/version.c (100%) rename {src => vendor}/linux/ipc/Makefile (100%) rename {src => vendor}/linux/kernel/.gitignore (100%) rename {src => vendor}/linux/kernel/Kconfig.hz (100%) rename {src => vendor}/linux/kernel/Kconfig.locks (100%) rename {src => vendor}/linux/kernel/Kconfig.preempt (100%) rename {src => vendor}/linux/kernel/Makefile (100%) rename {src => vendor}/linux/kernel/async.c (100%) rename {src => vendor}/linux/kernel/audit.h (100%) rename {src => vendor}/linux/kernel/bounds.c (100%) rename {src => vendor}/linux/kernel/bpf/Makefile (100%) rename {src => vendor}/linux/kernel/bpf/core.c (100%) rename {src => vendor}/linux/kernel/capability.c (100%) rename {src => vendor}/linux/kernel/cpu.c (100%) rename {src => vendor}/linux/kernel/cred.c (100%) rename {src => vendor}/linux/kernel/debug/kdb/.gitignore (100%) rename {src => vendor}/linux/kernel/exec_domain.c (100%) rename {src => vendor}/linux/kernel/exit.c (100%) rename {src => vendor}/linux/kernel/extable.c (100%) rename {src => vendor}/linux/kernel/fork.c (100%) rename {src => vendor}/linux/kernel/gcov/Kconfig (100%) rename {src => vendor}/linux/kernel/groups.c (100%) rename {src => vendor}/linux/kernel/irq/Kconfig (100%) rename {src => vendor}/linux/kernel/irq/Makefile (100%) rename {src => vendor}/linux/kernel/irq/chip.c (100%) rename {src => vendor}/linux/kernel/irq/debug.h (100%) rename {src => vendor}/linux/kernel/irq/devres.c (100%) rename {src => vendor}/linux/kernel/irq/dummychip.c (100%) rename {src => vendor}/linux/kernel/irq/handle.c (100%) rename {src => vendor}/linux/kernel/irq/internals.h (100%) rename {src => vendor}/linux/kernel/irq/irqdesc.c (100%) rename {src => vendor}/linux/kernel/irq/manage.c (100%) rename {src => vendor}/linux/kernel/irq/proc.c (100%) rename {src => vendor}/linux/kernel/irq/resend.c (100%) rename {src => vendor}/linux/kernel/irq/settings.h (100%) rename {src => vendor}/linux/kernel/irq/spurious.c (100%) rename {src => vendor}/linux/kernel/irq_work.c (100%) rename {src => vendor}/linux/kernel/kallsyms.c (100%) rename {src => vendor}/linux/kernel/kmod.c (100%) rename {src => vendor}/linux/kernel/ksysfs.c (100%) rename {src => vendor}/linux/kernel/kthread.c (100%) rename {src => vendor}/linux/kernel/livepatch/Makefile (100%) rename {src => vendor}/linux/kernel/locking/Makefile (100%) rename {src => vendor}/linux/kernel/locking/mutex.c (100%) rename {src => vendor}/linux/kernel/locking/mutex.h (100%) rename {src => vendor}/linux/kernel/locking/percpu-rwsem.c (100%) rename {src => vendor}/linux/kernel/locking/rwsem-spinlock.c (100%) rename {src => vendor}/linux/kernel/locking/rwsem.c (100%) rename {src => vendor}/linux/kernel/locking/rwsem.h (100%) rename {src => vendor}/linux/kernel/locking/semaphore.c (100%) rename {src => vendor}/linux/kernel/membarrier.c (100%) rename {src => vendor}/linux/kernel/memremap.c (100%) rename {src => vendor}/linux/kernel/notifier.c (100%) rename {src => vendor}/linux/kernel/nsproxy.c (100%) rename {src => vendor}/linux/kernel/panic.c (100%) rename {src => vendor}/linux/kernel/params.c (100%) rename {src => vendor}/linux/kernel/pid.c (100%) rename {src => vendor}/linux/kernel/power/Makefile (100%) rename {src => vendor}/linux/kernel/power/qos.c (100%) rename {src => vendor}/linux/kernel/printk/Makefile (100%) rename {src => vendor}/linux/kernel/printk/braille.h (100%) rename {src => vendor}/linux/kernel/printk/console_cmdline.h (100%) rename {src => vendor}/linux/kernel/printk/internal.h (100%) rename {src => vendor}/linux/kernel/printk/printk.c (100%) rename {src => vendor}/linux/kernel/ptrace.c (100%) rename {src => vendor}/linux/kernel/range.c (100%) rename {src => vendor}/linux/kernel/rcu/Makefile (100%) rename {src => vendor}/linux/kernel/rcu/rcu.h (100%) rename {src => vendor}/linux/kernel/rcu/srcu.c (100%) rename {src => vendor}/linux/kernel/rcu/sync.c (100%) rename {src => vendor}/linux/kernel/rcu/tiny.c (100%) rename {src => vendor}/linux/kernel/rcu/tiny_plugin.h (100%) rename {src => vendor}/linux/kernel/rcu/update.c (100%) rename {src => vendor}/linux/kernel/reboot.c (100%) rename {src => vendor}/linux/kernel/resource.c (100%) rename {src => vendor}/linux/kernel/sched/Makefile (100%) rename {src => vendor}/linux/kernel/sched/auto_group.h (100%) rename {src => vendor}/linux/kernel/sched/clock.c (100%) rename {src => vendor}/linux/kernel/sched/completion.c (100%) rename {src => vendor}/linux/kernel/sched/core.c (100%) rename {src => vendor}/linux/kernel/sched/cpuacct.h (100%) rename {src => vendor}/linux/kernel/sched/cpudeadline.h (100%) rename {src => vendor}/linux/kernel/sched/cpupri.h (100%) rename {src => vendor}/linux/kernel/sched/cputime.c (100%) rename {src => vendor}/linux/kernel/sched/deadline.c (100%) rename {src => vendor}/linux/kernel/sched/debug.c (100%) rename {src => vendor}/linux/kernel/sched/fair.c (100%) rename {src => vendor}/linux/kernel/sched/features.h (100%) rename {src => vendor}/linux/kernel/sched/idle.c (100%) rename {src => vendor}/linux/kernel/sched/idle_task.c (100%) rename {src => vendor}/linux/kernel/sched/loadavg.c (100%) rename {src => vendor}/linux/kernel/sched/rt.c (100%) rename {src => vendor}/linux/kernel/sched/sched.h (100%) rename {src => vendor}/linux/kernel/sched/stats.h (100%) rename {src => vendor}/linux/kernel/sched/stop_task.c (100%) rename {src => vendor}/linux/kernel/sched/swait.c (100%) rename {src => vendor}/linux/kernel/sched/wait.c (100%) rename {src => vendor}/linux/kernel/signal.c (100%) rename {src => vendor}/linux/kernel/smpboot.c (100%) rename {src => vendor}/linux/kernel/smpboot.h (100%) rename {src => vendor}/linux/kernel/softirq.c (100%) rename {src => vendor}/linux/kernel/sys.c (100%) rename {src => vendor}/linux/kernel/sys_ni.c (100%) rename {src => vendor}/linux/kernel/sysctl.c (100%) rename {src => vendor}/linux/kernel/sysctl_binary.c (100%) rename {src => vendor}/linux/kernel/task_work.c (100%) rename {src => vendor}/linux/kernel/time/Kconfig (100%) rename {src => vendor}/linux/kernel/time/Makefile (100%) rename {src => vendor}/linux/kernel/time/alarmtimer.c (100%) rename {src => vendor}/linux/kernel/time/clockevents.c (100%) rename {src => vendor}/linux/kernel/time/clocksource.c (100%) rename {src => vendor}/linux/kernel/time/hrtimer.c (100%) rename {src => vendor}/linux/kernel/time/itimer.c (100%) rename {src => vendor}/linux/kernel/time/jiffies.c (100%) rename {src => vendor}/linux/kernel/time/ntp.c (100%) rename {src => vendor}/linux/kernel/time/ntp_internal.h (100%) rename {src => vendor}/linux/kernel/time/posix-clock.c (100%) rename {src => vendor}/linux/kernel/time/posix-cpu-timers.c (100%) rename {src => vendor}/linux/kernel/time/posix-timers.c (100%) rename {src => vendor}/linux/kernel/time/tick-common.c (100%) rename {src => vendor}/linux/kernel/time/tick-internal.h (100%) rename {src => vendor}/linux/kernel/time/tick-oneshot.c (100%) rename {src => vendor}/linux/kernel/time/tick-sched.c (100%) rename {src => vendor}/linux/kernel/time/tick-sched.h (100%) rename {src => vendor}/linux/kernel/time/time.c (100%) rename {src => vendor}/linux/kernel/time/timeconst.bc (100%) rename {src => vendor}/linux/kernel/time/timeconv.c (100%) rename {src => vendor}/linux/kernel/time/timecounter.c (100%) rename {src => vendor}/linux/kernel/time/timekeeping.c (100%) rename {src => vendor}/linux/kernel/time/timekeeping.h (100%) rename {src => vendor}/linux/kernel/time/timekeeping_internal.h (100%) rename {src => vendor}/linux/kernel/time/timer.c (100%) rename {src => vendor}/linux/kernel/time/timer_list.c (100%) rename {src => vendor}/linux/kernel/trace/Kconfig (100%) rename {src => vendor}/linux/kernel/ucount.c (100%) rename {src => vendor}/linux/kernel/up.c (100%) rename {src => vendor}/linux/kernel/user.c (100%) rename {src => vendor}/linux/kernel/utsname_sysctl.c (100%) rename {src => vendor}/linux/kernel/workqueue.c (100%) rename {src => vendor}/linux/kernel/workqueue_internal.h (100%) rename {src => vendor}/linux/lib/.gitignore (100%) rename {src => vendor}/linux/lib/Kconfig (100%) rename {src => vendor}/linux/lib/Kconfig.debug (100%) rename {src => vendor}/linux/lib/Kconfig.kasan (100%) rename {src => vendor}/linux/lib/Kconfig.kgdb (100%) rename {src => vendor}/linux/lib/Kconfig.kmemcheck (100%) rename {src => vendor}/linux/lib/Kconfig.ubsan (100%) rename {src => vendor}/linux/lib/Makefile (100%) rename {src => vendor}/linux/lib/argv_split.c (100%) rename {src => vendor}/linux/lib/atomic64.c (100%) rename {src => vendor}/linux/lib/bcd.c (100%) rename {src => vendor}/linux/lib/bitmap.c (100%) rename {src => vendor}/linux/lib/bitrev.c (100%) rename {src => vendor}/linux/lib/bsearch.c (100%) rename {src => vendor}/linux/lib/bust_spinlocks.c (100%) rename {src => vendor}/linux/lib/chacha20.c (100%) rename {src => vendor}/linux/lib/checksum.c (100%) rename {src => vendor}/linux/lib/clz_ctz.c (100%) rename {src => vendor}/linux/lib/cmdline.c (100%) rename {src => vendor}/linux/lib/crc16.c (100%) rename {src => vendor}/linux/lib/crc32.c (100%) rename {src => vendor}/linux/lib/crc32defs.h (100%) rename {src => vendor}/linux/lib/ctype.c (100%) rename {src => vendor}/linux/lib/debug_info.c (100%) rename {src => vendor}/linux/lib/debug_locks.c (100%) rename {src => vendor}/linux/lib/dec_and_lock.c (100%) rename {src => vendor}/linux/lib/decompress.c (100%) rename {src => vendor}/linux/lib/devres.c (100%) rename {src => vendor}/linux/lib/div64.c (100%) rename {src => vendor}/linux/lib/dma-noop.c (100%) rename {src => vendor}/linux/lib/dump_stack.c (100%) rename {src => vendor}/linux/lib/dynamic_queue_limits.c (100%) rename {src => vendor}/linux/lib/earlycpio.c (100%) rename {src => vendor}/linux/lib/extable.c (100%) rename {src => vendor}/linux/lib/find_bit.c (100%) rename {src => vendor}/linux/lib/flex_array.c (100%) rename {src => vendor}/linux/lib/flex_proportions.c (100%) rename {src => vendor}/linux/lib/fonts/Kconfig (100%) rename {src => vendor}/linux/lib/gcd.c (100%) rename {src => vendor}/linux/lib/gen_crc32table.c (100%) rename {src => vendor}/linux/lib/halfmd4.c (100%) rename {src => vendor}/linux/lib/hexdump.c (100%) rename {src => vendor}/linux/lib/hweight.c (100%) rename {src => vendor}/linux/lib/idr.c (100%) rename {src => vendor}/linux/lib/int_sqrt.c (100%) rename {src => vendor}/linux/lib/iomap_copy.c (100%) rename {src => vendor}/linux/lib/iov_iter.c (100%) rename {src => vendor}/linux/lib/irq_regs.c (100%) rename {src => vendor}/linux/lib/is_single_threaded.c (100%) rename {src => vendor}/linux/lib/kasprintf.c (100%) rename {src => vendor}/linux/lib/kfifo.c (100%) rename {src => vendor}/linux/lib/klist.c (100%) rename {src => vendor}/linux/lib/kobject.c (100%) rename {src => vendor}/linux/lib/kobject_uevent.c (100%) rename {src => vendor}/linux/lib/kstrtox.c (100%) rename {src => vendor}/linux/lib/kstrtox.h (100%) rename {src => vendor}/linux/lib/lcm.c (100%) rename {src => vendor}/linux/lib/libcrc32c.c (100%) rename {src => vendor}/linux/lib/list_sort.c (100%) rename {src => vendor}/linux/lib/llist.c (100%) rename {src => vendor}/linux/lib/lockref.c (100%) rename {src => vendor}/linux/lib/lzo/Makefile (100%) rename {src => vendor}/linux/lib/lzo/lzo1x_compress.c (100%) rename {src => vendor}/linux/lib/lzo/lzo1x_decompress_safe.c (100%) rename {src => vendor}/linux/lib/lzo/lzodefs.h (100%) rename {src => vendor}/linux/lib/md5.c (100%) rename {src => vendor}/linux/lib/memweight.c (100%) rename {src => vendor}/linux/lib/net_utils.c (100%) rename {src => vendor}/linux/lib/nlattr.c (100%) rename {src => vendor}/linux/lib/nmi_backtrace.c (100%) rename {src => vendor}/linux/lib/nodemask.c (100%) rename {src => vendor}/linux/lib/once.c (100%) rename {src => vendor}/linux/lib/parser.c (100%) rename {src => vendor}/linux/lib/percpu-refcount.c (100%) rename {src => vendor}/linux/lib/percpu_ida.c (100%) rename {src => vendor}/linux/lib/plist.c (100%) rename {src => vendor}/linux/lib/radix-tree.c (100%) rename {src => vendor}/linux/lib/raid6/.gitignore (100%) rename {src => vendor}/linux/lib/raid6/Makefile (100%) rename {src => vendor}/linux/lib/raid6/algos.c (100%) rename {src => vendor}/linux/lib/raid6/int.uc (100%) rename {src => vendor}/linux/lib/raid6/mktables.c (100%) rename {src => vendor}/linux/lib/raid6/recov.c (100%) rename {src => vendor}/linux/lib/raid6/unroll.awk (100%) rename {src => vendor}/linux/lib/random32.c (100%) rename {src => vendor}/linux/lib/ratelimit.c (100%) rename {src => vendor}/linux/lib/rbtree.c (100%) rename {src => vendor}/linux/lib/reciprocal_div.c (100%) rename {src => vendor}/linux/lib/rhashtable.c (100%) rename {src => vendor}/linux/lib/sbitmap.c (100%) rename {src => vendor}/linux/lib/scatterlist.c (100%) rename {src => vendor}/linux/lib/seq_buf.c (100%) rename {src => vendor}/linux/lib/sha1.c (100%) rename {src => vendor}/linux/lib/show_mem.c (100%) rename {src => vendor}/linux/lib/sort.c (100%) rename {src => vendor}/linux/lib/string.c (100%) rename {src => vendor}/linux/lib/string_helpers.c (100%) rename {src => vendor}/linux/lib/timerqueue.c (100%) rename {src => vendor}/linux/lib/uuid.c (100%) rename {src => vendor}/linux/lib/vsprintf.c (100%) rename {src => vendor}/linux/lib/win_minmax.c (100%) rename {src => vendor}/linux/lib/xz/Kconfig (100%) rename {src => vendor}/linux/lib/zlib_deflate/Makefile (100%) rename {src => vendor}/linux/lib/zlib_deflate/deflate.c (100%) rename {src => vendor}/linux/lib/zlib_deflate/deflate_syms.c (100%) rename {src => vendor}/linux/lib/zlib_deflate/deftree.c (100%) rename {src => vendor}/linux/lib/zlib_deflate/defutil.h (100%) rename {src => vendor}/linux/lib/zlib_inflate/Makefile (100%) rename {src => vendor}/linux/lib/zlib_inflate/inffast.c (100%) rename {src => vendor}/linux/lib/zlib_inflate/inffast.h (100%) rename {src => vendor}/linux/lib/zlib_inflate/inffixed.h (100%) rename {src => vendor}/linux/lib/zlib_inflate/inflate.c (100%) rename {src => vendor}/linux/lib/zlib_inflate/inflate.h (100%) rename {src => vendor}/linux/lib/zlib_inflate/inflate_syms.c (100%) rename {src => vendor}/linux/lib/zlib_inflate/inftrees.c (100%) rename {src => vendor}/linux/lib/zlib_inflate/inftrees.h (100%) rename {src => vendor}/linux/lib/zlib_inflate/infutil.c (100%) rename {src => vendor}/linux/lib/zlib_inflate/infutil.h (100%) rename {src => vendor}/linux/mm/Kconfig (100%) rename {src => vendor}/linux/mm/Kconfig.debug (100%) rename {src => vendor}/linux/mm/Makefile (100%) rename {src => vendor}/linux/mm/backing-dev.c (100%) rename {src => vendor}/linux/mm/bootmem.c (100%) rename {src => vendor}/linux/mm/compaction.c (100%) rename {src => vendor}/linux/mm/debug.c (100%) rename {src => vendor}/linux/mm/dmapool.c (100%) rename {src => vendor}/linux/mm/filemap.c (100%) rename {src => vendor}/linux/mm/init-mm.c (100%) rename {src => vendor}/linux/mm/internal.h (100%) rename {src => vendor}/linux/mm/interval_tree.c (100%) rename {src => vendor}/linux/mm/list_lru.c (100%) rename {src => vendor}/linux/mm/maccess.c (100%) rename {src => vendor}/linux/mm/mempool.c (100%) rename {src => vendor}/linux/mm/mm_init.c (100%) rename {src => vendor}/linux/mm/mmu_context.c (100%) rename {src => vendor}/linux/mm/mmzone.c (100%) rename {src => vendor}/linux/mm/nommu.c (100%) rename {src => vendor}/linux/mm/oom_kill.c (100%) rename {src => vendor}/linux/mm/page-writeback.c (100%) rename {src => vendor}/linux/mm/page_alloc.c (100%) rename {src => vendor}/linux/mm/percpu-km.c (100%) rename {src => vendor}/linux/mm/percpu.c (100%) rename {src => vendor}/linux/mm/readahead.c (100%) rename {src => vendor}/linux/mm/shmem.c (100%) rename {src => vendor}/linux/mm/slab.h (100%) rename {src => vendor}/linux/mm/slab_common.c (100%) rename {src => vendor}/linux/mm/slub.c (100%) rename {src => vendor}/linux/mm/swap.c (100%) rename {src => vendor}/linux/mm/truncate.c (100%) rename {src => vendor}/linux/mm/util.c (100%) rename {src => vendor}/linux/mm/vmacache.c (100%) rename {src => vendor}/linux/mm/vmscan.c (100%) rename {src => vendor}/linux/mm/vmstat.c (100%) rename {src => vendor}/linux/mm/workingset.c (100%) rename {src => vendor}/linux/net/6lowpan/Kconfig (100%) rename {src => vendor}/linux/net/802/Kconfig (100%) rename {src => vendor}/linux/net/802/Makefile (100%) rename {src => vendor}/linux/net/8021q/Kconfig (100%) rename {src => vendor}/linux/net/9p/Kconfig (100%) rename {src => vendor}/linux/net/Kconfig (100%) rename {src => vendor}/linux/net/Makefile (100%) rename {src => vendor}/linux/net/atm/Kconfig (100%) rename {src => vendor}/linux/net/ax25/Kconfig (100%) rename {src => vendor}/linux/net/batman-adv/Kconfig (100%) rename {src => vendor}/linux/net/bluetooth/Kconfig (100%) rename {src => vendor}/linux/net/bluetooth/bnep/Kconfig (100%) rename {src => vendor}/linux/net/bluetooth/cmtp/Kconfig (100%) rename {src => vendor}/linux/net/bluetooth/hidp/Kconfig (100%) rename {src => vendor}/linux/net/bluetooth/rfcomm/Kconfig (100%) rename {src => vendor}/linux/net/bridge/Kconfig (100%) rename {src => vendor}/linux/net/bridge/netfilter/Kconfig (100%) rename {src => vendor}/linux/net/caif/Kconfig (100%) rename {src => vendor}/linux/net/can/Kconfig (100%) rename {src => vendor}/linux/net/ceph/Kconfig (100%) rename {src => vendor}/linux/net/core/Makefile (100%) rename {src => vendor}/linux/net/core/datagram.c (100%) rename {src => vendor}/linux/net/core/dev.c (100%) rename {src => vendor}/linux/net/core/dev_addr_lists.c (100%) rename {src => vendor}/linux/net/core/dev_ioctl.c (100%) rename {src => vendor}/linux/net/core/dst.c (100%) rename {src => vendor}/linux/net/core/dst_cache.c (100%) rename {src => vendor}/linux/net/core/ethtool.c (100%) rename {src => vendor}/linux/net/core/filter.c (100%) rename {src => vendor}/linux/net/core/flow.c (100%) rename {src => vendor}/linux/net/core/flow_dissector.c (100%) rename {src => vendor}/linux/net/core/gen_estimator.c (100%) rename {src => vendor}/linux/net/core/gen_stats.c (100%) rename {src => vendor}/linux/net/core/link_watch.c (100%) rename {src => vendor}/linux/net/core/neighbour.c (100%) rename {src => vendor}/linux/net/core/net-procfs.c (100%) rename {src => vendor}/linux/net/core/net-sysfs.c (100%) rename {src => vendor}/linux/net/core/net-sysfs.h (100%) rename {src => vendor}/linux/net/core/net_namespace.c (100%) rename {src => vendor}/linux/net/core/netevent.c (100%) rename {src => vendor}/linux/net/core/request_sock.c (100%) rename {src => vendor}/linux/net/core/rtnetlink.c (100%) rename {src => vendor}/linux/net/core/scm.c (100%) rename {src => vendor}/linux/net/core/secure_seq.c (100%) rename {src => vendor}/linux/net/core/skbuff.c (100%) rename {src => vendor}/linux/net/core/sock.c (100%) rename {src => vendor}/linux/net/core/sock_diag.c (100%) rename {src => vendor}/linux/net/core/sock_reuseport.c (100%) rename {src => vendor}/linux/net/core/stream.c (100%) rename {src => vendor}/linux/net/core/sysctl_net_core.c (100%) rename {src => vendor}/linux/net/core/tso.c (100%) rename {src => vendor}/linux/net/core/utils.c (100%) rename {src => vendor}/linux/net/dcb/Kconfig (100%) rename {src => vendor}/linux/net/dccp/Kconfig (100%) rename {src => vendor}/linux/net/dccp/ccids/Kconfig (100%) rename {src => vendor}/linux/net/decnet/Kconfig (100%) rename {src => vendor}/linux/net/decnet/netfilter/Kconfig (100%) rename {src => vendor}/linux/net/dns_resolver/Kconfig (100%) rename {src => vendor}/linux/net/dsa/Kconfig (100%) rename {src => vendor}/linux/net/ethernet/Makefile (100%) rename {src => vendor}/linux/net/ethernet/eth.c (100%) rename {src => vendor}/linux/net/hsr/Kconfig (100%) rename {src => vendor}/linux/net/ieee802154/6lowpan/Kconfig (100%) rename {src => vendor}/linux/net/ieee802154/Kconfig (100%) rename {src => vendor}/linux/net/ipv4/Kconfig (100%) rename {src => vendor}/linux/net/ipv4/Makefile (100%) rename {src => vendor}/linux/net/ipv4/af_inet.c (100%) rename {src => vendor}/linux/net/ipv4/arp.c (100%) rename {src => vendor}/linux/net/ipv4/datagram.c (100%) rename {src => vendor}/linux/net/ipv4/devinet.c (100%) rename {src => vendor}/linux/net/ipv4/fib_frontend.c (100%) rename {src => vendor}/linux/net/ipv4/fib_lookup.h (100%) rename {src => vendor}/linux/net/ipv4/fib_semantics.c (100%) rename {src => vendor}/linux/net/ipv4/fib_trie.c (100%) rename {src => vendor}/linux/net/ipv4/gre_offload.c (100%) rename {src => vendor}/linux/net/ipv4/icmp.c (100%) rename {src => vendor}/linux/net/ipv4/igmp.c (100%) rename {src => vendor}/linux/net/ipv4/inet_connection_sock.c (100%) rename {src => vendor}/linux/net/ipv4/inet_diag.c (100%) rename {src => vendor}/linux/net/ipv4/inet_fragment.c (100%) rename {src => vendor}/linux/net/ipv4/inet_hashtables.c (100%) rename {src => vendor}/linux/net/ipv4/inet_timewait_sock.c (100%) rename {src => vendor}/linux/net/ipv4/inetpeer.c (100%) rename {src => vendor}/linux/net/ipv4/ip_forward.c (100%) rename {src => vendor}/linux/net/ipv4/ip_fragment.c (100%) rename {src => vendor}/linux/net/ipv4/ip_input.c (100%) rename {src => vendor}/linux/net/ipv4/ip_options.c (100%) rename {src => vendor}/linux/net/ipv4/ip_output.c (100%) rename {src => vendor}/linux/net/ipv4/ip_sockglue.c (100%) rename {src => vendor}/linux/net/ipv4/ip_tunnel.c (100%) rename {src => vendor}/linux/net/ipv4/ip_tunnel_core.c (100%) rename {src => vendor}/linux/net/ipv4/ipconfig.c (100%) rename {src => vendor}/linux/net/ipv4/netfilter/Kconfig (100%) rename {src => vendor}/linux/net/ipv4/ping.c (100%) rename {src => vendor}/linux/net/ipv4/proc.c (100%) rename {src => vendor}/linux/net/ipv4/protocol.c (100%) rename {src => vendor}/linux/net/ipv4/raw.c (100%) rename {src => vendor}/linux/net/ipv4/route.c (100%) rename {src => vendor}/linux/net/ipv4/sysctl_net_ipv4.c (100%) rename {src => vendor}/linux/net/ipv4/tcp.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_cong.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_cubic.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_diag.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_fastopen.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_input.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_ipv4.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_metrics.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_minisocks.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_offload.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_output.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_rate.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_recovery.c (100%) rename {src => vendor}/linux/net/ipv4/tcp_timer.c (100%) rename {src => vendor}/linux/net/ipv4/tunnel4.c (100%) rename {src => vendor}/linux/net/ipv4/udp.c (100%) rename {src => vendor}/linux/net/ipv4/udp_impl.h (100%) rename {src => vendor}/linux/net/ipv4/udp_offload.c (100%) rename {src => vendor}/linux/net/ipv4/udplite.c (100%) rename {src => vendor}/linux/net/ipv4/xfrm4_input.c (100%) rename {src => vendor}/linux/net/ipv4/xfrm4_mode_beet.c (100%) rename {src => vendor}/linux/net/ipv4/xfrm4_mode_transport.c (100%) rename {src => vendor}/linux/net/ipv4/xfrm4_mode_tunnel.c (100%) rename {src => vendor}/linux/net/ipv4/xfrm4_output.c (100%) rename {src => vendor}/linux/net/ipv4/xfrm4_policy.c (100%) rename {src => vendor}/linux/net/ipv4/xfrm4_protocol.c (100%) rename {src => vendor}/linux/net/ipv4/xfrm4_state.c (100%) rename {src => vendor}/linux/net/ipv6/Kconfig (100%) rename {src => vendor}/linux/net/ipv6/Makefile (100%) rename {src => vendor}/linux/net/ipv6/addrconf.c (100%) rename {src => vendor}/linux/net/ipv6/addrconf_core.c (100%) rename {src => vendor}/linux/net/ipv6/addrlabel.c (100%) rename {src => vendor}/linux/net/ipv6/af_inet6.c (100%) rename {src => vendor}/linux/net/ipv6/anycast.c (100%) rename {src => vendor}/linux/net/ipv6/datagram.c (100%) rename {src => vendor}/linux/net/ipv6/exthdrs.c (100%) rename {src => vendor}/linux/net/ipv6/exthdrs_core.c (100%) rename {src => vendor}/linux/net/ipv6/exthdrs_offload.c (100%) rename {src => vendor}/linux/net/ipv6/icmp.c (100%) rename {src => vendor}/linux/net/ipv6/inet6_connection_sock.c (100%) rename {src => vendor}/linux/net/ipv6/inet6_hashtables.c (100%) rename {src => vendor}/linux/net/ipv6/ip6_checksum.c (100%) rename {src => vendor}/linux/net/ipv6/ip6_fib.c (100%) rename {src => vendor}/linux/net/ipv6/ip6_flowlabel.c (100%) rename {src => vendor}/linux/net/ipv6/ip6_icmp.c (100%) rename {src => vendor}/linux/net/ipv6/ip6_input.c (100%) rename {src => vendor}/linux/net/ipv6/ip6_offload.c (100%) rename {src => vendor}/linux/net/ipv6/ip6_offload.h (100%) rename {src => vendor}/linux/net/ipv6/ip6_output.c (100%) rename {src => vendor}/linux/net/ipv6/ipv6_sockglue.c (100%) rename {src => vendor}/linux/net/ipv6/mcast.c (100%) rename {src => vendor}/linux/net/ipv6/mcast_snoop.c (100%) rename {src => vendor}/linux/net/ipv6/ndisc.c (100%) rename {src => vendor}/linux/net/ipv6/netfilter/Kconfig (100%) rename {src => vendor}/linux/net/ipv6/output_core.c (100%) rename {src => vendor}/linux/net/ipv6/ping.c (100%) rename {src => vendor}/linux/net/ipv6/proc.c (100%) rename {src => vendor}/linux/net/ipv6/protocol.c (100%) rename {src => vendor}/linux/net/ipv6/raw.c (100%) rename {src => vendor}/linux/net/ipv6/reassembly.c (100%) rename {src => vendor}/linux/net/ipv6/route.c (100%) rename {src => vendor}/linux/net/ipv6/sit.c (100%) rename {src => vendor}/linux/net/ipv6/sysctl_net_ipv6.c (100%) rename {src => vendor}/linux/net/ipv6/tcp_ipv6.c (100%) rename {src => vendor}/linux/net/ipv6/tcpv6_offload.c (100%) rename {src => vendor}/linux/net/ipv6/udp.c (100%) rename {src => vendor}/linux/net/ipv6/udp_impl.h (100%) rename {src => vendor}/linux/net/ipv6/udp_offload.c (100%) rename {src => vendor}/linux/net/ipv6/udplite.c (100%) rename {src => vendor}/linux/net/ipv6/xfrm6_input.c (100%) rename {src => vendor}/linux/net/ipv6/xfrm6_mode_beet.c (100%) rename {src => vendor}/linux/net/ipv6/xfrm6_mode_transport.c (100%) rename {src => vendor}/linux/net/ipv6/xfrm6_mode_tunnel.c (100%) rename {src => vendor}/linux/net/ipv6/xfrm6_output.c (100%) rename {src => vendor}/linux/net/ipv6/xfrm6_policy.c (100%) rename {src => vendor}/linux/net/ipv6/xfrm6_protocol.c (100%) rename {src => vendor}/linux/net/ipv6/xfrm6_state.c (100%) rename {src => vendor}/linux/net/ipx/Kconfig (100%) rename {src => vendor}/linux/net/irda/Kconfig (100%) rename {src => vendor}/linux/net/irda/ircomm/Kconfig (100%) rename {src => vendor}/linux/net/irda/irlan/Kconfig (100%) rename {src => vendor}/linux/net/irda/irnet/Kconfig (100%) rename {src => vendor}/linux/net/iucv/Kconfig (100%) rename {src => vendor}/linux/net/kcm/Kconfig (100%) rename {src => vendor}/linux/net/l2tp/Kconfig (100%) rename {src => vendor}/linux/net/l3mdev/Kconfig (100%) rename {src => vendor}/linux/net/lapb/Kconfig (100%) rename {src => vendor}/linux/net/llc/Kconfig (100%) rename {src => vendor}/linux/net/mac80211/Kconfig (100%) rename {src => vendor}/linux/net/mac802154/Kconfig (100%) rename {src => vendor}/linux/net/mpls/Kconfig (100%) rename {src => vendor}/linux/net/ncsi/Kconfig (100%) rename {src => vendor}/linux/net/netfilter/Kconfig (100%) rename {src => vendor}/linux/net/netfilter/ipset/Kconfig (100%) rename {src => vendor}/linux/net/netfilter/ipvs/Kconfig (100%) rename {src => vendor}/linux/net/netlabel/Kconfig (100%) rename {src => vendor}/linux/net/netlink/Kconfig (100%) rename {src => vendor}/linux/net/netlink/Makefile (100%) rename {src => vendor}/linux/net/netlink/af_netlink.c (100%) rename {src => vendor}/linux/net/netlink/af_netlink.h (100%) rename {src => vendor}/linux/net/netlink/genetlink.c (100%) rename {src => vendor}/linux/net/nfc/Kconfig (100%) rename {src => vendor}/linux/net/nfc/hci/Kconfig (100%) rename {src => vendor}/linux/net/nfc/nci/Kconfig (100%) rename {src => vendor}/linux/net/openvswitch/Kconfig (100%) rename {src => vendor}/linux/net/packet/Kconfig (100%) rename {src => vendor}/linux/net/phonet/Kconfig (100%) rename {src => vendor}/linux/net/qrtr/Kconfig (100%) rename {src => vendor}/linux/net/rds/Kconfig (100%) rename {src => vendor}/linux/net/rfkill/Kconfig (100%) rename {src => vendor}/linux/net/rxrpc/Kconfig (100%) rename {src => vendor}/linux/net/sched/Kconfig (100%) rename {src => vendor}/linux/net/sched/Makefile (100%) rename {src => vendor}/linux/net/sched/sch_generic.c (100%) rename {src => vendor}/linux/net/sched/sch_mq.c (100%) rename {src => vendor}/linux/net/sctp/Kconfig (100%) rename {src => vendor}/linux/net/socket.c (100%) rename {src => vendor}/linux/net/strparser/Kconfig (100%) rename {src => vendor}/linux/net/sunrpc/Kconfig (100%) rename {src => vendor}/linux/net/switchdev/Kconfig (100%) rename {src => vendor}/linux/net/sysctl_net.c (100%) rename {src => vendor}/linux/net/tipc/Kconfig (100%) rename {src => vendor}/linux/net/unix/Kconfig (100%) rename {src => vendor}/linux/net/vmw_vsock/Kconfig (100%) rename {src => vendor}/linux/net/wimax/Kconfig (100%) rename {src => vendor}/linux/net/wireless/.gitignore (100%) rename {src => vendor}/linux/net/wireless/Kconfig (100%) rename {src => vendor}/linux/net/x25/Kconfig (100%) rename {src => vendor}/linux/net/xfrm/Kconfig (100%) rename {src => vendor}/linux/net/xfrm/Makefile (100%) rename {src => vendor}/linux/net/xfrm/xfrm_hash.c (100%) rename {src => vendor}/linux/net/xfrm/xfrm_hash.h (100%) rename {src => vendor}/linux/net/xfrm/xfrm_input.c (100%) rename {src => vendor}/linux/net/xfrm/xfrm_output.c (100%) rename {src => vendor}/linux/net/xfrm/xfrm_policy.c (100%) rename {src => vendor}/linux/net/xfrm/xfrm_replay.c (100%) rename {src => vendor}/linux/net/xfrm/xfrm_state.c (100%) rename {src => vendor}/linux/net/xfrm/xfrm_sysctl.c (100%) rename {src => vendor}/linux/samples/Kconfig (100%) rename {src => vendor}/linux/samples/auxdisplay/.gitignore (100%) rename {src => vendor}/linux/samples/connector/.gitignore (100%) rename {src => vendor}/linux/samples/hidraw/.gitignore (100%) rename {src => vendor}/linux/samples/mei/.gitignore (100%) rename {src => vendor}/linux/samples/mic/mpssd/.gitignore (100%) rename {src => vendor}/linux/samples/seccomp/.gitignore (100%) rename {src => vendor}/linux/samples/timers/.gitignore (100%) rename {src => vendor}/linux/samples/watchdog/.gitignore (100%) rename {src => vendor}/linux/scripts/.gitignore (100%) rename {src => vendor}/linux/scripts/Kbuild.include (100%) rename {src => vendor}/linux/scripts/Makefile (100%) rename {src => vendor}/linux/scripts/Makefile.asm-generic (100%) rename {src => vendor}/linux/scripts/Makefile.build (100%) rename {src => vendor}/linux/scripts/Makefile.extrawarn (100%) rename {src => vendor}/linux/scripts/Makefile.gcc-plugins (100%) rename {src => vendor}/linux/scripts/Makefile.host (100%) rename {src => vendor}/linux/scripts/Makefile.kasan (100%) rename {src => vendor}/linux/scripts/Makefile.lib (100%) rename {src => vendor}/linux/scripts/Makefile.modpost (100%) rename {src => vendor}/linux/scripts/Makefile.ubsan (100%) rename {src => vendor}/linux/scripts/basic/.gitignore (100%) rename {src => vendor}/linux/scripts/basic/Makefile (100%) rename {src => vendor}/linux/scripts/basic/fixdep.c (100%) rename {src => vendor}/linux/scripts/checksyscalls.sh (100%) rename {src => vendor}/linux/scripts/dtc/.gitignore (100%) rename {src => vendor}/linux/scripts/gcc-goto.sh (100%) rename {src => vendor}/linux/scripts/gcc-version.sh (100%) rename {src => vendor}/linux/scripts/gdb/linux/.gitignore (100%) rename {src => vendor}/linux/scripts/genksyms/.gitignore (100%) rename {src => vendor}/linux/scripts/headers_install.sh (100%) rename {src => vendor}/linux/scripts/kallsyms.c (100%) rename {src => vendor}/linux/scripts/kconfig/.gitignore (100%) rename {src => vendor}/linux/scripts/kconfig/Makefile (100%) rename {src => vendor}/linux/scripts/kconfig/check.sh (100%) rename {src => vendor}/linux/scripts/kconfig/conf.c (100%) rename {src => vendor}/linux/scripts/kconfig/confdata.c (100%) rename {src => vendor}/linux/scripts/kconfig/expr.c (100%) rename {src => vendor}/linux/scripts/kconfig/expr.h (100%) rename {src => vendor}/linux/scripts/kconfig/list.h (100%) rename {src => vendor}/linux/scripts/kconfig/lkc.h (100%) rename {src => vendor}/linux/scripts/kconfig/lkc_proto.h (100%) rename {src => vendor}/linux/scripts/kconfig/lxdialog/.gitignore (100%) rename {src => vendor}/linux/scripts/kconfig/lxdialog/check-lxdialog.sh (100%) rename {src => vendor}/linux/scripts/kconfig/menu.c (100%) rename {src => vendor}/linux/scripts/kconfig/symbol.c (100%) rename {src => vendor}/linux/scripts/kconfig/util.c (100%) rename {src => vendor}/linux/scripts/kconfig/zconf.hash.c_shipped (100%) rename {src => vendor}/linux/scripts/kconfig/zconf.lex.c_shipped (100%) rename {src => vendor}/linux/scripts/kconfig/zconf.tab.c_shipped (100%) rename {src => vendor}/linux/scripts/link-vmlinux.sh (100%) rename {src => vendor}/linux/scripts/mkcompile_h (100%) rename {src => vendor}/linux/scripts/mksysmap (100%) rename {src => vendor}/linux/scripts/mod/.gitignore (100%) rename {src => vendor}/linux/scripts/mod/Makefile (100%) rename {src => vendor}/linux/scripts/mod/devicetable-offsets.c (100%) rename {src => vendor}/linux/scripts/mod/empty.c (100%) rename {src => vendor}/linux/scripts/mod/file2alias.c (100%) rename {src => vendor}/linux/scripts/mod/mk_elfconfig.c (100%) rename {src => vendor}/linux/scripts/mod/modpost.c (100%) rename {src => vendor}/linux/scripts/mod/modpost.h (100%) rename {src => vendor}/linux/scripts/mod/sumversion.c (100%) rename {src => vendor}/linux/scripts/selinux/genheaders/.gitignore (100%) rename {src => vendor}/linux/scripts/selinux/mdp/.gitignore (100%) rename {src => vendor}/linux/scripts/setlocalversion (100%) rename {src => vendor}/linux/scripts/unifdef.c (100%) rename {src => vendor}/linux/security/Kconfig (100%) rename {src => vendor}/linux/security/Makefile (100%) rename {src => vendor}/linux/security/apparmor/.gitignore (100%) rename {src => vendor}/linux/security/apparmor/Kconfig (100%) rename {src => vendor}/linux/security/commoncap.c (100%) rename {src => vendor}/linux/security/integrity/Kconfig (100%) rename {src => vendor}/linux/security/integrity/evm/Kconfig (100%) rename {src => vendor}/linux/security/integrity/ima/Kconfig (100%) rename {src => vendor}/linux/security/keys/Kconfig (100%) rename {src => vendor}/linux/security/loadpin/Kconfig (100%) rename {src => vendor}/linux/security/selinux/.gitignore (100%) rename {src => vendor}/linux/security/selinux/Kconfig (100%) rename {src => vendor}/linux/security/smack/Kconfig (100%) rename {src => vendor}/linux/security/tomoyo/.gitignore (100%) rename {src => vendor}/linux/security/tomoyo/Kconfig (100%) rename {src => vendor}/linux/security/yama/Kconfig (100%) rename {src => vendor}/linux/sound/Kconfig (100%) rename {src => vendor}/linux/sound/Makefile (100%) rename {src => vendor}/linux/sound/aoa/Kconfig (100%) rename {src => vendor}/linux/sound/aoa/codecs/Kconfig (100%) rename {src => vendor}/linux/sound/aoa/fabrics/Kconfig (100%) rename {src => vendor}/linux/sound/aoa/soundbus/Kconfig (100%) rename {src => vendor}/linux/sound/arm/Kconfig (100%) rename {src => vendor}/linux/sound/atmel/Kconfig (100%) rename {src => vendor}/linux/sound/core/Kconfig (100%) rename {src => vendor}/linux/sound/core/seq/Kconfig (100%) rename {src => vendor}/linux/sound/drivers/Kconfig (100%) rename {src => vendor}/linux/sound/firewire/Kconfig (100%) rename {src => vendor}/linux/sound/hda/Kconfig (100%) rename {src => vendor}/linux/sound/isa/Kconfig (100%) rename {src => vendor}/linux/sound/mips/Kconfig (100%) rename {src => vendor}/linux/sound/oss/.gitignore (100%) rename {src => vendor}/linux/sound/oss/Kconfig (100%) rename {src => vendor}/linux/sound/oss/dmasound/Kconfig (100%) rename {src => vendor}/linux/sound/parisc/Kconfig (100%) rename {src => vendor}/linux/sound/pci/Kconfig (100%) rename {src => vendor}/linux/sound/pci/hda/Kconfig (100%) rename {src => vendor}/linux/sound/pcmcia/Kconfig (100%) rename {src => vendor}/linux/sound/ppc/Kconfig (100%) rename {src => vendor}/linux/sound/sh/Kconfig (100%) rename {src => vendor}/linux/sound/soc/Kconfig (100%) rename {src => vendor}/linux/sound/soc/adi/Kconfig (100%) rename {src => vendor}/linux/sound/soc/amd/Kconfig (100%) rename {src => vendor}/linux/sound/soc/atmel/Kconfig (100%) rename {src => vendor}/linux/sound/soc/au1x/Kconfig (100%) rename {src => vendor}/linux/sound/soc/bcm/Kconfig (100%) rename {src => vendor}/linux/sound/soc/blackfin/Kconfig (100%) rename {src => vendor}/linux/sound/soc/cirrus/Kconfig (100%) rename {src => vendor}/linux/sound/soc/codecs/Kconfig (100%) rename {src => vendor}/linux/sound/soc/davinci/Kconfig (100%) rename {src => vendor}/linux/sound/soc/dwc/Kconfig (100%) rename {src => vendor}/linux/sound/soc/fsl/Kconfig (100%) rename {src => vendor}/linux/sound/soc/generic/Kconfig (100%) rename {src => vendor}/linux/sound/soc/img/Kconfig (100%) rename {src => vendor}/linux/sound/soc/intel/Kconfig (100%) rename {src => vendor}/linux/sound/soc/jz4740/Kconfig (100%) rename {src => vendor}/linux/sound/soc/kirkwood/Kconfig (100%) rename {src => vendor}/linux/sound/soc/mediatek/Kconfig (100%) rename {src => vendor}/linux/sound/soc/mxs/Kconfig (100%) rename {src => vendor}/linux/sound/soc/nuc900/Kconfig (100%) rename {src => vendor}/linux/sound/soc/omap/Kconfig (100%) rename {src => vendor}/linux/sound/soc/pxa/Kconfig (100%) rename {src => vendor}/linux/sound/soc/qcom/Kconfig (100%) rename {src => vendor}/linux/sound/soc/rockchip/Kconfig (100%) rename {src => vendor}/linux/sound/soc/samsung/Kconfig (100%) rename {src => vendor}/linux/sound/soc/sh/Kconfig (100%) rename {src => vendor}/linux/sound/soc/sirf/Kconfig (100%) rename {src => vendor}/linux/sound/soc/spear/Kconfig (100%) rename {src => vendor}/linux/sound/soc/sti/Kconfig (100%) rename {src => vendor}/linux/sound/soc/sunxi/Kconfig (100%) rename {src => vendor}/linux/sound/soc/tegra/Kconfig (100%) rename {src => vendor}/linux/sound/soc/txx9/Kconfig (100%) rename {src => vendor}/linux/sound/soc/ux500/Kconfig (100%) rename {src => vendor}/linux/sound/soc/xtensa/Kconfig (100%) rename {src => vendor}/linux/sound/soc/zte/Kconfig (100%) rename {src => vendor}/linux/sound/sparc/Kconfig (100%) rename {src => vendor}/linux/sound/spi/Kconfig (100%) rename {src => vendor}/linux/sound/usb/Kconfig (100%) rename {src => vendor}/linux/sound/usb/line6/Kconfig (100%) rename {src => vendor}/linux/tools/accounting/.gitignore (100%) rename {src => vendor}/linux/tools/build/.gitignore (100%) rename {src => vendor}/linux/tools/build/Build.include (100%) rename {src => vendor}/linux/tools/build/Makefile.build (100%) rename {src => vendor}/linux/tools/build/feature/.gitignore (100%) rename {src => vendor}/linux/tools/cgroup/.gitignore (100%) rename {src => vendor}/linux/tools/laptop/dslm/.gitignore (100%) rename {src => vendor}/linux/tools/lguest/.gitignore (100%) rename {src => vendor}/linux/tools/lib/bpf/.gitignore (100%) rename {src => vendor}/linux/tools/lib/lockdep/.gitignore (100%) rename {src => vendor}/linux/tools/lib/traceevent/.gitignore (100%) rename {src => vendor}/linux/tools/lkl/.gitignore (100%) rename {src => vendor}/linux/tools/lkl/Makefile (100%) rename {src => vendor}/linux/tools/lkl/include/.gitignore (100%) rename {src => vendor}/linux/tools/lkl/include/lkl.h (100%) rename {src => vendor}/linux/tools/lkl/include/lkl_host.h (100%) rename {src => vendor}/linux/tools/lkl/lib/.gitignore (100%) rename {src => vendor}/linux/tools/lkl/lib/Build (100%) rename {src => vendor}/linux/tools/lkl/lib/dbg.c (100%) rename {src => vendor}/linux/tools/lkl/lib/dbg_handler.c (100%) rename {src => vendor}/linux/tools/lkl/lib/endian.h (100%) rename {src => vendor}/linux/tools/lkl/lib/fs.c (100%) rename {src => vendor}/linux/tools/lkl/lib/iomem.c (100%) rename {src => vendor}/linux/tools/lkl/lib/iomem.h (100%) rename {src => vendor}/linux/tools/lkl/lib/jmp_buf.c (100%) rename {src => vendor}/linux/tools/lkl/lib/jmp_buf.h (100%) rename {src => vendor}/linux/tools/lkl/lib/net.c (100%) rename {src => vendor}/linux/tools/lkl/lib/nt-host.c (100%) rename {src => vendor}/linux/tools/lkl/lib/posix-host.c (100%) rename {src => vendor}/linux/tools/lkl/lib/utils.c (100%) rename {src => vendor}/linux/tools/lkl/lib/virtio.c (100%) rename {src => vendor}/linux/tools/lkl/lib/virtio.h (100%) rename {src => vendor}/linux/tools/lkl/lib/virtio_blk.c (100%) rename {src => vendor}/linux/tools/lkl/lib/virtio_net.c (100%) rename {src => vendor}/linux/tools/lkl/lib/virtio_net_fd.c (100%) rename {src => vendor}/linux/tools/lkl/lib/virtio_net_fd.h (100%) rename {src => vendor}/linux/tools/lkl/lib/virtio_net_macvtap.c (100%) rename {src => vendor}/linux/tools/lkl/lib/virtio_net_raw.c (100%) rename {src => vendor}/linux/tools/lkl/lib/virtio_net_tap.c (100%) rename {src => vendor}/linux/tools/objtool/.gitignore (100%) rename {src => vendor}/linux/tools/pcmcia/.gitignore (100%) rename {src => vendor}/linux/tools/perf/.gitignore (100%) rename {src => vendor}/linux/tools/perf/tests/.gitignore (100%) rename {src => vendor}/linux/tools/power/cpupower/.gitignore (100%) rename {src => vendor}/linux/tools/power/x86/turbostat/.gitignore (100%) rename {src => vendor}/linux/tools/scripts/Makefile.include (100%) rename {src => vendor}/linux/tools/spi/.gitignore (100%) rename {src => vendor}/linux/tools/testing/radix-tree/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/breakpoints/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/capabilities/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/efivarfs/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/exec/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/filesystems/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/futex/functional/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/ia64/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/ipc/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/kcmp/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/media_tests/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/membarrier/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/memfd/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/mount/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/mqueue/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/net/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/networking/timestamping/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/alignment/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/benchmarks/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/context_switch/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/copyloops/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/copyloops/copyuser_64.S (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/copyloops/copyuser_power7.S (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/copyloops/memcpy_64.S (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/copyloops/memcpy_power7.S (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/dscr/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/math/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/mm/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/pmu/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/pmu/ebb/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/primitives/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/primitives/asm/asm-compat.h (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/primitives/word-at-a-time.h (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/signal/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/stringloops/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/stringloops/memcmp_64.S (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/switch_endian/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/syscalls/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/tm/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/vphn/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/vphn/vphn.c (100%) rename {src => vendor}/linux/tools/testing/selftests/powerpc/vphn/vphn.h (100%) rename {src => vendor}/linux/tools/testing/selftests/prctl/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/ptp/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/ptrace/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/rcutorture/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/seccomp/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/size/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/timers/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/vDSO/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/vm/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/watchdog/.gitignore (100%) rename {src => vendor}/linux/tools/testing/selftests/x86/.gitignore (100%) rename {src => vendor}/linux/tools/thermal/tmon/.gitignore (100%) rename {src => vendor}/linux/tools/usb/usbip/.gitignore (100%) rename {src => vendor}/linux/tools/virtio/.gitignore (100%) rename {src => vendor}/linux/tools/vm/.gitignore (100%) rename {src => vendor}/linux/usr/.gitignore (100%) rename {src => vendor}/linux/usr/Kconfig (100%) rename {src => vendor}/linux/usr/Makefile (100%) rename {src => vendor}/linux/virt/Makefile (100%) rename {src => vendor}/linux/virt/lib/Kconfig (100%) rename {src => vendor}/linux/virt/lib/Makefile (100%) diff --git a/binding.gyp b/binding.gyp index 332f2dc..cb0faaa 100644 --- a/binding.gyp +++ b/binding.gyp @@ -13,23 +13,23 @@ { 'action_name': "lkl_make", 'inputs': [ - "src/linux/**" + "vendor/linux/**" ], 'outputs': [ - "src/linux/tools/lkl/liblkl.a" + "vendor/linux/tools/lkl/liblkl.a" ], - 'action': [ 'make', '-j4', '-C', 'src/linux/tools/lkl', 'static' ], + 'action': [ 'make', '-j4', '-C', 'vendor/linux/tools/lkl', 'static' ], 'message': 'Compiling LKL kernel..' } ], "cflags_cc": [ '-fpermissive', '-Wno-pointer-arith' ], "defines": [ "CONFIG_AUTO_LKL_POSIX_HOST" ], "libraries": [ - "../src/linux/tools/lkl/liblkl.a" + "../vendor/linux/tools/lkl/liblkl.a" ], "include_dirs": [ " Date: Thu, 16 Feb 2017 17:09:27 +0100 Subject: [PATCH 2/2] Add support for iso9660 and udf. Change-Type: patch --- defconfig.patch | 14 + test/fixtures/test.iso | Bin 0 -> 358400 bytes test/fixtures/test.udf | Bin 0 -> 5242880 bytes test/index.js | 53 + vendor.sh | 1 + vendor/linux/arch/lkl/Kconfig | 8 +- vendor/linux/arch/lkl/Makefile | 3 +- vendor/linux/arch/lkl/defconfig | 4 + .../arch/lkl/include/uapi/asm/host_ops.h | 2 - .../arch/lkl/include/uapi/asm/syscalls.h | 1 + vendor/linux/arch/lkl/kernel/irq.c | 4 + vendor/linux/arch/lkl/kernel/setup.c | 12 +- vendor/linux/fs/isofs/Makefile | 10 + vendor/linux/fs/isofs/compress.c | 379 +++ vendor/linux/fs/isofs/dir.c | 283 ++ vendor/linux/fs/isofs/export.c | 192 ++ vendor/linux/fs/isofs/inode.c | 1557 ++++++++++ vendor/linux/fs/isofs/isofs.h | 198 ++ vendor/linux/fs/isofs/joliet.c | 69 + vendor/linux/fs/isofs/namei.c | 172 ++ vendor/linux/fs/isofs/rock.c | 806 ++++++ vendor/linux/fs/isofs/rock.h | 122 + vendor/linux/fs/isofs/util.c | 70 + vendor/linux/fs/isofs/zisofs.h | 21 + vendor/linux/fs/udf/Makefile | 9 + vendor/linux/fs/udf/balloc.c | 733 +++++ vendor/linux/fs/udf/dir.c | 208 ++ vendor/linux/fs/udf/directory.c | 240 ++ vendor/linux/fs/udf/ecma_167.h | 796 ++++++ vendor/linux/fs/udf/file.c | 282 ++ vendor/linux/fs/udf/ialloc.c | 133 + vendor/linux/fs/udf/inode.c | 2339 +++++++++++++++ vendor/linux/fs/udf/lowlevel.c | 67 + vendor/linux/fs/udf/misc.c | 298 ++ vendor/linux/fs/udf/namei.c | 1362 +++++++++ vendor/linux/fs/udf/osta_udf.h | 279 ++ vendor/linux/fs/udf/partition.c | 343 +++ vendor/linux/fs/udf/super.c | 2499 +++++++++++++++++ vendor/linux/fs/udf/symlink.c | 160 ++ vendor/linux/fs/udf/truncate.c | 286 ++ vendor/linux/fs/udf/udf_i.h | 62 + vendor/linux/fs/udf/udf_sb.h | 187 ++ vendor/linux/fs/udf/udfdecl.h | 251 ++ vendor/linux/fs/udf/udfend.h | 77 + vendor/linux/fs/udf/udftime.c | 170 ++ vendor/linux/fs/udf/unicode.c | 396 +++ vendor/linux/include/linux/crc-itu-t.h | 28 + vendor/linux/include/uapi/linux/iso_fs.h | 165 ++ vendor/linux/include/uapi/linux/udf_fs_i.h | 21 + vendor/linux/lib/crc-itu-t.c | 69 + vendor/linux/net/ipv4/tcp_bbr.c | 896 ++++++ vendor/linux/net/sched/sch_api.c | 1998 +++++++++++++ vendor/linux/net/sched/sch_blackhole.c | 45 + vendor/linux/net/sched/sch_fifo.c | 184 ++ vendor/linux/net/sched/sch_fq.c | 920 ++++++ vendor/linux/tools/lkl/include/lkl.h | 37 + vendor/linux/tools/lkl/lib/net.c | 64 + vendor/linux/tools/lkl/lib/utils.c | 56 + vendor/linux/tools/lkl/lib/virtio_net_tap.c | 6 +- 59 files changed, 19634 insertions(+), 13 deletions(-) create mode 100644 defconfig.patch create mode 100644 test/fixtures/test.iso create mode 100644 test/fixtures/test.udf mode change 100644 => 100755 vendor.sh create mode 100644 vendor/linux/fs/isofs/Makefile create mode 100644 vendor/linux/fs/isofs/compress.c create mode 100644 vendor/linux/fs/isofs/dir.c create mode 100644 vendor/linux/fs/isofs/export.c create mode 100644 vendor/linux/fs/isofs/inode.c create mode 100644 vendor/linux/fs/isofs/isofs.h create mode 100644 vendor/linux/fs/isofs/joliet.c create mode 100644 vendor/linux/fs/isofs/namei.c create mode 100644 vendor/linux/fs/isofs/rock.c create mode 100644 vendor/linux/fs/isofs/rock.h create mode 100644 vendor/linux/fs/isofs/util.c create mode 100644 vendor/linux/fs/isofs/zisofs.h create mode 100644 vendor/linux/fs/udf/Makefile create mode 100644 vendor/linux/fs/udf/balloc.c create mode 100644 vendor/linux/fs/udf/dir.c create mode 100644 vendor/linux/fs/udf/directory.c create mode 100644 vendor/linux/fs/udf/ecma_167.h create mode 100644 vendor/linux/fs/udf/file.c create mode 100644 vendor/linux/fs/udf/ialloc.c create mode 100644 vendor/linux/fs/udf/inode.c create mode 100644 vendor/linux/fs/udf/lowlevel.c create mode 100644 vendor/linux/fs/udf/misc.c create mode 100644 vendor/linux/fs/udf/namei.c create mode 100644 vendor/linux/fs/udf/osta_udf.h create mode 100644 vendor/linux/fs/udf/partition.c create mode 100644 vendor/linux/fs/udf/super.c create mode 100644 vendor/linux/fs/udf/symlink.c create mode 100644 vendor/linux/fs/udf/truncate.c create mode 100644 vendor/linux/fs/udf/udf_i.h create mode 100644 vendor/linux/fs/udf/udf_sb.h create mode 100644 vendor/linux/fs/udf/udfdecl.h create mode 100644 vendor/linux/fs/udf/udfend.h create mode 100644 vendor/linux/fs/udf/udftime.c create mode 100644 vendor/linux/fs/udf/unicode.c create mode 100644 vendor/linux/include/linux/crc-itu-t.h create mode 100644 vendor/linux/include/uapi/linux/iso_fs.h create mode 100644 vendor/linux/include/uapi/linux/udf_fs_i.h create mode 100644 vendor/linux/lib/crc-itu-t.c create mode 100644 vendor/linux/net/ipv4/tcp_bbr.c create mode 100644 vendor/linux/net/sched/sch_api.c create mode 100644 vendor/linux/net/sched/sch_blackhole.c create mode 100644 vendor/linux/net/sched/sch_fifo.c create mode 100644 vendor/linux/net/sched/sch_fq.c diff --git a/defconfig.patch b/defconfig.patch new file mode 100644 index 0000000..de6b217 --- /dev/null +++ b/defconfig.patch @@ -0,0 +1,14 @@ +diff --git a/linux-tmp/arch/lkl/defconfig b/linux-tmp/arch/lkl/defconfig +--- a/linux-tmp/arch/lkl/defconfig ++++ b/linux-tmp/arch/lkl/defconfig +@@ -33,6 +33,10 @@ CONFIG_XFS_FS=y + CONFIG_XFS_POSIX_ACL=y + CONFIG_BTRFS_FS=y + CONFIG_BTRFS_FS_POSIX_ACL=y ++CONFIG_ISO9660_FS=y ++CONFIG_JOLIET=y ++CONFIG_ZISOFS=y ++CONFIG_UDF_FS=y + # CONFIG_FILE_LOCKING is not set + # CONFIG_DNOTIFY is not set + # CONFIG_INOTIFY_USER is not set diff --git a/test/fixtures/test.iso b/test/fixtures/test.iso new file mode 100644 index 0000000000000000000000000000000000000000..11572db4e1ddb05cb3fdbe1ad9fc643faed28c45 GIT binary patch literal 358400 zcmeI(O>YuG7y#herU$GClNv*h6Hl5bT`&cSCjwha<-@Qvu_q6vN85w-w|MMN@b0hj zA1KR*CSvtOEaZ8UWrmq|H?vPB5H`Fa2m%BM5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV45#cha<)gnn;$_BP%g?ap{KxP3Y5Pj__TBH!OQ0EPH|#!eiZ*zpqmYQ`KUK&b+b6_#Adyo9-bWM z@wnH|^7DL>4PtwowI-u+eA0dztIg(%m{rb4XTxr%)z6lLjpwyAt;f^Ko2)g?N5jL@ zO5Q%{^{2bCJIg7ii=0NBZp7EUNt|S@zir3$sMOMGBdw*)>d{frrn@Tx>2DEMGLo>K zwYlo12+Tjzyb`zr0^b+k|94<1mOy|20RjXF5FkK+009C72&_pUnLT5lK1~+{2oNAZ zfB*pk1PBlyK!Cv33e0}_my5sC2?7KN5FkK+009C72oNAZU|R+LU1Rs>jONbID!k-b zIGFPs?9bc%MV;RCT~ViZKOYUUchi!v%B$+OI=U|c1PBlyut@?RuRdJF_g9zK7nj%Z z+s)^%i(>pux(90|K!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U MAV7csf$bOg0mF>Qy8r+H literal 0 HcmV?d00001 diff --git a/test/fixtures/test.udf b/test/fixtures/test.udf new file mode 100644 index 0000000000000000000000000000000000000000..3bd22041d4757799cb616c5c429790b41176a337 GIT binary patch literal 5242880 zcmeF)Pj3`u9Ki8s+tNP?F^ecC#o>T|Q0o9OfdtKhKw?60L&2-tmR72zUE4x9ZsN(? zz61LLJTx%|Zq}Q}UiDOO9`_ySGuvNDH3SHaP~8kht{uK})K!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1a>1ZkOtGwsg`~j?$vTq>ZDYUZjSBdp52xJ0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&=KLWKhnC_-pS~=6J)oUrQZ7rjh<`!<w|Qrf5zst<0^=EiTjswq7|@`%}-)=&yq*mHEQPSiZtSfB*pk1hT-sJpX@_ zXTG;S>eXJ(b42y_w3;{4yO$@flqajThcDG!`wW($JZ3A8-L1yn>vQ%q@G&F-0t5&U zc$mOQp8wy=Gya=*%XBbL{KI+U{vqlcBk5pu!#nx)K=pzkw^z;eoxDZ$KC-&({bYu) z5FkK+0DbdaKk&at9+-zg zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjY`V}Y^!{l6#k z_y7L>)9wCwWz*Jq>0jUf(z&BMzYh4&BlfY{c0B)lmwz7ToP5>x)v0)E1J$3rVj)0) z009C7o|-`Q{r_*o_x~T+IpIIGM_?cV1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FoG@ z1qRa(`TW0QKi(TGtMmUJyLSF!G0~n}np^m?xH>sCKhuBEwSl31)yh);Qc8d2rIEL< z+KjfM?Pw?3jjl%5qU+I(=w`GRO#@r^Uyl~iGTMkXqpfH=+KG0ftI@USdUPYY8SO>$ zsge8pSC1CaGTMkXqpfH=+KG0ftI@USdUPYY8SO>WP>dffqGhxZZAM$scC-`iMpvV2 z(e>y?bTitEru>Xo&u=|iM9XL++KjfM?Pw?3jjl%5qU+I(=w`GRO~WyMw1}3`Mzk4i zMcdI%v>RQGu0_|Q8_~^ZFPcVT{Adv^qm5`Y+KRTLooF|@8eNO7M>nFI(Oxu-#`w`9 zT1FeuX0C+*0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5*B-QNAh)>+nZ0Ds=oZau974j{Nl#Y3bDWgCYv;vk?U z+lnLuD&4rzgmzuWs$JW(o0No$nivzWY`pNwi-kzMZDNeXL^Cch^M=$*qA{I{fp}B@ zTsxoloZp#evaEF*!j{ildcM#5zR&Z%@AG++{m!4}K!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0Ro#5s1{x6rc_+$x}00L<==muFMs~fd_3P=E_Bf#K!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pkH=aPzm42Cu^xMCz7qvXQ#oD=^N^fnT ze_QQ9C3WRJsrh?h;?Ip9da}N6_Qc%$nMQ z{XV4Kz3Icf{@&`o*|}Hdr(QaK@{%*?t3G*T;pF`I#HDwq-c(Jg(K&RmdBGX1i9S6w zKGPgpR609#wDb6S$Eqd)0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PE+S zps(mk`%;na`PH7H9z(iw7Af7-TJ4IhDZTz`b9-}rI<~g6-D$CQuBXyl8|dFwJFuB{ zd)$UOcyMaw)MEYc{^8-#j?Ud%I#!}tUQ?0h_4_=F$Bu4K^>RJ+rBqGLc64h-+3%}) z@0P#siGH=a%6>zgolAEp#!rqPnVzhV&W%q@UewPD0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5(LuL6BVSNdlv(vN?)r_zW?bmuHmDkCpl zt;mnB_oq~ewdvfUT-w=M%a65lJ(b?tXL|PSe5T#rddrqaTkV?%`nS~%T(tedzzrIM z2d8FEE!Ge3A08g<=-R!dV zRX$Pn8;MS}W>%+X7fwEKZ1&X5(ehY%%#ZSzn|JJpG2M4|9<$Z1rG+$`PNd0HPsh?! znl4*kF2{a1kNwR=`+VIuUux{}bSjm<`R9tqJdw|H&)eu5$j5M6WxVSsU0fkn+!tfph1-m+ng|c}_diN^alZaWqW=1PBngegw+;Kal_Z zANfg|Ed4q*}jQ+HS7N^1NVP@`(V`h{%z0S7VQsikEanEA9#cMf9u9a z(1QR00t5&U2!XQxKbPzO$`8+`-LdT&)c=R?_|(3GQUCAS`<1<)Znbau!1ilZ|8H|g z2@oJafB=C_3zYT$wOs%I_LH;e;TU!G^}p7e4jkHY(fj9apu zPa`q9J7&5wM?!A;!t!U+1??$8TCqRGz0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyaH9!yr9-Jmy+3`UYqdAeZSe5^ z;ri&@`25t&OZ7wJN2Vv66D}&qawYOiYcjz!KzE=4X!o{n6JJQKMZxfZz|nYPCHBkPfk$f3xQ$g#+|$fd~T z$kUN4k!K=TBiAC=BU4YDKe8U#h#ZO>i5!cZi(HCajyxT?5_u+aHF7O-Ju+3}{E_v@ zM&wZBNKOj@0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pkS1(YcuJrv>q?3=Y z7i+yKw^~c};MB~i#l!oDFMW#MBKNH1v1R}AxBAH5M<@199NByMahE>Y)o;BuJvVyj z$@;$86La&E3k#D+>xXBiCT5RLZu-zyJN~~pHE~Qk@7g`xgd5-1uM(4)o$B#@;)st!ED9d}{fQp6yDhkylpp z{k0GvK!5;&QeaE2|4--2_k}0ci$CW2P`*5E*1-p!9euv>@Wx1Gt^Ej=?tIR%eD3A) z+#mOv{So*$B>@5i2oSiOKu@m!-MQj_{^yPKr(FNH=FZKxsE_xg+slEA`T0Qkgdpd7 zS?iZ_kMeb7x$gC3hOiJIK!5;&>rbFN*Z-Gu{eR<~_2SRDo|mtyTkk6$e4+mI%(2;y zDYf5MzTQ6{Xnj7>{%F4b(5}X=#*y6}6HV#P=u^JI-rT=);#&*#`*t@PyB{q7d-VR4 z?x{XLUH*~8i}@4&q2qIt3*VTZ-F0kY*YUYs6SF72)I8qZ-kZ3{)d~Ru1PFXg1gg3I z|F!v!|9bJR*Yh8fyW%nk5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNA};|Ww!SNe4-(wke?i}SsC YeoHCUidL?b>lOk82oNAZ;D!_UH$hQ6_5c6? literal 0 HcmV?d00001 diff --git a/test/index.js b/test/index.js index 6498a69..ae71923 100644 --- a/test/index.js +++ b/test/index.js @@ -11,6 +11,8 @@ lkl.fs = Promise.promisifyAll(lkl.fs); const RAW_FS_PATH = path.join(__dirname, 'fixtures/test.ext4'); const TMP_RAW_FS_PATH = path.join(__dirname, '.tmp-test.ext4'); const DISK_PATH = path.join(__dirname, 'fixtures/disk.img'); +const ISO_FS_PATH = path.join(__dirname, 'fixtures/test.iso'); +const UDF_FS_PATH = path.join(__dirname, 'fixtures/test.udf'); describe('node-lkl', function() { it('should start the kernel', function() { @@ -127,6 +129,57 @@ describe('node-lkl', function() { }) }); }); + + describe('iso9660 image', function() { + before(function() { + this.disk = new lkl.disk.FileDisk(ISO_FS_PATH); + }); + + it('should mount', function() { + let diskId; + return lkl.diskAddAsync(this.disk) + .then(function(id) { + diskId = id; + return lkl.mountAsync(diskId, { readOnly: true, filesystem: 'iso9660'}) + }) + .then(lkl.umountAsync) + .then(function() { + return lkl.diskRemoveAsync(diskId); + }); + }); + }); + + describe('udf image', function() { + before(function() { + this.disk = new lkl.disk.FileDisk(UDF_FS_PATH); + }); + + it('should mount', function() { + let diskId; + let mpoint; + return lkl.diskAddAsync(this.disk) + .then(function(id) { + diskId = id; + return lkl.mountAsync(diskId, { readOnly: true, filesystem: 'udf'}) + }) + .then(function(mp) { + mpoint = mp; + return lkl.fs.readdirAsync(mp); + }) + .then(function(files) { + assert.deepEqual( + files.sort(), + [ 'lost+found', '┬──┬◡ノ(° -°ノ)' ] + ) + }) + .then(function() { + return lkl.umountAsync(mpoint); + }) + .then(function() { + return lkl.diskRemoveAsync(diskId); + }); + }); + }); }); describe('fs', function() { diff --git a/vendor.sh b/vendor.sh old mode 100644 new mode 100755 index 0496c91..0112b4c --- a/vendor.sh +++ b/vendor.sh @@ -3,6 +3,7 @@ set -o errexit git clone https://github.com/lkl/linux.git --depth=1 --branch master linux-tmp +git apply defconfig.patch # Reset all access times to be in the past find linux-tmp | xargs touch -a -d 2015-01-01 diff --git a/vendor/linux/arch/lkl/Kconfig b/vendor/linux/arch/lkl/Kconfig index 568364a..84228a1 100644 --- a/vendor/linux/arch/lkl/Kconfig +++ b/vendor/linux/arch/lkl/Kconfig @@ -4,11 +4,7 @@ config LKL select ARCH_THREAD_STACK_ALLOCATOR select RWSEM_GENERIC_SPINLOCK select GENERIC_ATOMIC64 - select SEMAPHORE_SLEEPERS - select GENERIC_TIME - select GENERIC_FIND_NEXT_BIT select GENERIC_HWEIGHT - select GENERIC_HARDIRQS select FLATMEM select FLAT_NODE_MEM_MAP select GENERIC_CLOCKEVENTS @@ -23,6 +19,10 @@ config LKL select 64BIT if OUTPUT_FORMAT = "elf64-x86-64-freebsd" select IP_PNP select IP_PNP_DHCP + select TCP_CONG_BBR + select HIGH_RES_TIMERS + select NET_SCHED + select NET_SCH_FQ config OUTPUTFORMAT string diff --git a/vendor/linux/arch/lkl/Makefile b/vendor/linux/arch/lkl/Makefile index 84efa75..4208f99 100644 --- a/vendor/linux/arch/lkl/Makefile +++ b/vendor/linux/arch/lkl/Makefile @@ -22,8 +22,7 @@ endif LDFLAGS_vmlinux += -r LKL_ENTRY_POINTS := lkl_start_kernel lkl_sys_halt lkl_syscall lkl_trigger_irq \ - lkl_get_free_irq lkl_put_irq lkl_create_syscall_thread \ - lkl_stop_syscall_thread lkl_is_running + lkl_get_free_irq lkl_put_irq lkl_is_running core-y += arch/lkl/kernel/ core-y += arch/lkl/mm/ diff --git a/vendor/linux/arch/lkl/defconfig b/vendor/linux/arch/lkl/defconfig index f91380b..c999620 100644 --- a/vendor/linux/arch/lkl/defconfig +++ b/vendor/linux/arch/lkl/defconfig @@ -33,6 +33,10 @@ CONFIG_XFS_FS=y CONFIG_XFS_POSIX_ACL=y CONFIG_BTRFS_FS=y CONFIG_BTRFS_FS_POSIX_ACL=y +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_UDF_FS=y # CONFIG_FILE_LOCKING is not set # CONFIG_DNOTIFY is not set # CONFIG_INOTIFY_USER is not set diff --git a/vendor/linux/arch/lkl/include/uapi/asm/host_ops.h b/vendor/linux/arch/lkl/include/uapi/asm/host_ops.h index d5de01b..0bf8b2b 100644 --- a/vendor/linux/arch/lkl/include/uapi/asm/host_ops.h +++ b/vendor/linux/arch/lkl/include/uapi/asm/host_ops.h @@ -135,12 +135,10 @@ struct lkl_host_operations { * The function returns only after the kernel is shutdown with lkl_sys_halt. * * @lkl_ops - pointer to host operations - * @mem_size - how much memory to allocate to the Linux kernel * @cmd_line - format for command line string that is going to be used to * generate the Linux kernel command line */ int lkl_start_kernel(struct lkl_host_operations *lkl_ops, - unsigned long mem_size, const char *cmd_line, ...); /** diff --git a/vendor/linux/arch/lkl/include/uapi/asm/syscalls.h b/vendor/linux/arch/lkl/include/uapi/asm/syscalls.h index 0fc87b8..731cc1a 100644 --- a/vendor/linux/arch/lkl/include/uapi/asm/syscalls.h +++ b/vendor/linux/arch/lkl/include/uapi/asm/syscalls.h @@ -128,6 +128,7 @@ struct sockaddr { #include #include #include +#include struct user_msghdr { void __user *msg_name; /* ptr to socket address structure */ diff --git a/vendor/linux/arch/lkl/kernel/irq.c b/vendor/linux/arch/lkl/kernel/irq.c index b5dbbaa..4e374e5 100644 --- a/vendor/linux/arch/lkl/kernel/irq.c +++ b/vendor/linux/arch/lkl/kernel/irq.c @@ -52,15 +52,19 @@ static struct irq_info { static bool irqs_enabled; +static struct pt_regs dummy; + static void run_irq(int irq) { unsigned long flags; + struct pt_regs *old_regs = set_irq_regs((struct pt_regs *)&dummy); /* interrupt handlers need to run with interrupts disabled */ local_irq_save(flags); irq_enter(); generic_handle_irq(irq); irq_exit(); + set_irq_regs(old_regs); local_irq_restore(flags); } diff --git a/vendor/linux/arch/lkl/kernel/setup.c b/vendor/linux/arch/lkl/kernel/setup.c index d6da246..a7206d0 100644 --- a/vendor/linux/arch/lkl/kernel/setup.c +++ b/vendor/linux/arch/lkl/kernel/setup.c @@ -18,7 +18,7 @@ static char cmd_line[COMMAND_LINE_SIZE]; static void *init_sem; static int is_running; void (*pm_power_off)(void) = NULL; -static unsigned long mem_size; +static unsigned long mem_size = 64 * 1024 * 1024; long lkl_panic_blink(int state) { @@ -26,10 +26,18 @@ long lkl_panic_blink(int state) return 0; } +static int __init setup_mem_size(char *str) +{ + mem_size = memparse(str, NULL); + return 0; +} +early_param("mem", setup_mem_size); + void __init setup_arch(char **cl) { *cl = cmd_line; panic_blink = lkl_panic_blink; + parse_early_param(); bootmem_init(mem_size); } @@ -41,14 +49,12 @@ static void __init lkl_run_kernel(void *arg) } int __init lkl_start_kernel(struct lkl_host_operations *ops, - unsigned long _mem_size, const char *fmt, ...) { va_list ap; int ret; lkl_ops = ops; - mem_size = _mem_size; va_start(ap, fmt); ret = vsnprintf(boot_command_line, COMMAND_LINE_SIZE, fmt, ap); diff --git a/vendor/linux/fs/isofs/Makefile b/vendor/linux/fs/isofs/Makefile new file mode 100644 index 0000000..bf162f0 --- /dev/null +++ b/vendor/linux/fs/isofs/Makefile @@ -0,0 +1,10 @@ +# +# Makefile for the Linux isofs filesystem routines. +# + +obj-$(CONFIG_ISO9660_FS) += isofs.o + +isofs-objs-y := namei.o inode.o dir.o util.o rock.o export.o +isofs-objs-$(CONFIG_JOLIET) += joliet.o +isofs-objs-$(CONFIG_ZISOFS) += compress.o +isofs-objs := $(isofs-objs-y) diff --git a/vendor/linux/fs/isofs/compress.c b/vendor/linux/fs/isofs/compress.c new file mode 100644 index 0000000..44af14b --- /dev/null +++ b/vendor/linux/fs/isofs/compress.c @@ -0,0 +1,379 @@ +/* -*- linux-c -*- ------------------------------------------------------- * + * + * Copyright 2001 H. Peter Anvin - All Rights Reserved + * + * This program 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, Inc., 675 Mass Ave, Cambridge MA 02139, + * USA; either version 2 of the License, or (at your option) any later + * version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ + +/* + * linux/fs/isofs/compress.c + * + * Transparent decompression of files on an iso9660 filesystem + */ + +#include +#include + +#include +#include + +#include "isofs.h" +#include "zisofs.h" + +/* This should probably be global. */ +static char zisofs_sink_page[PAGE_SIZE]; + +/* + * This contains the zlib memory allocation and the mutex for the + * allocation; this avoids failures at block-decompression time. + */ +static void *zisofs_zlib_workspace; +static DEFINE_MUTEX(zisofs_zlib_lock); + +/* + * Read data of @inode from @block_start to @block_end and uncompress + * to one zisofs block. Store the data in the @pages array with @pcount + * entries. Start storing at offset @poffset of the first page. + */ +static loff_t zisofs_uncompress_block(struct inode *inode, loff_t block_start, + loff_t block_end, int pcount, + struct page **pages, unsigned poffset, + int *errp) +{ + unsigned int zisofs_block_shift = ISOFS_I(inode)->i_format_parm[1]; + unsigned int bufsize = ISOFS_BUFFER_SIZE(inode); + unsigned int bufshift = ISOFS_BUFFER_BITS(inode); + unsigned int bufmask = bufsize - 1; + int i, block_size = block_end - block_start; + z_stream stream = { .total_out = 0, + .avail_in = 0, + .avail_out = 0, }; + int zerr; + int needblocks = (block_size + (block_start & bufmask) + bufmask) + >> bufshift; + int haveblocks; + blkcnt_t blocknum; + struct buffer_head *bhs[needblocks + 1]; + int curbh, curpage; + + if (block_size > deflateBound(1UL << zisofs_block_shift)) { + *errp = -EIO; + return 0; + } + /* Empty block? */ + if (block_size == 0) { + for ( i = 0 ; i < pcount ; i++ ) { + if (!pages[i]) + continue; + memset(page_address(pages[i]), 0, PAGE_SIZE); + flush_dcache_page(pages[i]); + SetPageUptodate(pages[i]); + } + return ((loff_t)pcount) << PAGE_SHIFT; + } + + /* Because zlib is not thread-safe, do all the I/O at the top. */ + blocknum = block_start >> bufshift; + memset(bhs, 0, (needblocks + 1) * sizeof(struct buffer_head *)); + haveblocks = isofs_get_blocks(inode, blocknum, bhs, needblocks); + ll_rw_block(REQ_OP_READ, 0, haveblocks, bhs); + + curbh = 0; + curpage = 0; + /* + * First block is special since it may be fractional. We also wait for + * it before grabbing the zlib mutex; odds are that the subsequent + * blocks are going to come in in short order so we don't hold the zlib + * mutex longer than necessary. + */ + + if (!bhs[0]) + goto b_eio; + + wait_on_buffer(bhs[0]); + if (!buffer_uptodate(bhs[0])) { + *errp = -EIO; + goto b_eio; + } + + stream.workspace = zisofs_zlib_workspace; + mutex_lock(&zisofs_zlib_lock); + + zerr = zlib_inflateInit(&stream); + if (zerr != Z_OK) { + if (zerr == Z_MEM_ERROR) + *errp = -ENOMEM; + else + *errp = -EIO; + printk(KERN_DEBUG "zisofs: zisofs_inflateInit returned %d\n", + zerr); + goto z_eio; + } + + while (curpage < pcount && curbh < haveblocks && + zerr != Z_STREAM_END) { + if (!stream.avail_out) { + if (pages[curpage]) { + stream.next_out = page_address(pages[curpage]) + + poffset; + stream.avail_out = PAGE_SIZE - poffset; + poffset = 0; + } else { + stream.next_out = (void *)&zisofs_sink_page; + stream.avail_out = PAGE_SIZE; + } + } + if (!stream.avail_in) { + wait_on_buffer(bhs[curbh]); + if (!buffer_uptodate(bhs[curbh])) { + *errp = -EIO; + break; + } + stream.next_in = bhs[curbh]->b_data + + (block_start & bufmask); + stream.avail_in = min_t(unsigned, bufsize - + (block_start & bufmask), + block_size); + block_size -= stream.avail_in; + block_start = 0; + } + + while (stream.avail_out && stream.avail_in) { + zerr = zlib_inflate(&stream, Z_SYNC_FLUSH); + if (zerr == Z_BUF_ERROR && stream.avail_in == 0) + break; + if (zerr == Z_STREAM_END) + break; + if (zerr != Z_OK) { + /* EOF, error, or trying to read beyond end of input */ + if (zerr == Z_MEM_ERROR) + *errp = -ENOMEM; + else { + printk(KERN_DEBUG + "zisofs: zisofs_inflate returned" + " %d, inode = %lu," + " page idx = %d, bh idx = %d," + " avail_in = %ld," + " avail_out = %ld\n", + zerr, inode->i_ino, curpage, + curbh, stream.avail_in, + stream.avail_out); + *errp = -EIO; + } + goto inflate_out; + } + } + + if (!stream.avail_out) { + /* This page completed */ + if (pages[curpage]) { + flush_dcache_page(pages[curpage]); + SetPageUptodate(pages[curpage]); + } + curpage++; + } + if (!stream.avail_in) + curbh++; + } +inflate_out: + zlib_inflateEnd(&stream); + +z_eio: + mutex_unlock(&zisofs_zlib_lock); + +b_eio: + for (i = 0; i < haveblocks; i++) + brelse(bhs[i]); + return stream.total_out; +} + +/* + * Uncompress data so that pages[full_page] is fully uptodate and possibly + * fills in other pages if we have data for them. + */ +static int zisofs_fill_pages(struct inode *inode, int full_page, int pcount, + struct page **pages) +{ + loff_t start_off, end_off; + loff_t block_start, block_end; + unsigned int header_size = ISOFS_I(inode)->i_format_parm[0]; + unsigned int zisofs_block_shift = ISOFS_I(inode)->i_format_parm[1]; + unsigned int blockptr; + loff_t poffset = 0; + blkcnt_t cstart_block, cend_block; + struct buffer_head *bh; + unsigned int blkbits = ISOFS_BUFFER_BITS(inode); + unsigned int blksize = 1 << blkbits; + int err; + loff_t ret; + + BUG_ON(!pages[full_page]); + + /* + * We want to read at least 'full_page' page. Because we have to + * uncompress the whole compression block anyway, fill the surrounding + * pages with the data we have anyway... + */ + start_off = page_offset(pages[full_page]); + end_off = min_t(loff_t, start_off + PAGE_SIZE, inode->i_size); + + cstart_block = start_off >> zisofs_block_shift; + cend_block = (end_off + (1 << zisofs_block_shift) - 1) + >> zisofs_block_shift; + + WARN_ON(start_off - (full_page << PAGE_SHIFT) != + ((cstart_block << zisofs_block_shift) & PAGE_MASK)); + + /* Find the pointer to this specific chunk */ + /* Note: we're not using isonum_731() here because the data is known aligned */ + /* Note: header_size is in 32-bit words (4 bytes) */ + blockptr = (header_size + cstart_block) << 2; + bh = isofs_bread(inode, blockptr >> blkbits); + if (!bh) + return -EIO; + block_start = le32_to_cpu(*(__le32 *) + (bh->b_data + (blockptr & (blksize - 1)))); + + while (cstart_block < cend_block && pcount > 0) { + /* Load end of the compressed block in the file */ + blockptr += 4; + /* Traversed to next block? */ + if (!(blockptr & (blksize - 1))) { + brelse(bh); + + bh = isofs_bread(inode, blockptr >> blkbits); + if (!bh) + return -EIO; + } + block_end = le32_to_cpu(*(__le32 *) + (bh->b_data + (blockptr & (blksize - 1)))); + if (block_start > block_end) { + brelse(bh); + return -EIO; + } + err = 0; + ret = zisofs_uncompress_block(inode, block_start, block_end, + pcount, pages, poffset, &err); + poffset += ret; + pages += poffset >> PAGE_SHIFT; + pcount -= poffset >> PAGE_SHIFT; + full_page -= poffset >> PAGE_SHIFT; + poffset &= ~PAGE_MASK; + + if (err) { + brelse(bh); + /* + * Did we finish reading the page we really wanted + * to read? + */ + if (full_page < 0) + return 0; + return err; + } + + block_start = block_end; + cstart_block++; + } + + if (poffset && *pages) { + memset(page_address(*pages) + poffset, 0, + PAGE_SIZE - poffset); + flush_dcache_page(*pages); + SetPageUptodate(*pages); + } + return 0; +} + +/* + * When decompressing, we typically obtain more than one page + * per reference. We inject the additional pages into the page + * cache as a form of readahead. + */ +static int zisofs_readpage(struct file *file, struct page *page) +{ + struct inode *inode = file_inode(file); + struct address_space *mapping = inode->i_mapping; + int err; + int i, pcount, full_page; + unsigned int zisofs_block_shift = ISOFS_I(inode)->i_format_parm[1]; + unsigned int zisofs_pages_per_cblock = + PAGE_SHIFT <= zisofs_block_shift ? + (1 << (zisofs_block_shift - PAGE_SHIFT)) : 0; + struct page *pages[max_t(unsigned, zisofs_pages_per_cblock, 1)]; + pgoff_t index = page->index, end_index; + + end_index = (inode->i_size + PAGE_SIZE - 1) >> PAGE_SHIFT; + /* + * If this page is wholly outside i_size we just return zero; + * do_generic_file_read() will handle this for us + */ + if (index >= end_index) { + SetPageUptodate(page); + unlock_page(page); + return 0; + } + + if (PAGE_SHIFT <= zisofs_block_shift) { + /* We have already been given one page, this is the one + we must do. */ + full_page = index & (zisofs_pages_per_cblock - 1); + pcount = min_t(int, zisofs_pages_per_cblock, + end_index - (index & ~(zisofs_pages_per_cblock - 1))); + index -= full_page; + } else { + full_page = 0; + pcount = 1; + } + pages[full_page] = page; + + for (i = 0; i < pcount; i++, index++) { + if (i != full_page) + pages[i] = grab_cache_page_nowait(mapping, index); + if (pages[i]) { + ClearPageError(pages[i]); + kmap(pages[i]); + } + } + + err = zisofs_fill_pages(inode, full_page, pcount, pages); + + /* Release any residual pages, do not SetPageUptodate */ + for (i = 0; i < pcount; i++) { + if (pages[i]) { + flush_dcache_page(pages[i]); + if (i == full_page && err) + SetPageError(pages[i]); + kunmap(pages[i]); + unlock_page(pages[i]); + if (i != full_page) + put_page(pages[i]); + } + } + + /* At this point, err contains 0 or -EIO depending on the "critical" page */ + return err; +} + +const struct address_space_operations zisofs_aops = { + .readpage = zisofs_readpage, + /* No bmap operation supported */ +}; + +int __init zisofs_init(void) +{ + zisofs_zlib_workspace = vmalloc(zlib_inflate_workspacesize()); + if ( !zisofs_zlib_workspace ) + return -ENOMEM; + + return 0; +} + +void zisofs_cleanup(void) +{ + vfree(zisofs_zlib_workspace); +} diff --git a/vendor/linux/fs/isofs/dir.c b/vendor/linux/fs/isofs/dir.c new file mode 100644 index 0000000..e759961 --- /dev/null +++ b/vendor/linux/fs/isofs/dir.c @@ -0,0 +1,283 @@ +/* + * linux/fs/isofs/dir.c + * + * (C) 1992, 1993, 1994 Eric Youngdale Modified for ISO 9660 filesystem. + * + * (C) 1991 Linus Torvalds - minix filesystem + * + * Steve Beynon : Missing last directory entries fixed + * (stephen@askone.demon.co.uk) : 21st June 1996 + * + * isofs directory handling functions + */ +#include +#include "isofs.h" + +int isofs_name_translate(struct iso_directory_record *de, char *new, struct inode *inode) +{ + char * old = de->name; + int len = de->name_len[0]; + int i; + + for (i = 0; i < len; i++) { + unsigned char c = old[i]; + if (!c) + break; + + if (c >= 'A' && c <= 'Z') + c |= 0x20; /* lower case */ + + /* Drop trailing '.;1' (ISO 9660:1988 7.5.1 requires period) */ + if (c == '.' && i == len - 3 && old[i + 1] == ';' && old[i + 2] == '1') + break; + + /* Drop trailing ';1' */ + if (c == ';' && i == len - 2 && old[i + 1] == '1') + break; + + /* Convert remaining ';' to '.' */ + /* Also '/' to '.' (broken Acorn-generated ISO9660 images) */ + if (c == ';' || c == '/') + c = '.'; + + new[i] = c; + } + return i; +} + +/* Acorn extensions written by Matthew Wilcox 1998 */ +int get_acorn_filename(struct iso_directory_record *de, + char *retname, struct inode *inode) +{ + int std; + unsigned char *chr; + int retnamlen = isofs_name_translate(de, retname, inode); + + if (retnamlen == 0) + return 0; + std = sizeof(struct iso_directory_record) + de->name_len[0]; + if (std & 1) + std++; + if (de->length[0] - std != 32) + return retnamlen; + chr = ((unsigned char *) de) + std; + if (strncmp(chr, "ARCHIMEDES", 10)) + return retnamlen; + if ((*retname == '_') && ((chr[19] & 1) == 1)) + *retname = '!'; + if (((de->flags[0] & 2) == 0) && (chr[13] == 0xff) + && ((chr[12] & 0xf0) == 0xf0)) { + retname[retnamlen] = ','; + sprintf(retname+retnamlen+1, "%3.3x", + ((chr[12] & 0xf) << 8) | chr[11]); + retnamlen += 4; + } + return retnamlen; +} + +/* + * This should _really_ be cleaned up some day.. + */ +static int do_isofs_readdir(struct inode *inode, struct file *file, + struct dir_context *ctx, + char *tmpname, struct iso_directory_record *tmpde) +{ + unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); + unsigned char bufbits = ISOFS_BUFFER_BITS(inode); + unsigned long block, offset, block_saved, offset_saved; + unsigned long inode_number = 0; /* Quiet GCC */ + struct buffer_head *bh = NULL; + int len; + int map; + int first_de = 1; + char *p = NULL; /* Quiet GCC */ + struct iso_directory_record *de; + struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb); + + offset = ctx->pos & (bufsize - 1); + block = ctx->pos >> bufbits; + + while (ctx->pos < inode->i_size) { + int de_len; + + if (!bh) { + bh = isofs_bread(inode, block); + if (!bh) + return 0; + } + + de = (struct iso_directory_record *) (bh->b_data + offset); + + de_len = *(unsigned char *)de; + + /* + * If the length byte is zero, we should move on to the next + * CDROM sector. If we are at the end of the directory, we + * kick out of the while loop. + */ + + if (de_len == 0) { + brelse(bh); + bh = NULL; + ctx->pos = (ctx->pos + ISOFS_BLOCK_SIZE) & ~(ISOFS_BLOCK_SIZE - 1); + block = ctx->pos >> bufbits; + offset = 0; + continue; + } + + block_saved = block; + offset_saved = offset; + offset += de_len; + + /* Make sure we have a full directory entry */ + if (offset >= bufsize) { + int slop = bufsize - offset + de_len; + memcpy(tmpde, de, slop); + offset &= bufsize - 1; + block++; + brelse(bh); + bh = NULL; + if (offset) { + bh = isofs_bread(inode, block); + if (!bh) + return 0; + memcpy((void *) tmpde + slop, bh->b_data, offset); + } + de = tmpde; + } + /* Basic sanity check, whether name doesn't exceed dir entry */ + if (de_len < de->name_len[0] + + sizeof(struct iso_directory_record)) { + printk(KERN_NOTICE "iso9660: Corrupted directory entry" + " in block %lu of inode %lu\n", block, + inode->i_ino); + return -EIO; + } + + if (first_de) { + isofs_normalize_block_and_offset(de, + &block_saved, + &offset_saved); + inode_number = isofs_get_ino(block_saved, + offset_saved, bufbits); + } + + if (de->flags[-sbi->s_high_sierra] & 0x80) { + first_de = 0; + ctx->pos += de_len; + continue; + } + first_de = 1; + + /* Handle the case of the '.' directory */ + if (de->name_len[0] == 1 && de->name[0] == 0) { + if (!dir_emit_dot(file, ctx)) + break; + ctx->pos += de_len; + continue; + } + + len = 0; + + /* Handle the case of the '..' directory */ + if (de->name_len[0] == 1 && de->name[0] == 1) { + if (!dir_emit_dotdot(file, ctx)) + break; + ctx->pos += de_len; + continue; + } + + /* Handle everything else. Do name translation if there + is no Rock Ridge NM field. */ + + /* + * Do not report hidden files if so instructed, or associated + * files unless instructed to do so + */ + if ((sbi->s_hide && (de->flags[-sbi->s_high_sierra] & 1)) || + (!sbi->s_showassoc && + (de->flags[-sbi->s_high_sierra] & 4))) { + ctx->pos += de_len; + continue; + } + + map = 1; + if (sbi->s_rock) { + len = get_rock_ridge_filename(de, tmpname, inode); + if (len != 0) { /* may be -1 */ + p = tmpname; + map = 0; + } + } + if (map) { +#ifdef CONFIG_JOLIET + if (sbi->s_joliet_level) { + len = get_joliet_filename(de, tmpname, inode); + p = tmpname; + } else +#endif + if (sbi->s_mapping == 'a') { + len = get_acorn_filename(de, tmpname, inode); + p = tmpname; + } else + if (sbi->s_mapping == 'n') { + len = isofs_name_translate(de, tmpname, inode); + p = tmpname; + } else { + p = de->name; + len = de->name_len[0]; + } + } + if (len > 0) { + if (!dir_emit(ctx, p, len, inode_number, DT_UNKNOWN)) + break; + } + ctx->pos += de_len; + + continue; + } + if (bh) + brelse(bh); + return 0; +} + +/* + * Handle allocation of temporary space for name translation and + * handling split directory entries.. The real work is done by + * "do_isofs_readdir()". + */ +static int isofs_readdir(struct file *file, struct dir_context *ctx) +{ + int result; + char *tmpname; + struct iso_directory_record *tmpde; + struct inode *inode = file_inode(file); + + tmpname = (char *)__get_free_page(GFP_KERNEL); + if (tmpname == NULL) + return -ENOMEM; + + tmpde = (struct iso_directory_record *) (tmpname+1024); + + result = do_isofs_readdir(inode, file, ctx, tmpname, tmpde); + + free_page((unsigned long) tmpname); + return result; +} + +const struct file_operations isofs_dir_operations = +{ + .llseek = generic_file_llseek, + .read = generic_read_dir, + .iterate_shared = isofs_readdir, +}; + +/* + * directories can handle most operations... + */ +const struct inode_operations isofs_dir_inode_operations = +{ + .lookup = isofs_lookup, +}; + + diff --git a/vendor/linux/fs/isofs/export.c b/vendor/linux/fs/isofs/export.c new file mode 100644 index 0000000..0c5f721 --- /dev/null +++ b/vendor/linux/fs/isofs/export.c @@ -0,0 +1,192 @@ +/* + * fs/isofs/export.c + * + * (C) 2004 Paul Serice - The new inode scheme requires switching + * from iget() to iget5_locked() which means + * the NFS export operations have to be hand + * coded because the default routines rely on + * iget(). + * + * The following files are helpful: + * + * Documentation/filesystems/nfs/Exporting + * fs/exportfs/expfs.c. + */ + +#include "isofs.h" + +static struct dentry * +isofs_export_iget(struct super_block *sb, + unsigned long block, + unsigned long offset, + __u32 generation) +{ + struct inode *inode; + + if (block == 0) + return ERR_PTR(-ESTALE); + inode = isofs_iget(sb, block, offset); + if (IS_ERR(inode)) + return ERR_CAST(inode); + if (generation && inode->i_generation != generation) { + iput(inode); + return ERR_PTR(-ESTALE); + } + return d_obtain_alias(inode); +} + +/* This function is surprisingly simple. The trick is understanding + * that "child" is always a directory. So, to find its parent, you + * simply need to find its ".." entry, normalize its block and offset, + * and return the underlying inode. See the comments for + * isofs_normalize_block_and_offset(). */ +static struct dentry *isofs_export_get_parent(struct dentry *child) +{ + unsigned long parent_block = 0; + unsigned long parent_offset = 0; + struct inode *child_inode = d_inode(child); + struct iso_inode_info *e_child_inode = ISOFS_I(child_inode); + struct iso_directory_record *de = NULL; + struct buffer_head * bh = NULL; + struct dentry *rv = NULL; + + /* "child" must always be a directory. */ + if (!S_ISDIR(child_inode->i_mode)) { + printk(KERN_ERR "isofs: isofs_export_get_parent(): " + "child is not a directory!\n"); + rv = ERR_PTR(-EACCES); + goto out; + } + + /* It is an invariant that the directory offset is zero. If + * it is not zero, it means the directory failed to be + * normalized for some reason. */ + if (e_child_inode->i_iget5_offset != 0) { + printk(KERN_ERR "isofs: isofs_export_get_parent(): " + "child directory not normalized!\n"); + rv = ERR_PTR(-EACCES); + goto out; + } + + /* The child inode has been normalized such that its + * i_iget5_block value points to the "." entry. Fortunately, + * the ".." entry is located in the same block. */ + parent_block = e_child_inode->i_iget5_block; + + /* Get the block in question. */ + bh = sb_bread(child_inode->i_sb, parent_block); + if (bh == NULL) { + rv = ERR_PTR(-EACCES); + goto out; + } + + /* This is the "." entry. */ + de = (struct iso_directory_record*)bh->b_data; + + /* The ".." entry is always the second entry. */ + parent_offset = (unsigned long)isonum_711(de->length); + de = (struct iso_directory_record*)(bh->b_data + parent_offset); + + /* Verify it is in fact the ".." entry. */ + if ((isonum_711(de->name_len) != 1) || (de->name[0] != 1)) { + printk(KERN_ERR "isofs: Unable to find the \"..\" " + "directory for NFS.\n"); + rv = ERR_PTR(-EACCES); + goto out; + } + + /* Normalize */ + isofs_normalize_block_and_offset(de, &parent_block, &parent_offset); + + rv = d_obtain_alias(isofs_iget(child_inode->i_sb, parent_block, + parent_offset)); + out: + if (bh) + brelse(bh); + return rv; +} + +static int +isofs_export_encode_fh(struct inode *inode, + __u32 *fh32, + int *max_len, + struct inode *parent) +{ + struct iso_inode_info * ei = ISOFS_I(inode); + int len = *max_len; + int type = 1; + __u16 *fh16 = (__u16*)fh32; + + /* + * WARNING: max_len is 5 for NFSv2. Because of this + * limitation, we use the lower 16 bits of fh32[1] to hold the + * offset of the inode and the upper 16 bits of fh32[1] to + * hold the offset of the parent. + */ + if (parent && (len < 5)) { + *max_len = 5; + return FILEID_INVALID; + } else if (len < 3) { + *max_len = 3; + return FILEID_INVALID; + } + + len = 3; + fh32[0] = ei->i_iget5_block; + fh16[2] = (__u16)ei->i_iget5_offset; /* fh16 [sic] */ + fh16[3] = 0; /* avoid leaking uninitialized data */ + fh32[2] = inode->i_generation; + if (parent) { + struct iso_inode_info *eparent; + eparent = ISOFS_I(parent); + fh32[3] = eparent->i_iget5_block; + fh16[3] = (__u16)eparent->i_iget5_offset; /* fh16 [sic] */ + fh32[4] = parent->i_generation; + len = 5; + type = 2; + } + *max_len = len; + return type; +} + +struct isofs_fid { + u32 block; + u16 offset; + u16 parent_offset; + u32 generation; + u32 parent_block; + u32 parent_generation; +}; + +static struct dentry *isofs_fh_to_dentry(struct super_block *sb, + struct fid *fid, int fh_len, int fh_type) +{ + struct isofs_fid *ifid = (struct isofs_fid *)fid; + + if (fh_len < 3 || fh_type > 2) + return NULL; + + return isofs_export_iget(sb, ifid->block, ifid->offset, + ifid->generation); +} + +static struct dentry *isofs_fh_to_parent(struct super_block *sb, + struct fid *fid, int fh_len, int fh_type) +{ + struct isofs_fid *ifid = (struct isofs_fid *)fid; + + if (fh_len < 2 || fh_type != 2) + return NULL; + + return isofs_export_iget(sb, + fh_len > 2 ? ifid->parent_block : 0, + ifid->parent_offset, + fh_len > 4 ? ifid->parent_generation : 0); +} + +const struct export_operations isofs_export_ops = { + .encode_fh = isofs_export_encode_fh, + .fh_to_dentry = isofs_fh_to_dentry, + .fh_to_parent = isofs_fh_to_parent, + .get_parent = isofs_export_get_parent, +}; diff --git a/vendor/linux/fs/isofs/inode.c b/vendor/linux/fs/isofs/inode.c new file mode 100644 index 0000000..871c8b3 --- /dev/null +++ b/vendor/linux/fs/isofs/inode.c @@ -0,0 +1,1557 @@ +/* + * linux/fs/isofs/inode.c + * + * (C) 1991 Linus Torvalds - minix filesystem + * 1992, 1993, 1994 Eric Youngdale Modified for ISO 9660 filesystem. + * 1994 Eberhard Mönkeberg - multi session handling. + * 1995 Mark Dobie - allow mounting of some weird VideoCDs and PhotoCDs. + * 1997 Gordon Chaffee - Joliet CDs + * 1998 Eric Lammerts - ISO 9660 Level 3 + * 2004 Paul Serice - Inode Support pushed out from 4GB to 128GB + * 2004 Paul Serice - NFS Export Operations + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "isofs.h" +#include "zisofs.h" + +#define BEQUIET + +static int isofs_hashi(const struct dentry *parent, struct qstr *qstr); +static int isofs_dentry_cmpi(const struct dentry *dentry, + unsigned int len, const char *str, const struct qstr *name); + +#ifdef CONFIG_JOLIET +static int isofs_hashi_ms(const struct dentry *parent, struct qstr *qstr); +static int isofs_hash_ms(const struct dentry *parent, struct qstr *qstr); +static int isofs_dentry_cmpi_ms(const struct dentry *dentry, + unsigned int len, const char *str, const struct qstr *name); +static int isofs_dentry_cmp_ms(const struct dentry *dentry, + unsigned int len, const char *str, const struct qstr *name); +#endif + +static void isofs_put_super(struct super_block *sb) +{ + struct isofs_sb_info *sbi = ISOFS_SB(sb); + +#ifdef CONFIG_JOLIET + unload_nls(sbi->s_nls_iocharset); +#endif + + kfree(sbi); + sb->s_fs_info = NULL; + return; +} + +static int isofs_read_inode(struct inode *, int relocated); +static int isofs_statfs (struct dentry *, struct kstatfs *); + +static struct kmem_cache *isofs_inode_cachep; + +static struct inode *isofs_alloc_inode(struct super_block *sb) +{ + struct iso_inode_info *ei; + ei = kmem_cache_alloc(isofs_inode_cachep, GFP_KERNEL); + if (!ei) + return NULL; + return &ei->vfs_inode; +} + +static void isofs_i_callback(struct rcu_head *head) +{ + struct inode *inode = container_of(head, struct inode, i_rcu); + kmem_cache_free(isofs_inode_cachep, ISOFS_I(inode)); +} + +static void isofs_destroy_inode(struct inode *inode) +{ + call_rcu(&inode->i_rcu, isofs_i_callback); +} + +static void init_once(void *foo) +{ + struct iso_inode_info *ei = foo; + + inode_init_once(&ei->vfs_inode); +} + +static int __init init_inodecache(void) +{ + isofs_inode_cachep = kmem_cache_create("isofs_inode_cache", + sizeof(struct iso_inode_info), + 0, (SLAB_RECLAIM_ACCOUNT| + SLAB_MEM_SPREAD|SLAB_ACCOUNT), + init_once); + if (isofs_inode_cachep == NULL) + return -ENOMEM; + return 0; +} + +static void destroy_inodecache(void) +{ + /* + * Make sure all delayed rcu free inodes are flushed before we + * destroy cache. + */ + rcu_barrier(); + kmem_cache_destroy(isofs_inode_cachep); +} + +static int isofs_remount(struct super_block *sb, int *flags, char *data) +{ + sync_filesystem(sb); + if (!(*flags & MS_RDONLY)) + return -EROFS; + return 0; +} + +static const struct super_operations isofs_sops = { + .alloc_inode = isofs_alloc_inode, + .destroy_inode = isofs_destroy_inode, + .put_super = isofs_put_super, + .statfs = isofs_statfs, + .remount_fs = isofs_remount, + .show_options = generic_show_options, +}; + + +static const struct dentry_operations isofs_dentry_ops[] = { + { + .d_hash = isofs_hashi, + .d_compare = isofs_dentry_cmpi, + }, +#ifdef CONFIG_JOLIET + { + .d_hash = isofs_hash_ms, + .d_compare = isofs_dentry_cmp_ms, + }, + { + .d_hash = isofs_hashi_ms, + .d_compare = isofs_dentry_cmpi_ms, + }, +#endif +}; + +struct iso9660_options{ + unsigned int rock:1; + unsigned int joliet:1; + unsigned int cruft:1; + unsigned int hide:1; + unsigned int showassoc:1; + unsigned int nocompress:1; + unsigned int overriderockperm:1; + unsigned int uid_set:1; + unsigned int gid_set:1; + unsigned int utf8:1; + unsigned char map; + unsigned char check; + unsigned int blocksize; + umode_t fmode; + umode_t dmode; + kgid_t gid; + kuid_t uid; + char *iocharset; + /* LVE */ + s32 session; + s32 sbsector; +}; + +/* + * Compute the hash for the isofs name corresponding to the dentry. + */ +static int +isofs_hashi_common(const struct dentry *dentry, struct qstr *qstr, int ms) +{ + const char *name; + int len; + char c; + unsigned long hash; + + len = qstr->len; + name = qstr->name; + if (ms) { + while (len && name[len-1] == '.') + len--; + } + + hash = init_name_hash(dentry); + while (len--) { + c = tolower(*name++); + hash = partial_name_hash(c, hash); + } + qstr->hash = end_name_hash(hash); + + return 0; +} + +/* + * Compare of two isofs names. + */ +static int isofs_dentry_cmp_common( + unsigned int len, const char *str, + const struct qstr *name, int ms, int ci) +{ + int alen, blen; + + /* A filename cannot end in '.' or we treat it like it has none */ + alen = name->len; + blen = len; + if (ms) { + while (alen && name->name[alen-1] == '.') + alen--; + while (blen && str[blen-1] == '.') + blen--; + } + if (alen == blen) { + if (ci) { + if (strncasecmp(name->name, str, alen) == 0) + return 0; + } else { + if (strncmp(name->name, str, alen) == 0) + return 0; + } + } + return 1; +} + +static int +isofs_hashi(const struct dentry *dentry, struct qstr *qstr) +{ + return isofs_hashi_common(dentry, qstr, 0); +} + +static int +isofs_dentry_cmpi(const struct dentry *dentry, + unsigned int len, const char *str, const struct qstr *name) +{ + return isofs_dentry_cmp_common(len, str, name, 0, 1); +} + +#ifdef CONFIG_JOLIET +/* + * Compute the hash for the isofs name corresponding to the dentry. + */ +static int +isofs_hash_common(const struct dentry *dentry, struct qstr *qstr, int ms) +{ + const char *name; + int len; + + len = qstr->len; + name = qstr->name; + if (ms) { + while (len && name[len-1] == '.') + len--; + } + + qstr->hash = full_name_hash(dentry, name, len); + + return 0; +} + +static int +isofs_hash_ms(const struct dentry *dentry, struct qstr *qstr) +{ + return isofs_hash_common(dentry, qstr, 1); +} + +static int +isofs_hashi_ms(const struct dentry *dentry, struct qstr *qstr) +{ + return isofs_hashi_common(dentry, qstr, 1); +} + +static int +isofs_dentry_cmp_ms(const struct dentry *dentry, + unsigned int len, const char *str, const struct qstr *name) +{ + return isofs_dentry_cmp_common(len, str, name, 1, 0); +} + +static int +isofs_dentry_cmpi_ms(const struct dentry *dentry, + unsigned int len, const char *str, const struct qstr *name) +{ + return isofs_dentry_cmp_common(len, str, name, 1, 1); +} +#endif + +enum { + Opt_block, Opt_check_r, Opt_check_s, Opt_cruft, Opt_gid, Opt_ignore, + Opt_iocharset, Opt_map_a, Opt_map_n, Opt_map_o, Opt_mode, Opt_nojoliet, + Opt_norock, Opt_sb, Opt_session, Opt_uid, Opt_unhide, Opt_utf8, Opt_err, + Opt_nocompress, Opt_hide, Opt_showassoc, Opt_dmode, Opt_overriderockperm, +}; + +static const match_table_t tokens = { + {Opt_norock, "norock"}, + {Opt_nojoliet, "nojoliet"}, + {Opt_unhide, "unhide"}, + {Opt_hide, "hide"}, + {Opt_showassoc, "showassoc"}, + {Opt_cruft, "cruft"}, + {Opt_utf8, "utf8"}, + {Opt_iocharset, "iocharset=%s"}, + {Opt_map_a, "map=acorn"}, + {Opt_map_a, "map=a"}, + {Opt_map_n, "map=normal"}, + {Opt_map_n, "map=n"}, + {Opt_map_o, "map=off"}, + {Opt_map_o, "map=o"}, + {Opt_session, "session=%u"}, + {Opt_sb, "sbsector=%u"}, + {Opt_check_r, "check=relaxed"}, + {Opt_check_r, "check=r"}, + {Opt_check_s, "check=strict"}, + {Opt_check_s, "check=s"}, + {Opt_uid, "uid=%u"}, + {Opt_gid, "gid=%u"}, + {Opt_mode, "mode=%u"}, + {Opt_dmode, "dmode=%u"}, + {Opt_overriderockperm, "overriderockperm"}, + {Opt_block, "block=%u"}, + {Opt_ignore, "conv=binary"}, + {Opt_ignore, "conv=b"}, + {Opt_ignore, "conv=text"}, + {Opt_ignore, "conv=t"}, + {Opt_ignore, "conv=mtext"}, + {Opt_ignore, "conv=m"}, + {Opt_ignore, "conv=auto"}, + {Opt_ignore, "conv=a"}, + {Opt_nocompress, "nocompress"}, + {Opt_err, NULL} +}; + +static int parse_options(char *options, struct iso9660_options *popt) +{ + char *p; + int option; + + popt->map = 'n'; + popt->rock = 1; + popt->joliet = 1; + popt->cruft = 0; + popt->hide = 0; + popt->showassoc = 0; + popt->check = 'u'; /* unset */ + popt->nocompress = 0; + popt->blocksize = 1024; + popt->fmode = popt->dmode = ISOFS_INVALID_MODE; + popt->uid_set = 0; + popt->gid_set = 0; + popt->gid = GLOBAL_ROOT_GID; + popt->uid = GLOBAL_ROOT_UID; + popt->iocharset = NULL; + popt->utf8 = 0; + popt->overriderockperm = 0; + popt->session=-1; + popt->sbsector=-1; + if (!options) + return 1; + + while ((p = strsep(&options, ",")) != NULL) { + int token; + substring_t args[MAX_OPT_ARGS]; + unsigned n; + + if (!*p) + continue; + + token = match_token(p, tokens, args); + switch (token) { + case Opt_norock: + popt->rock = 0; + break; + case Opt_nojoliet: + popt->joliet = 0; + break; + case Opt_hide: + popt->hide = 1; + break; + case Opt_unhide: + case Opt_showassoc: + popt->showassoc = 1; + break; + case Opt_cruft: + popt->cruft = 1; + break; + case Opt_utf8: + popt->utf8 = 1; + break; +#ifdef CONFIG_JOLIET + case Opt_iocharset: + popt->iocharset = match_strdup(&args[0]); + break; +#endif + case Opt_map_a: + popt->map = 'a'; + break; + case Opt_map_o: + popt->map = 'o'; + break; + case Opt_map_n: + popt->map = 'n'; + break; + case Opt_session: + if (match_int(&args[0], &option)) + return 0; + n = option; + if (n > 99) + return 0; + popt->session = n + 1; + break; + case Opt_sb: + if (match_int(&args[0], &option)) + return 0; + popt->sbsector = option; + break; + case Opt_check_r: + popt->check = 'r'; + break; + case Opt_check_s: + popt->check = 's'; + break; + case Opt_ignore: + break; + case Opt_uid: + if (match_int(&args[0], &option)) + return 0; + popt->uid = make_kuid(current_user_ns(), option); + if (!uid_valid(popt->uid)) + return 0; + popt->uid_set = 1; + break; + case Opt_gid: + if (match_int(&args[0], &option)) + return 0; + popt->gid = make_kgid(current_user_ns(), option); + if (!gid_valid(popt->gid)) + return 0; + popt->gid_set = 1; + break; + case Opt_mode: + if (match_int(&args[0], &option)) + return 0; + popt->fmode = option; + break; + case Opt_dmode: + if (match_int(&args[0], &option)) + return 0; + popt->dmode = option; + break; + case Opt_overriderockperm: + popt->overriderockperm = 1; + break; + case Opt_block: + if (match_int(&args[0], &option)) + return 0; + n = option; + if (n != 512 && n != 1024 && n != 2048) + return 0; + popt->blocksize = n; + break; + case Opt_nocompress: + popt->nocompress = 1; + break; + default: + return 0; + } + } + return 1; +} + +/* + * look if the driver can tell the multi session redirection value + * + * don't change this if you don't know what you do, please! + * Multisession is legal only with XA disks. + * A non-XA disk with more than one volume descriptor may do it right, but + * usually is written in a nowhere standardized "multi-partition" manner. + * Multisession uses absolute addressing (solely the first frame of the whole + * track is #0), multi-partition uses relative addressing (each first frame of + * each track is #0), and a track is not a session. + * + * A broken CDwriter software or drive firmware does not set new standards, + * at least not if conflicting with the existing ones. + * + * emoenke@gwdg.de + */ +#define WE_OBEY_THE_WRITTEN_STANDARDS 1 + +static unsigned int isofs_get_last_session(struct super_block *sb, s32 session) +{ + struct cdrom_multisession ms_info; + unsigned int vol_desc_start; + struct block_device *bdev = sb->s_bdev; + int i; + + vol_desc_start=0; + ms_info.addr_format=CDROM_LBA; + if(session >= 0 && session <= 99) { + struct cdrom_tocentry Te; + Te.cdte_track=session; + Te.cdte_format=CDROM_LBA; + i = ioctl_by_bdev(bdev, CDROMREADTOCENTRY, (unsigned long) &Te); + if (!i) { + printk(KERN_DEBUG "ISOFS: Session %d start %d type %d\n", + session, Te.cdte_addr.lba, + Te.cdte_ctrl&CDROM_DATA_TRACK); + if ((Te.cdte_ctrl&CDROM_DATA_TRACK) == 4) + return Te.cdte_addr.lba; + } + + printk(KERN_ERR "ISOFS: Invalid session number or type of track\n"); + } + i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long) &ms_info); + if (session > 0) + printk(KERN_ERR "ISOFS: Invalid session number\n"); +#if 0 + printk(KERN_DEBUG "isofs.inode: CDROMMULTISESSION: rc=%d\n",i); + if (i==0) { + printk(KERN_DEBUG "isofs.inode: XA disk: %s\n",ms_info.xa_flag?"yes":"no"); + printk(KERN_DEBUG "isofs.inode: vol_desc_start = %d\n", ms_info.addr.lba); + } +#endif + if (i==0) +#if WE_OBEY_THE_WRITTEN_STANDARDS + if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */ +#endif + vol_desc_start=ms_info.addr.lba; + return vol_desc_start; +} + +/* + * Check if root directory is empty (has less than 3 files). + * + * Used to detect broken CDs where ISO root directory is empty but Joliet root + * directory is OK. If such CD has Rock Ridge extensions, they will be disabled + * (and Joliet used instead) or else no files would be visible. + */ +static bool rootdir_empty(struct super_block *sb, unsigned long block) +{ + int offset = 0, files = 0, de_len; + struct iso_directory_record *de; + struct buffer_head *bh; + + bh = sb_bread(sb, block); + if (!bh) + return true; + while (files < 3) { + de = (struct iso_directory_record *) (bh->b_data + offset); + de_len = *(unsigned char *) de; + if (de_len == 0) + break; + files++; + offset += de_len; + } + brelse(bh); + return files < 3; +} + +/* + * Initialize the superblock and read the root inode. + * + * Note: a check_disk_change() has been done immediately prior + * to this call, so we don't need to check again. + */ +static int isofs_fill_super(struct super_block *s, void *data, int silent) +{ + struct buffer_head *bh = NULL, *pri_bh = NULL; + struct hs_primary_descriptor *h_pri = NULL; + struct iso_primary_descriptor *pri = NULL; + struct iso_supplementary_descriptor *sec = NULL; + struct iso_directory_record *rootp; + struct inode *inode; + struct iso9660_options opt; + struct isofs_sb_info *sbi; + unsigned long first_data_zone; + int joliet_level = 0; + int iso_blknum, block; + int orig_zonesize; + int table, error = -EINVAL; + unsigned int vol_desc_start; + + save_mount_options(s, data); + + sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); + if (!sbi) + return -ENOMEM; + s->s_fs_info = sbi; + + if (!parse_options((char *)data, &opt)) + goto out_freesbi; + + /* + * First of all, get the hardware blocksize for this device. + * If we don't know what it is, or the hardware blocksize is + * larger than the blocksize the user specified, then use + * that value. + */ + /* + * What if bugger tells us to go beyond page size? + */ + opt.blocksize = sb_min_blocksize(s, opt.blocksize); + + sbi->s_high_sierra = 0; /* default is iso9660 */ + + vol_desc_start = (opt.sbsector != -1) ? + opt.sbsector : isofs_get_last_session(s,opt.session); + + for (iso_blknum = vol_desc_start+16; + iso_blknum < vol_desc_start+100; iso_blknum++) { + struct hs_volume_descriptor *hdp; + struct iso_volume_descriptor *vdp; + + block = iso_blknum << (ISOFS_BLOCK_BITS - s->s_blocksize_bits); + if (!(bh = sb_bread(s, block))) + goto out_no_read; + + vdp = (struct iso_volume_descriptor *)bh->b_data; + hdp = (struct hs_volume_descriptor *)bh->b_data; + + /* + * Due to the overlapping physical location of the descriptors, + * ISO CDs can match hdp->id==HS_STANDARD_ID as well. To ensure + * proper identification in this case, we first check for ISO. + */ + if (strncmp (vdp->id, ISO_STANDARD_ID, sizeof vdp->id) == 0) { + if (isonum_711(vdp->type) == ISO_VD_END) + break; + if (isonum_711(vdp->type) == ISO_VD_PRIMARY) { + if (pri == NULL) { + pri = (struct iso_primary_descriptor *)vdp; + /* Save the buffer in case we need it ... */ + pri_bh = bh; + bh = NULL; + } + } +#ifdef CONFIG_JOLIET + else if (isonum_711(vdp->type) == ISO_VD_SUPPLEMENTARY) { + sec = (struct iso_supplementary_descriptor *)vdp; + if (sec->escape[0] == 0x25 && sec->escape[1] == 0x2f) { + if (opt.joliet) { + if (sec->escape[2] == 0x40) + joliet_level = 1; + else if (sec->escape[2] == 0x43) + joliet_level = 2; + else if (sec->escape[2] == 0x45) + joliet_level = 3; + + printk(KERN_DEBUG "ISO 9660 Extensions: " + "Microsoft Joliet Level %d\n", + joliet_level); + } + goto root_found; + } else { + /* Unknown supplementary volume descriptor */ + sec = NULL; + } + } +#endif + } else { + if (strncmp (hdp->id, HS_STANDARD_ID, sizeof hdp->id) == 0) { + if (isonum_711(hdp->type) != ISO_VD_PRIMARY) + goto out_freebh; + + sbi->s_high_sierra = 1; + opt.rock = 0; + h_pri = (struct hs_primary_descriptor *)vdp; + goto root_found; + } + } + + /* Just skip any volume descriptors we don't recognize */ + + brelse(bh); + bh = NULL; + } + /* + * If we fall through, either no volume descriptor was found, + * or else we passed a primary descriptor looking for others. + */ + if (!pri) + goto out_unknown_format; + brelse(bh); + bh = pri_bh; + pri_bh = NULL; + +root_found: + /* We don't support read-write mounts */ + if (!(s->s_flags & MS_RDONLY)) { + error = -EACCES; + goto out_freebh; + } + + if (joliet_level && (pri == NULL || !opt.rock)) { + /* This is the case of Joliet with the norock mount flag. + * A disc with both Joliet and Rock Ridge is handled later + */ + pri = (struct iso_primary_descriptor *) sec; + } + + if(sbi->s_high_sierra){ + rootp = (struct iso_directory_record *) h_pri->root_directory_record; + sbi->s_nzones = isonum_733(h_pri->volume_space_size); + sbi->s_log_zone_size = isonum_723(h_pri->logical_block_size); + sbi->s_max_size = isonum_733(h_pri->volume_space_size); + } else { + if (!pri) + goto out_freebh; + rootp = (struct iso_directory_record *) pri->root_directory_record; + sbi->s_nzones = isonum_733(pri->volume_space_size); + sbi->s_log_zone_size = isonum_723(pri->logical_block_size); + sbi->s_max_size = isonum_733(pri->volume_space_size); + } + + sbi->s_ninodes = 0; /* No way to figure this out easily */ + + orig_zonesize = sbi->s_log_zone_size; + /* + * If the zone size is smaller than the hardware sector size, + * this is a fatal error. This would occur if the disc drive + * had sectors that were 2048 bytes, but the filesystem had + * blocks that were 512 bytes (which should only very rarely + * happen.) + */ + if (orig_zonesize < opt.blocksize) + goto out_bad_size; + + /* RDE: convert log zone size to bit shift */ + switch (sbi->s_log_zone_size) { + case 512: sbi->s_log_zone_size = 9; break; + case 1024: sbi->s_log_zone_size = 10; break; + case 2048: sbi->s_log_zone_size = 11; break; + + default: + goto out_bad_zone_size; + } + + s->s_magic = ISOFS_SUPER_MAGIC; + + /* + * With multi-extent files, file size is only limited by the maximum + * size of a file system, which is 8 TB. + */ + s->s_maxbytes = 0x80000000000LL; + + /* Set this for reference. Its not currently used except on write + which we don't have .. */ + + first_data_zone = isonum_733(rootp->extent) + + isonum_711(rootp->ext_attr_length); + sbi->s_firstdatazone = first_data_zone; +#ifndef BEQUIET + printk(KERN_DEBUG "ISOFS: Max size:%ld Log zone size:%ld\n", + sbi->s_max_size, 1UL << sbi->s_log_zone_size); + printk(KERN_DEBUG "ISOFS: First datazone:%ld\n", sbi->s_firstdatazone); + if(sbi->s_high_sierra) + printk(KERN_DEBUG "ISOFS: Disc in High Sierra format.\n"); +#endif + + /* + * If the Joliet level is set, we _may_ decide to use the + * secondary descriptor, but can't be sure until after we + * read the root inode. But before reading the root inode + * we may need to change the device blocksize, and would + * rather release the old buffer first. So, we cache the + * first_data_zone value from the secondary descriptor. + */ + if (joliet_level) { + pri = (struct iso_primary_descriptor *) sec; + rootp = (struct iso_directory_record *) + pri->root_directory_record; + first_data_zone = isonum_733(rootp->extent) + + isonum_711(rootp->ext_attr_length); + } + + /* + * We're all done using the volume descriptor, and may need + * to change the device blocksize, so release the buffer now. + */ + brelse(pri_bh); + brelse(bh); + + /* + * Force the blocksize to 512 for 512 byte sectors. The file + * read primitives really get it wrong in a bad way if we don't + * do this. + * + * Note - we should never be setting the blocksize to something + * less than the hardware sector size for the device. If we + * do, we would end up having to read larger buffers and split + * out portions to satisfy requests. + * + * Note2- the idea here is that we want to deal with the optimal + * zonesize in the filesystem. If we have it set to something less, + * then we have horrible problems with trying to piece together + * bits of adjacent blocks in order to properly read directory + * entries. By forcing the blocksize in this way, we ensure + * that we will never be required to do this. + */ + sb_set_blocksize(s, orig_zonesize); + + sbi->s_nls_iocharset = NULL; + +#ifdef CONFIG_JOLIET + if (joliet_level && opt.utf8 == 0) { + char *p = opt.iocharset ? opt.iocharset : CONFIG_NLS_DEFAULT; + sbi->s_nls_iocharset = load_nls(p); + if (! sbi->s_nls_iocharset) { + /* Fail only if explicit charset specified */ + if (opt.iocharset) + goto out_freesbi; + sbi->s_nls_iocharset = load_nls_default(); + } + } +#endif + s->s_op = &isofs_sops; + s->s_export_op = &isofs_export_ops; + sbi->s_mapping = opt.map; + sbi->s_rock = (opt.rock ? 2 : 0); + sbi->s_rock_offset = -1; /* initial offset, will guess until SP is found*/ + sbi->s_cruft = opt.cruft; + sbi->s_hide = opt.hide; + sbi->s_showassoc = opt.showassoc; + sbi->s_uid = opt.uid; + sbi->s_gid = opt.gid; + sbi->s_uid_set = opt.uid_set; + sbi->s_gid_set = opt.gid_set; + sbi->s_utf8 = opt.utf8; + sbi->s_nocompress = opt.nocompress; + sbi->s_overriderockperm = opt.overriderockperm; + /* + * It would be incredibly stupid to allow people to mark every file + * on the disk as suid, so we merely allow them to set the default + * permissions. + */ + if (opt.fmode != ISOFS_INVALID_MODE) + sbi->s_fmode = opt.fmode & 0777; + else + sbi->s_fmode = ISOFS_INVALID_MODE; + if (opt.dmode != ISOFS_INVALID_MODE) + sbi->s_dmode = opt.dmode & 0777; + else + sbi->s_dmode = ISOFS_INVALID_MODE; + + /* + * Read the root inode, which _may_ result in changing + * the s_rock flag. Once we have the final s_rock value, + * we then decide whether to use the Joliet descriptor. + */ + inode = isofs_iget(s, sbi->s_firstdatazone, 0); + if (IS_ERR(inode)) + goto out_no_root; + + /* + * Fix for broken CDs with Rock Ridge and empty ISO root directory but + * correct Joliet root directory. + */ + if (sbi->s_rock == 1 && joliet_level && + rootdir_empty(s, sbi->s_firstdatazone)) { + printk(KERN_NOTICE + "ISOFS: primary root directory is empty. " + "Disabling Rock Ridge and switching to Joliet."); + sbi->s_rock = 0; + } + + /* + * If this disk has both Rock Ridge and Joliet on it, then we + * want to use Rock Ridge by default. This can be overridden + * by using the norock mount option. There is still one other + * possibility that is not taken into account: a Rock Ridge + * CD with Unicode names. Until someone sees such a beast, it + * will not be supported. + */ + if (sbi->s_rock == 1) { + joliet_level = 0; + } else if (joliet_level) { + sbi->s_rock = 0; + if (sbi->s_firstdatazone != first_data_zone) { + sbi->s_firstdatazone = first_data_zone; + printk(KERN_DEBUG + "ISOFS: changing to secondary root\n"); + iput(inode); + inode = isofs_iget(s, sbi->s_firstdatazone, 0); + if (IS_ERR(inode)) + goto out_no_root; + } + } + + if (opt.check == 'u') { + /* Only Joliet is case insensitive by default */ + if (joliet_level) + opt.check = 'r'; + else + opt.check = 's'; + } + sbi->s_joliet_level = joliet_level; + + /* Make sure the root inode is a directory */ + if (!S_ISDIR(inode->i_mode)) { + printk(KERN_WARNING + "isofs_fill_super: root inode is not a directory. " + "Corrupted media?\n"); + goto out_iput; + } + + table = 0; + if (joliet_level) + table += 2; + if (opt.check == 'r') + table++; + + if (table) + s->s_d_op = &isofs_dentry_ops[table - 1]; + + /* get the root dentry */ + s->s_root = d_make_root(inode); + if (!(s->s_root)) { + error = -ENOMEM; + goto out_no_inode; + } + + kfree(opt.iocharset); + + return 0; + + /* + * Display error messages and free resources. + */ +out_iput: + iput(inode); + goto out_no_inode; +out_no_root: + error = PTR_ERR(inode); + if (error != -ENOMEM) + printk(KERN_WARNING "%s: get root inode failed\n", __func__); +out_no_inode: +#ifdef CONFIG_JOLIET + unload_nls(sbi->s_nls_iocharset); +#endif + goto out_freesbi; +out_no_read: + printk(KERN_WARNING "%s: bread failed, dev=%s, iso_blknum=%d, block=%d\n", + __func__, s->s_id, iso_blknum, block); + goto out_freebh; +out_bad_zone_size: + printk(KERN_WARNING "ISOFS: Bad logical zone size %ld\n", + sbi->s_log_zone_size); + goto out_freebh; +out_bad_size: + printk(KERN_WARNING "ISOFS: Logical zone size(%d) < hardware blocksize(%u)\n", + orig_zonesize, opt.blocksize); + goto out_freebh; +out_unknown_format: + if (!silent) + printk(KERN_WARNING "ISOFS: Unable to identify CD-ROM format.\n"); + +out_freebh: + brelse(bh); + brelse(pri_bh); +out_freesbi: + kfree(opt.iocharset); + kfree(sbi); + s->s_fs_info = NULL; + return error; +} + +static int isofs_statfs (struct dentry *dentry, struct kstatfs *buf) +{ + struct super_block *sb = dentry->d_sb; + u64 id = huge_encode_dev(sb->s_bdev->bd_dev); + + buf->f_type = ISOFS_SUPER_MAGIC; + buf->f_bsize = sb->s_blocksize; + buf->f_blocks = (ISOFS_SB(sb)->s_nzones + << (ISOFS_SB(sb)->s_log_zone_size - sb->s_blocksize_bits)); + buf->f_bfree = 0; + buf->f_bavail = 0; + buf->f_files = ISOFS_SB(sb)->s_ninodes; + buf->f_ffree = 0; + buf->f_fsid.val[0] = (u32)id; + buf->f_fsid.val[1] = (u32)(id >> 32); + buf->f_namelen = NAME_MAX; + return 0; +} + +/* + * Get a set of blocks; filling in buffer_heads if already allocated + * or getblk() if they are not. Returns the number of blocks inserted + * (-ve == error.) + */ +int isofs_get_blocks(struct inode *inode, sector_t iblock, + struct buffer_head **bh, unsigned long nblocks) +{ + unsigned long b_off = iblock; + unsigned offset, sect_size; + unsigned int firstext; + unsigned long nextblk, nextoff; + int section, rv, error; + struct iso_inode_info *ei = ISOFS_I(inode); + + error = -EIO; + rv = 0; + if (iblock != b_off) { + printk(KERN_DEBUG "%s: block number too large\n", __func__); + goto abort; + } + + + offset = 0; + firstext = ei->i_first_extent; + sect_size = ei->i_section_size >> ISOFS_BUFFER_BITS(inode); + nextblk = ei->i_next_section_block; + nextoff = ei->i_next_section_offset; + section = 0; + + while (nblocks) { + /* If we are *way* beyond the end of the file, print a message. + * Access beyond the end of the file up to the next page boundary + * is normal, however because of the way the page cache works. + * In this case, we just return 0 so that we can properly fill + * the page with useless information without generating any + * I/O errors. + */ + if (b_off > ((inode->i_size + PAGE_SIZE - 1) >> ISOFS_BUFFER_BITS(inode))) { + printk(KERN_DEBUG "%s: block >= EOF (%lu, %llu)\n", + __func__, b_off, + (unsigned long long)inode->i_size); + goto abort; + } + + /* On the last section, nextblk == 0, section size is likely to + * exceed sect_size by a partial block, and access beyond the + * end of the file will reach beyond the section size, too. + */ + while (nextblk && (b_off >= (offset + sect_size))) { + struct inode *ninode; + + offset += sect_size; + ninode = isofs_iget(inode->i_sb, nextblk, nextoff); + if (IS_ERR(ninode)) { + error = PTR_ERR(ninode); + goto abort; + } + firstext = ISOFS_I(ninode)->i_first_extent; + sect_size = ISOFS_I(ninode)->i_section_size >> ISOFS_BUFFER_BITS(ninode); + nextblk = ISOFS_I(ninode)->i_next_section_block; + nextoff = ISOFS_I(ninode)->i_next_section_offset; + iput(ninode); + + if (++section > 100) { + printk(KERN_DEBUG "%s: More than 100 file sections ?!?" + " aborting...\n", __func__); + printk(KERN_DEBUG "%s: block=%lu firstext=%u sect_size=%u " + "nextblk=%lu nextoff=%lu\n", __func__, + b_off, firstext, (unsigned) sect_size, + nextblk, nextoff); + goto abort; + } + } + + if (*bh) { + map_bh(*bh, inode->i_sb, firstext + b_off - offset); + } else { + *bh = sb_getblk(inode->i_sb, firstext+b_off-offset); + if (!*bh) + goto abort; + } + bh++; /* Next buffer head */ + b_off++; /* Next buffer offset */ + nblocks--; + rv++; + } + + error = 0; +abort: + return rv != 0 ? rv : error; +} + +/* + * Used by the standard interfaces. + */ +static int isofs_get_block(struct inode *inode, sector_t iblock, + struct buffer_head *bh_result, int create) +{ + int ret; + + if (create) { + printk(KERN_DEBUG "%s: Kernel tries to allocate a block\n", __func__); + return -EROFS; + } + + ret = isofs_get_blocks(inode, iblock, &bh_result, 1); + return ret < 0 ? ret : 0; +} + +static int isofs_bmap(struct inode *inode, sector_t block) +{ + struct buffer_head dummy; + int error; + + dummy.b_state = 0; + dummy.b_blocknr = -1000; + error = isofs_get_block(inode, block, &dummy, 0); + if (!error) + return dummy.b_blocknr; + return 0; +} + +struct buffer_head *isofs_bread(struct inode *inode, sector_t block) +{ + sector_t blknr = isofs_bmap(inode, block); + if (!blknr) + return NULL; + return sb_bread(inode->i_sb, blknr); +} + +static int isofs_readpage(struct file *file, struct page *page) +{ + return mpage_readpage(page, isofs_get_block); +} + +static int isofs_readpages(struct file *file, struct address_space *mapping, + struct list_head *pages, unsigned nr_pages) +{ + return mpage_readpages(mapping, pages, nr_pages, isofs_get_block); +} + +static sector_t _isofs_bmap(struct address_space *mapping, sector_t block) +{ + return generic_block_bmap(mapping,block,isofs_get_block); +} + +static const struct address_space_operations isofs_aops = { + .readpage = isofs_readpage, + .readpages = isofs_readpages, + .bmap = _isofs_bmap +}; + +static int isofs_read_level3_size(struct inode *inode) +{ + unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); + int high_sierra = ISOFS_SB(inode->i_sb)->s_high_sierra; + struct buffer_head *bh = NULL; + unsigned long block, offset, block_saved, offset_saved; + int i = 0; + int more_entries = 0; + struct iso_directory_record *tmpde = NULL; + struct iso_inode_info *ei = ISOFS_I(inode); + + inode->i_size = 0; + + /* The first 16 blocks are reserved as the System Area. Thus, + * no inodes can appear in block 0. We use this to flag that + * this is the last section. */ + ei->i_next_section_block = 0; + ei->i_next_section_offset = 0; + + block = ei->i_iget5_block; + offset = ei->i_iget5_offset; + + do { + struct iso_directory_record *de; + unsigned int de_len; + + if (!bh) { + bh = sb_bread(inode->i_sb, block); + if (!bh) + goto out_noread; + } + de = (struct iso_directory_record *) (bh->b_data + offset); + de_len = *(unsigned char *) de; + + if (de_len == 0) { + brelse(bh); + bh = NULL; + ++block; + offset = 0; + continue; + } + + block_saved = block; + offset_saved = offset; + offset += de_len; + + /* Make sure we have a full directory entry */ + if (offset >= bufsize) { + int slop = bufsize - offset + de_len; + if (!tmpde) { + tmpde = kmalloc(256, GFP_KERNEL); + if (!tmpde) + goto out_nomem; + } + memcpy(tmpde, de, slop); + offset &= bufsize - 1; + block++; + brelse(bh); + bh = NULL; + if (offset) { + bh = sb_bread(inode->i_sb, block); + if (!bh) + goto out_noread; + memcpy((void *)tmpde+slop, bh->b_data, offset); + } + de = tmpde; + } + + inode->i_size += isonum_733(de->size); + if (i == 1) { + ei->i_next_section_block = block_saved; + ei->i_next_section_offset = offset_saved; + } + + more_entries = de->flags[-high_sierra] & 0x80; + + i++; + if (i > 100) + goto out_toomany; + } while (more_entries); +out: + kfree(tmpde); + if (bh) + brelse(bh); + return 0; + +out_nomem: + if (bh) + brelse(bh); + return -ENOMEM; + +out_noread: + printk(KERN_INFO "ISOFS: unable to read i-node block %lu\n", block); + kfree(tmpde); + return -EIO; + +out_toomany: + printk(KERN_INFO "%s: More than 100 file sections ?!?, aborting...\n" + "isofs_read_level3_size: inode=%lu\n", + __func__, inode->i_ino); + goto out; +} + +static int isofs_read_inode(struct inode *inode, int relocated) +{ + struct super_block *sb = inode->i_sb; + struct isofs_sb_info *sbi = ISOFS_SB(sb); + unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); + unsigned long block; + int high_sierra = sbi->s_high_sierra; + struct buffer_head *bh = NULL; + struct iso_directory_record *de; + struct iso_directory_record *tmpde = NULL; + unsigned int de_len; + unsigned long offset; + struct iso_inode_info *ei = ISOFS_I(inode); + int ret = -EIO; + + block = ei->i_iget5_block; + bh = sb_bread(inode->i_sb, block); + if (!bh) + goto out_badread; + + offset = ei->i_iget5_offset; + + de = (struct iso_directory_record *) (bh->b_data + offset); + de_len = *(unsigned char *) de; + + if (offset + de_len > bufsize) { + int frag1 = bufsize - offset; + + tmpde = kmalloc(de_len, GFP_KERNEL); + if (tmpde == NULL) { + printk(KERN_INFO "%s: out of memory\n", __func__); + ret = -ENOMEM; + goto fail; + } + memcpy(tmpde, bh->b_data + offset, frag1); + brelse(bh); + bh = sb_bread(inode->i_sb, ++block); + if (!bh) + goto out_badread; + memcpy((char *)tmpde+frag1, bh->b_data, de_len - frag1); + de = tmpde; + } + + inode->i_ino = isofs_get_ino(ei->i_iget5_block, + ei->i_iget5_offset, + ISOFS_BUFFER_BITS(inode)); + + /* Assume it is a normal-format file unless told otherwise */ + ei->i_file_format = isofs_file_normal; + + if (de->flags[-high_sierra] & 2) { + if (sbi->s_dmode != ISOFS_INVALID_MODE) + inode->i_mode = S_IFDIR | sbi->s_dmode; + else + inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO; + set_nlink(inode, 1); /* + * Set to 1. We know there are 2, but + * the find utility tries to optimize + * if it is 2, and it screws up. It is + * easier to give 1 which tells find to + * do it the hard way. + */ + } else { + if (sbi->s_fmode != ISOFS_INVALID_MODE) { + inode->i_mode = S_IFREG | sbi->s_fmode; + } else { + /* + * Set default permissions: r-x for all. The disc + * could be shared with DOS machines so virtually + * anything could be a valid executable. + */ + inode->i_mode = S_IFREG | S_IRUGO | S_IXUGO; + } + set_nlink(inode, 1); + } + inode->i_uid = sbi->s_uid; + inode->i_gid = sbi->s_gid; + inode->i_blocks = 0; + + ei->i_format_parm[0] = 0; + ei->i_format_parm[1] = 0; + ei->i_format_parm[2] = 0; + + ei->i_section_size = isonum_733(de->size); + if (de->flags[-high_sierra] & 0x80) { + ret = isofs_read_level3_size(inode); + if (ret < 0) + goto fail; + ret = -EIO; + } else { + ei->i_next_section_block = 0; + ei->i_next_section_offset = 0; + inode->i_size = isonum_733(de->size); + } + + /* + * Some dipshit decided to store some other bit of information + * in the high byte of the file length. Truncate size in case + * this CDROM was mounted with the cruft option. + */ + + if (sbi->s_cruft) + inode->i_size &= 0x00ffffff; + + if (de->interleave[0]) { + printk(KERN_DEBUG "ISOFS: Interleaved files not (yet) supported.\n"); + inode->i_size = 0; + } + + /* I have no idea what file_unit_size is used for, so + we will flag it for now */ + if (de->file_unit_size[0] != 0) { + printk(KERN_DEBUG "ISOFS: File unit size != 0 for ISO file (%ld).\n", + inode->i_ino); + } + + /* I have no idea what other flag bits are used for, so + we will flag it for now */ +#ifdef DEBUG + if((de->flags[-high_sierra] & ~2)!= 0){ + printk(KERN_DEBUG "ISOFS: Unusual flag settings for ISO file " + "(%ld %x).\n", + inode->i_ino, de->flags[-high_sierra]); + } +#endif + + inode->i_mtime.tv_sec = + inode->i_atime.tv_sec = + inode->i_ctime.tv_sec = iso_date(de->date, high_sierra); + inode->i_mtime.tv_nsec = + inode->i_atime.tv_nsec = + inode->i_ctime.tv_nsec = 0; + + ei->i_first_extent = (isonum_733(de->extent) + + isonum_711(de->ext_attr_length)); + + /* Set the number of blocks for stat() - should be done before RR */ + inode->i_blocks = (inode->i_size + 511) >> 9; + + /* + * Now test for possible Rock Ridge extensions which will override + * some of these numbers in the inode structure. + */ + + if (!high_sierra) { + parse_rock_ridge_inode(de, inode, relocated); + /* if we want uid/gid set, override the rock ridge setting */ + if (sbi->s_uid_set) + inode->i_uid = sbi->s_uid; + if (sbi->s_gid_set) + inode->i_gid = sbi->s_gid; + } + /* Now set final access rights if overriding rock ridge setting */ + if (S_ISDIR(inode->i_mode) && sbi->s_overriderockperm && + sbi->s_dmode != ISOFS_INVALID_MODE) + inode->i_mode = S_IFDIR | sbi->s_dmode; + if (S_ISREG(inode->i_mode) && sbi->s_overriderockperm && + sbi->s_fmode != ISOFS_INVALID_MODE) + inode->i_mode = S_IFREG | sbi->s_fmode; + + /* Install the inode operations vector */ + if (S_ISREG(inode->i_mode)) { + inode->i_fop = &generic_ro_fops; + switch (ei->i_file_format) { +#ifdef CONFIG_ZISOFS + case isofs_file_compressed: + inode->i_data.a_ops = &zisofs_aops; + break; +#endif + default: + inode->i_data.a_ops = &isofs_aops; + break; + } + } else if (S_ISDIR(inode->i_mode)) { + inode->i_op = &isofs_dir_inode_operations; + inode->i_fop = &isofs_dir_operations; + } else if (S_ISLNK(inode->i_mode)) { + inode->i_op = &page_symlink_inode_operations; + inode_nohighmem(inode); + inode->i_data.a_ops = &isofs_symlink_aops; + } else + /* XXX - parse_rock_ridge_inode() had already set i_rdev. */ + init_special_inode(inode, inode->i_mode, inode->i_rdev); + + ret = 0; +out: + kfree(tmpde); + if (bh) + brelse(bh); + return ret; + +out_badread: + printk(KERN_WARNING "ISOFS: unable to read i-node block\n"); +fail: + goto out; +} + +struct isofs_iget5_callback_data { + unsigned long block; + unsigned long offset; +}; + +static int isofs_iget5_test(struct inode *ino, void *data) +{ + struct iso_inode_info *i = ISOFS_I(ino); + struct isofs_iget5_callback_data *d = + (struct isofs_iget5_callback_data*)data; + return (i->i_iget5_block == d->block) + && (i->i_iget5_offset == d->offset); +} + +static int isofs_iget5_set(struct inode *ino, void *data) +{ + struct iso_inode_info *i = ISOFS_I(ino); + struct isofs_iget5_callback_data *d = + (struct isofs_iget5_callback_data*)data; + i->i_iget5_block = d->block; + i->i_iget5_offset = d->offset; + return 0; +} + +/* Store, in the inode's containing structure, the block and block + * offset that point to the underlying meta-data for the inode. The + * code below is otherwise similar to the iget() code in + * include/linux/fs.h */ +struct inode *__isofs_iget(struct super_block *sb, + unsigned long block, + unsigned long offset, + int relocated) +{ + unsigned long hashval; + struct inode *inode; + struct isofs_iget5_callback_data data; + long ret; + + if (offset >= 1ul << sb->s_blocksize_bits) + return ERR_PTR(-EINVAL); + + data.block = block; + data.offset = offset; + + hashval = (block << sb->s_blocksize_bits) | offset; + + inode = iget5_locked(sb, hashval, &isofs_iget5_test, + &isofs_iget5_set, &data); + + if (!inode) + return ERR_PTR(-ENOMEM); + + if (inode->i_state & I_NEW) { + ret = isofs_read_inode(inode, relocated); + if (ret < 0) { + iget_failed(inode); + inode = ERR_PTR(ret); + } else { + unlock_new_inode(inode); + } + } + + return inode; +} + +static struct dentry *isofs_mount(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data) +{ + return mount_bdev(fs_type, flags, dev_name, data, isofs_fill_super); +} + +static struct file_system_type iso9660_fs_type = { + .owner = THIS_MODULE, + .name = "iso9660", + .mount = isofs_mount, + .kill_sb = kill_block_super, + .fs_flags = FS_REQUIRES_DEV, +}; +MODULE_ALIAS_FS("iso9660"); +MODULE_ALIAS("iso9660"); + +static int __init init_iso9660_fs(void) +{ + int err = init_inodecache(); + if (err) + goto out; +#ifdef CONFIG_ZISOFS + err = zisofs_init(); + if (err) + goto out1; +#endif + err = register_filesystem(&iso9660_fs_type); + if (err) + goto out2; + return 0; +out2: +#ifdef CONFIG_ZISOFS + zisofs_cleanup(); +out1: +#endif + destroy_inodecache(); +out: + return err; +} + +static void __exit exit_iso9660_fs(void) +{ + unregister_filesystem(&iso9660_fs_type); +#ifdef CONFIG_ZISOFS + zisofs_cleanup(); +#endif + destroy_inodecache(); +} + +module_init(init_iso9660_fs) +module_exit(exit_iso9660_fs) +MODULE_LICENSE("GPL"); diff --git a/vendor/linux/fs/isofs/isofs.h b/vendor/linux/fs/isofs/isofs.h new file mode 100644 index 0000000..0ac4c1f --- /dev/null +++ b/vendor/linux/fs/isofs/isofs.h @@ -0,0 +1,198 @@ +#include +#include +#include +#include +#include + +enum isofs_file_format { + isofs_file_normal = 0, + isofs_file_sparse = 1, + isofs_file_compressed = 2, +}; + +/* + * iso fs inode data in memory + */ +struct iso_inode_info { + unsigned long i_iget5_block; + unsigned long i_iget5_offset; + unsigned int i_first_extent; + unsigned char i_file_format; + unsigned char i_format_parm[3]; + unsigned long i_next_section_block; + unsigned long i_next_section_offset; + off_t i_section_size; + struct inode vfs_inode; +}; + +/* + * iso9660 super-block data in memory + */ +struct isofs_sb_info { + unsigned long s_ninodes; + unsigned long s_nzones; + unsigned long s_firstdatazone; + unsigned long s_log_zone_size; + unsigned long s_max_size; + + int s_rock_offset; /* offset of SUSP fields within SU area */ + unsigned char s_joliet_level; + unsigned char s_mapping; + unsigned int s_high_sierra:1; + unsigned int s_rock:2; + unsigned int s_utf8:1; + unsigned int s_cruft:1; /* Broken disks with high byte of length + * containing junk */ + unsigned int s_nocompress:1; + unsigned int s_hide:1; + unsigned int s_showassoc:1; + unsigned int s_overriderockperm:1; + unsigned int s_uid_set:1; + unsigned int s_gid_set:1; + + umode_t s_fmode; + umode_t s_dmode; + kgid_t s_gid; + kuid_t s_uid; + struct nls_table *s_nls_iocharset; /* Native language support table */ +}; + +#define ISOFS_INVALID_MODE ((umode_t) -1) + +static inline struct isofs_sb_info *ISOFS_SB(struct super_block *sb) +{ + return sb->s_fs_info; +} + +static inline struct iso_inode_info *ISOFS_I(struct inode *inode) +{ + return container_of(inode, struct iso_inode_info, vfs_inode); +} + +static inline int isonum_711(char *p) +{ + return *(u8 *)p; +} +static inline int isonum_712(char *p) +{ + return *(s8 *)p; +} +static inline unsigned int isonum_721(char *p) +{ + return get_unaligned_le16(p); +} +static inline unsigned int isonum_722(char *p) +{ + return get_unaligned_be16(p); +} +static inline unsigned int isonum_723(char *p) +{ + /* Ignore bigendian datum due to broken mastering programs */ + return get_unaligned_le16(p); +} +static inline unsigned int isonum_731(char *p) +{ + return get_unaligned_le32(p); +} +static inline unsigned int isonum_732(char *p) +{ + return get_unaligned_be32(p); +} +static inline unsigned int isonum_733(char *p) +{ + /* Ignore bigendian datum due to broken mastering programs */ + return get_unaligned_le32(p); +} +extern int iso_date(char *, int); + +struct inode; /* To make gcc happy */ + +extern int parse_rock_ridge_inode(struct iso_directory_record *, struct inode *, int relocated); +extern int get_rock_ridge_filename(struct iso_directory_record *, char *, struct inode *); +extern int isofs_name_translate(struct iso_directory_record *, char *, struct inode *); + +int get_joliet_filename(struct iso_directory_record *, unsigned char *, struct inode *); +int get_acorn_filename(struct iso_directory_record *, char *, struct inode *); + +extern struct dentry *isofs_lookup(struct inode *, struct dentry *, unsigned int flags); +extern struct buffer_head *isofs_bread(struct inode *, sector_t); +extern int isofs_get_blocks(struct inode *, sector_t, struct buffer_head **, unsigned long); + +struct inode *__isofs_iget(struct super_block *sb, + unsigned long block, + unsigned long offset, + int relocated); + +static inline struct inode *isofs_iget(struct super_block *sb, + unsigned long block, + unsigned long offset) +{ + return __isofs_iget(sb, block, offset, 0); +} + +static inline struct inode *isofs_iget_reloc(struct super_block *sb, + unsigned long block, + unsigned long offset) +{ + return __isofs_iget(sb, block, offset, 1); +} + +/* Because the inode number is no longer relevant to finding the + * underlying meta-data for an inode, we are free to choose a more + * convenient 32-bit number as the inode number. The inode numbering + * scheme was recommended by Sergey Vlasov and Eric Lammerts. */ +static inline unsigned long isofs_get_ino(unsigned long block, + unsigned long offset, + unsigned long bufbits) +{ + return (block << (bufbits - 5)) | (offset >> 5); +} + +/* Every directory can have many redundant directory entries scattered + * throughout the directory tree. First there is the directory entry + * with the name of the directory stored in the parent directory. + * Then, there is the "." directory entry stored in the directory + * itself. Finally, there are possibly many ".." directory entries + * stored in all the subdirectories. + * + * In order for the NFS get_parent() method to work and for the + * general consistency of the dcache, we need to make sure the + * "i_iget5_block" and "i_iget5_offset" all point to exactly one of + * the many redundant entries for each directory. We normalize the + * block and offset by always making them point to the "." directory. + * + * Notice that we do not use the entry for the directory with the name + * that is located in the parent directory. Even though choosing this + * first directory is more natural, it is much easier to find the "." + * entry in the NFS get_parent() method because it is implicitly + * encoded in the "extent + ext_attr_length" fields of _all_ the + * redundant entries for the directory. Thus, it can always be + * reached regardless of which directory entry you have in hand. + * + * This works because the "." entry is simply the first directory + * record when you start reading the file that holds all the directory + * records, and this file starts at "extent + ext_attr_length" blocks. + * Because the "." entry is always the first entry listed in the + * directories file, the normalized "offset" value is always 0. + * + * You should pass the directory entry in "de". On return, "block" + * and "offset" will hold normalized values. Only directories are + * affected making it safe to call even for non-directory file + * types. */ +static inline void +isofs_normalize_block_and_offset(struct iso_directory_record* de, + unsigned long *block, + unsigned long *offset) +{ + /* Only directories are normalized. */ + if (de->flags[0] & 2) { + *offset = 0; + *block = (unsigned long)isonum_733(de->extent) + + (unsigned long)isonum_711(de->ext_attr_length); + } +} + +extern const struct inode_operations isofs_dir_inode_operations; +extern const struct file_operations isofs_dir_operations; +extern const struct address_space_operations isofs_symlink_aops; +extern const struct export_operations isofs_export_ops; diff --git a/vendor/linux/fs/isofs/joliet.c b/vendor/linux/fs/isofs/joliet.c new file mode 100644 index 0000000..a048de8 --- /dev/null +++ b/vendor/linux/fs/isofs/joliet.c @@ -0,0 +1,69 @@ +/* + * linux/fs/isofs/joliet.c + * + * (C) 1996 Gordon Chaffee + * + * Joliet: Microsoft's Unicode extensions to iso9660 + */ + +#include +#include +#include "isofs.h" + +/* + * Convert Unicode 16 to UTF-8 or ASCII. + */ +static int +uni16_to_x8(unsigned char *ascii, __be16 *uni, int len, struct nls_table *nls) +{ + __be16 *ip, ch; + unsigned char *op; + + ip = uni; + op = ascii; + + while ((ch = get_unaligned(ip)) && len) { + int llen; + llen = nls->uni2char(be16_to_cpu(ch), op, NLS_MAX_CHARSET_SIZE); + if (llen > 0) + op += llen; + else + *op++ = '?'; + ip++; + + len--; + } + *op = 0; + return (op - ascii); +} + +int +get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, struct inode * inode) +{ + unsigned char utf8; + struct nls_table *nls; + unsigned char len = 0; + + utf8 = ISOFS_SB(inode->i_sb)->s_utf8; + nls = ISOFS_SB(inode->i_sb)->s_nls_iocharset; + + if (utf8) { + len = utf16s_to_utf8s((const wchar_t *) de->name, + de->name_len[0] >> 1, UTF16_BIG_ENDIAN, + outname, PAGE_SIZE); + } else { + len = uni16_to_x8(outname, (__be16 *) de->name, + de->name_len[0] >> 1, nls); + } + if ((len > 2) && (outname[len-2] == ';') && (outname[len-1] == '1')) + len -= 2; + + /* + * Windows doesn't like periods at the end of a name, + * so neither do we + */ + while (len >= 2 && (outname[len-1] == '.')) + len--; + + return len; +} diff --git a/vendor/linux/fs/isofs/namei.c b/vendor/linux/fs/isofs/namei.c new file mode 100644 index 0000000..aee5927 --- /dev/null +++ b/vendor/linux/fs/isofs/namei.c @@ -0,0 +1,172 @@ +/* + * linux/fs/isofs/namei.c + * + * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. + * + * (C) 1991 Linus Torvalds - minix filesystem + */ + +#include +#include "isofs.h" + +/* + * ok, we cannot use strncmp, as the name is not in our data space. + * Thus we'll have to use isofs_match. No big problem. Match also makes + * some sanity tests. + */ +static int +isofs_cmp(struct dentry *dentry, const char *compare, int dlen) +{ + struct qstr qstr; + qstr.name = compare; + qstr.len = dlen; + if (likely(!dentry->d_op)) + return dentry->d_name.len != dlen || memcmp(dentry->d_name.name, compare, dlen); + return dentry->d_op->d_compare(NULL, dentry->d_name.len, dentry->d_name.name, &qstr); +} + +/* + * isofs_find_entry() + * + * finds an entry in the specified directory with the wanted name. It + * returns the inode number of the found entry, or 0 on error. + */ +static unsigned long +isofs_find_entry(struct inode *dir, struct dentry *dentry, + unsigned long *block_rv, unsigned long *offset_rv, + char *tmpname, struct iso_directory_record *tmpde) +{ + unsigned long bufsize = ISOFS_BUFFER_SIZE(dir); + unsigned char bufbits = ISOFS_BUFFER_BITS(dir); + unsigned long block, f_pos, offset, block_saved, offset_saved; + struct buffer_head *bh = NULL; + struct isofs_sb_info *sbi = ISOFS_SB(dir->i_sb); + + if (!ISOFS_I(dir)->i_first_extent) + return 0; + + f_pos = 0; + offset = 0; + block = 0; + + while (f_pos < dir->i_size) { + struct iso_directory_record *de; + int de_len, match, i, dlen; + char *dpnt; + + if (!bh) { + bh = isofs_bread(dir, block); + if (!bh) + return 0; + } + + de = (struct iso_directory_record *) (bh->b_data + offset); + + de_len = *(unsigned char *) de; + if (!de_len) { + brelse(bh); + bh = NULL; + f_pos = (f_pos + ISOFS_BLOCK_SIZE) & ~(ISOFS_BLOCK_SIZE - 1); + block = f_pos >> bufbits; + offset = 0; + continue; + } + + block_saved = bh->b_blocknr; + offset_saved = offset; + offset += de_len; + f_pos += de_len; + + /* Make sure we have a full directory entry */ + if (offset >= bufsize) { + int slop = bufsize - offset + de_len; + memcpy(tmpde, de, slop); + offset &= bufsize - 1; + block++; + brelse(bh); + bh = NULL; + if (offset) { + bh = isofs_bread(dir, block); + if (!bh) + return 0; + memcpy((void *) tmpde + slop, bh->b_data, offset); + } + de = tmpde; + } + + dlen = de->name_len[0]; + dpnt = de->name; + /* Basic sanity check, whether name doesn't exceed dir entry */ + if (de_len < dlen + sizeof(struct iso_directory_record)) { + printk(KERN_NOTICE "iso9660: Corrupted directory entry" + " in block %lu of inode %lu\n", block, + dir->i_ino); + return 0; + } + + if (sbi->s_rock && + ((i = get_rock_ridge_filename(de, tmpname, dir)))) { + dlen = i; /* possibly -1 */ + dpnt = tmpname; +#ifdef CONFIG_JOLIET + } else if (sbi->s_joliet_level) { + dlen = get_joliet_filename(de, tmpname, dir); + dpnt = tmpname; +#endif + } else if (sbi->s_mapping == 'a') { + dlen = get_acorn_filename(de, tmpname, dir); + dpnt = tmpname; + } else if (sbi->s_mapping == 'n') { + dlen = isofs_name_translate(de, tmpname, dir); + dpnt = tmpname; + } + + /* + * Skip hidden or associated files unless hide or showassoc, + * respectively, is set + */ + match = 0; + if (dlen > 0 && + (!sbi->s_hide || + (!(de->flags[-sbi->s_high_sierra] & 1))) && + (sbi->s_showassoc || + (!(de->flags[-sbi->s_high_sierra] & 4)))) { + if (dpnt && (dlen > 1 || dpnt[0] > 1)) + match = (isofs_cmp(dentry, dpnt, dlen) == 0); + } + if (match) { + isofs_normalize_block_and_offset(de, + &block_saved, + &offset_saved); + *block_rv = block_saved; + *offset_rv = offset_saved; + brelse(bh); + return 1; + } + } + brelse(bh); + return 0; +} + +struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) +{ + int found; + unsigned long uninitialized_var(block); + unsigned long uninitialized_var(offset); + struct inode *inode; + struct page *page; + + page = alloc_page(GFP_USER); + if (!page) + return ERR_PTR(-ENOMEM); + + found = isofs_find_entry(dir, dentry, + &block, &offset, + page_address(page), + 1024 + page_address(page)); + __free_page(page); + + inode = found ? isofs_iget(dir->i_sb, block, offset) : NULL; + + return d_splice_alias(inode, dentry); +} diff --git a/vendor/linux/fs/isofs/rock.c b/vendor/linux/fs/isofs/rock.c new file mode 100644 index 0000000..0ec1373 --- /dev/null +++ b/vendor/linux/fs/isofs/rock.c @@ -0,0 +1,806 @@ +/* + * linux/fs/isofs/rock.c + * + * (C) 1992, 1993 Eric Youngdale + * + * Rock Ridge Extensions to iso9660 + */ + +#include +#include + +#include "isofs.h" +#include "rock.h" + +/* + * These functions are designed to read the system areas of a directory record + * and extract relevant information. There are different functions provided + * depending upon what information we need at the time. One function fills + * out an inode structure, a second one extracts a filename, a third one + * returns a symbolic link name, and a fourth one returns the extent number + * for the file. + */ + +#define SIG(A,B) ((A) | ((B) << 8)) /* isonum_721() */ + +struct rock_state { + void *buffer; + unsigned char *chr; + int len; + int cont_size; + int cont_extent; + int cont_offset; + int cont_loops; + struct inode *inode; +}; + +/* + * This is a way of ensuring that we have something in the system + * use fields that is compatible with Rock Ridge. Return zero on success. + */ + +static int check_sp(struct rock_ridge *rr, struct inode *inode) +{ + if (rr->u.SP.magic[0] != 0xbe) + return -1; + if (rr->u.SP.magic[1] != 0xef) + return -1; + ISOFS_SB(inode->i_sb)->s_rock_offset = rr->u.SP.skip; + return 0; +} + +static void setup_rock_ridge(struct iso_directory_record *de, + struct inode *inode, struct rock_state *rs) +{ + rs->len = sizeof(struct iso_directory_record) + de->name_len[0]; + if (rs->len & 1) + (rs->len)++; + rs->chr = (unsigned char *)de + rs->len; + rs->len = *((unsigned char *)de) - rs->len; + if (rs->len < 0) + rs->len = 0; + + if (ISOFS_SB(inode->i_sb)->s_rock_offset != -1) { + rs->len -= ISOFS_SB(inode->i_sb)->s_rock_offset; + rs->chr += ISOFS_SB(inode->i_sb)->s_rock_offset; + if (rs->len < 0) + rs->len = 0; + } +} + +static void init_rock_state(struct rock_state *rs, struct inode *inode) +{ + memset(rs, 0, sizeof(*rs)); + rs->inode = inode; +} + +/* Maximum number of Rock Ridge continuation entries */ +#define RR_MAX_CE_ENTRIES 32 + +/* + * Returns 0 if the caller should continue scanning, 1 if the scan must end + * and -ve on error. + */ +static int rock_continue(struct rock_state *rs) +{ + int ret = 1; + int blocksize = 1 << rs->inode->i_blkbits; + const int min_de_size = offsetof(struct rock_ridge, u); + + kfree(rs->buffer); + rs->buffer = NULL; + + if ((unsigned)rs->cont_offset > blocksize - min_de_size || + (unsigned)rs->cont_size > blocksize || + (unsigned)(rs->cont_offset + rs->cont_size) > blocksize) { + printk(KERN_NOTICE "rock: corrupted directory entry. " + "extent=%d, offset=%d, size=%d\n", + rs->cont_extent, rs->cont_offset, rs->cont_size); + ret = -EIO; + goto out; + } + + if (rs->cont_extent) { + struct buffer_head *bh; + + rs->buffer = kmalloc(rs->cont_size, GFP_KERNEL); + if (!rs->buffer) { + ret = -ENOMEM; + goto out; + } + ret = -EIO; + if (++rs->cont_loops >= RR_MAX_CE_ENTRIES) + goto out; + bh = sb_bread(rs->inode->i_sb, rs->cont_extent); + if (bh) { + memcpy(rs->buffer, bh->b_data + rs->cont_offset, + rs->cont_size); + put_bh(bh); + rs->chr = rs->buffer; + rs->len = rs->cont_size; + rs->cont_extent = 0; + rs->cont_size = 0; + rs->cont_offset = 0; + return 0; + } + printk("Unable to read rock-ridge attributes\n"); + } +out: + kfree(rs->buffer); + rs->buffer = NULL; + return ret; +} + +/* + * We think there's a record of type `sig' at rs->chr. Parse the signature + * and make sure that there's really room for a record of that type. + */ +static int rock_check_overflow(struct rock_state *rs, int sig) +{ + int len; + + switch (sig) { + case SIG('S', 'P'): + len = sizeof(struct SU_SP_s); + break; + case SIG('C', 'E'): + len = sizeof(struct SU_CE_s); + break; + case SIG('E', 'R'): + len = sizeof(struct SU_ER_s); + break; + case SIG('R', 'R'): + len = sizeof(struct RR_RR_s); + break; + case SIG('P', 'X'): + len = sizeof(struct RR_PX_s); + break; + case SIG('P', 'N'): + len = sizeof(struct RR_PN_s); + break; + case SIG('S', 'L'): + len = sizeof(struct RR_SL_s); + break; + case SIG('N', 'M'): + len = sizeof(struct RR_NM_s); + break; + case SIG('C', 'L'): + len = sizeof(struct RR_CL_s); + break; + case SIG('P', 'L'): + len = sizeof(struct RR_PL_s); + break; + case SIG('T', 'F'): + len = sizeof(struct RR_TF_s); + break; + case SIG('Z', 'F'): + len = sizeof(struct RR_ZF_s); + break; + default: + len = 0; + break; + } + len += offsetof(struct rock_ridge, u); + if (len > rs->len) { + printk(KERN_NOTICE "rock: directory entry would overflow " + "storage\n"); + printk(KERN_NOTICE "rock: sig=0x%02x, size=%d, remaining=%d\n", + sig, len, rs->len); + return -EIO; + } + return 0; +} + +/* + * return length of name field; 0: not found, -1: to be ignored + */ +int get_rock_ridge_filename(struct iso_directory_record *de, + char *retname, struct inode *inode) +{ + struct rock_state rs; + struct rock_ridge *rr; + int sig; + int retnamlen = 0; + int truncate = 0; + int ret = 0; + char *p; + int len; + + if (!ISOFS_SB(inode->i_sb)->s_rock) + return 0; + *retname = 0; + + init_rock_state(&rs, inode); + setup_rock_ridge(de, inode, &rs); +repeat: + + while (rs.len > 2) { /* There may be one byte for padding somewhere */ + rr = (struct rock_ridge *)rs.chr; + /* + * Ignore rock ridge info if rr->len is out of range, but + * don't return -EIO because that would make the file + * invisible. + */ + if (rr->len < 3) + goto out; /* Something got screwed up here */ + sig = isonum_721(rs.chr); + if (rock_check_overflow(&rs, sig)) + goto eio; + rs.chr += rr->len; + rs.len -= rr->len; + /* + * As above, just ignore the rock ridge info if rr->len + * is bogus. + */ + if (rs.len < 0) + goto out; /* Something got screwed up here */ + + switch (sig) { + case SIG('R', 'R'): + if ((rr->u.RR.flags[0] & RR_NM) == 0) + goto out; + break; + case SIG('S', 'P'): + if (check_sp(rr, inode)) + goto out; + break; + case SIG('C', 'E'): + rs.cont_extent = isonum_733(rr->u.CE.extent); + rs.cont_offset = isonum_733(rr->u.CE.offset); + rs.cont_size = isonum_733(rr->u.CE.size); + break; + case SIG('N', 'M'): + if (truncate) + break; + if (rr->len < 5) + break; + /* + * If the flags are 2 or 4, this indicates '.' or '..'. + * We don't want to do anything with this, because it + * screws up the code that calls us. We don't really + * care anyways, since we can just use the non-RR + * name. + */ + if (rr->u.NM.flags & 6) + break; + + if (rr->u.NM.flags & ~1) { + printk("Unsupported NM flag settings (%d)\n", + rr->u.NM.flags); + break; + } + len = rr->len - 5; + if (retnamlen + len >= 254) { + truncate = 1; + break; + } + p = memchr(rr->u.NM.name, '\0', len); + if (unlikely(p)) + len = p - rr->u.NM.name; + memcpy(retname + retnamlen, rr->u.NM.name, len); + retnamlen += len; + retname[retnamlen] = '\0'; + break; + case SIG('R', 'E'): + kfree(rs.buffer); + return -1; + default: + break; + } + } + ret = rock_continue(&rs); + if (ret == 0) + goto repeat; + if (ret == 1) + return retnamlen; /* If 0, this file did not have a NM field */ +out: + kfree(rs.buffer); + return ret; +eio: + ret = -EIO; + goto out; +} + +#define RR_REGARD_XA 1 +#define RR_RELOC_DE 2 + +static int +parse_rock_ridge_inode_internal(struct iso_directory_record *de, + struct inode *inode, int flags) +{ + int symlink_len = 0; + int cnt, sig; + unsigned int reloc_block; + struct inode *reloc; + struct rock_ridge *rr; + int rootflag; + struct rock_state rs; + int ret = 0; + + if (!ISOFS_SB(inode->i_sb)->s_rock) + return 0; + + init_rock_state(&rs, inode); + setup_rock_ridge(de, inode, &rs); + if (flags & RR_REGARD_XA) { + rs.chr += 14; + rs.len -= 14; + if (rs.len < 0) + rs.len = 0; + } + +repeat: + while (rs.len > 2) { /* There may be one byte for padding somewhere */ + rr = (struct rock_ridge *)rs.chr; + /* + * Ignore rock ridge info if rr->len is out of range, but + * don't return -EIO because that would make the file + * invisible. + */ + if (rr->len < 3) + goto out; /* Something got screwed up here */ + sig = isonum_721(rs.chr); + if (rock_check_overflow(&rs, sig)) + goto eio; + rs.chr += rr->len; + rs.len -= rr->len; + /* + * As above, just ignore the rock ridge info if rr->len + * is bogus. + */ + if (rs.len < 0) + goto out; /* Something got screwed up here */ + + switch (sig) { +#ifndef CONFIG_ZISOFS /* No flag for SF or ZF */ + case SIG('R', 'R'): + if ((rr->u.RR.flags[0] & + (RR_PX | RR_TF | RR_SL | RR_CL)) == 0) + goto out; + break; +#endif + case SIG('S', 'P'): + if (check_sp(rr, inode)) + goto out; + break; + case SIG('C', 'E'): + rs.cont_extent = isonum_733(rr->u.CE.extent); + rs.cont_offset = isonum_733(rr->u.CE.offset); + rs.cont_size = isonum_733(rr->u.CE.size); + break; + case SIG('E', 'R'): + /* Invalid length of ER tag id? */ + if (rr->u.ER.len_id + offsetof(struct rock_ridge, u.ER.data) > rr->len) + goto out; + ISOFS_SB(inode->i_sb)->s_rock = 1; + printk(KERN_DEBUG "ISO 9660 Extensions: "); + { + int p; + for (p = 0; p < rr->u.ER.len_id; p++) + printk(KERN_CONT "%c", rr->u.ER.data[p]); + } + printk(KERN_CONT "\n"); + break; + case SIG('P', 'X'): + inode->i_mode = isonum_733(rr->u.PX.mode); + set_nlink(inode, isonum_733(rr->u.PX.n_links)); + i_uid_write(inode, isonum_733(rr->u.PX.uid)); + i_gid_write(inode, isonum_733(rr->u.PX.gid)); + break; + case SIG('P', 'N'): + { + int high, low; + high = isonum_733(rr->u.PN.dev_high); + low = isonum_733(rr->u.PN.dev_low); + /* + * The Rock Ridge standard specifies that if + * sizeof(dev_t) <= 4, then the high field is + * unused, and the device number is completely + * stored in the low field. Some writers may + * ignore this subtlety, + * and as a result we test to see if the entire + * device number is + * stored in the low field, and use that. + */ + if ((low & ~0xff) && high == 0) { + inode->i_rdev = + MKDEV(low >> 8, low & 0xff); + } else { + inode->i_rdev = + MKDEV(high, low); + } + } + break; + case SIG('T', 'F'): + /* + * Some RRIP writers incorrectly place ctime in the + * TF_CREATE field. Try to handle this correctly for + * either case. + */ + /* Rock ridge never appears on a High Sierra disk */ + cnt = 0; + if (rr->u.TF.flags & TF_CREATE) { + inode->i_ctime.tv_sec = + iso_date(rr->u.TF.times[cnt++].time, + 0); + inode->i_ctime.tv_nsec = 0; + } + if (rr->u.TF.flags & TF_MODIFY) { + inode->i_mtime.tv_sec = + iso_date(rr->u.TF.times[cnt++].time, + 0); + inode->i_mtime.tv_nsec = 0; + } + if (rr->u.TF.flags & TF_ACCESS) { + inode->i_atime.tv_sec = + iso_date(rr->u.TF.times[cnt++].time, + 0); + inode->i_atime.tv_nsec = 0; + } + if (rr->u.TF.flags & TF_ATTRIBUTES) { + inode->i_ctime.tv_sec = + iso_date(rr->u.TF.times[cnt++].time, + 0); + inode->i_ctime.tv_nsec = 0; + } + break; + case SIG('S', 'L'): + { + int slen; + struct SL_component *slp; + struct SL_component *oldslp; + slen = rr->len - 5; + slp = &rr->u.SL.link; + inode->i_size = symlink_len; + while (slen > 1) { + rootflag = 0; + switch (slp->flags & ~1) { + case 0: + inode->i_size += + slp->len; + break; + case 2: + inode->i_size += 1; + break; + case 4: + inode->i_size += 2; + break; + case 8: + rootflag = 1; + inode->i_size += 1; + break; + default: + printk("Symlink component flag " + "not implemented\n"); + } + slen -= slp->len + 2; + oldslp = slp; + slp = (struct SL_component *) + (((char *)slp) + slp->len + 2); + + if (slen < 2) { + if (((rr->u.SL. + flags & 1) != 0) + && + ((oldslp-> + flags & 1) == 0)) + inode->i_size += + 1; + break; + } + + /* + * If this component record isn't + * continued, then append a '/'. + */ + if (!rootflag + && (oldslp->flags & 1) == 0) + inode->i_size += 1; + } + } + symlink_len = inode->i_size; + break; + case SIG('R', 'E'): + printk(KERN_WARNING "Attempt to read inode for " + "relocated directory\n"); + goto out; + case SIG('C', 'L'): + if (flags & RR_RELOC_DE) { + printk(KERN_ERR + "ISOFS: Recursive directory relocation " + "is not supported\n"); + goto eio; + } + reloc_block = isonum_733(rr->u.CL.location); + if (reloc_block == ISOFS_I(inode)->i_iget5_block && + ISOFS_I(inode)->i_iget5_offset == 0) { + printk(KERN_ERR + "ISOFS: Directory relocation points to " + "itself\n"); + goto eio; + } + ISOFS_I(inode)->i_first_extent = reloc_block; + reloc = isofs_iget_reloc(inode->i_sb, reloc_block, 0); + if (IS_ERR(reloc)) { + ret = PTR_ERR(reloc); + goto out; + } + inode->i_mode = reloc->i_mode; + set_nlink(inode, reloc->i_nlink); + inode->i_uid = reloc->i_uid; + inode->i_gid = reloc->i_gid; + inode->i_rdev = reloc->i_rdev; + inode->i_size = reloc->i_size; + inode->i_blocks = reloc->i_blocks; + inode->i_atime = reloc->i_atime; + inode->i_ctime = reloc->i_ctime; + inode->i_mtime = reloc->i_mtime; + iput(reloc); + break; +#ifdef CONFIG_ZISOFS + case SIG('Z', 'F'): { + int algo; + + if (ISOFS_SB(inode->i_sb)->s_nocompress) + break; + algo = isonum_721(rr->u.ZF.algorithm); + if (algo == SIG('p', 'z')) { + int block_shift = + isonum_711(&rr->u.ZF.parms[1]); + if (block_shift > 17) { + printk(KERN_WARNING "isofs: " + "Can't handle ZF block " + "size of 2^%d\n", + block_shift); + } else { + /* + * Note: we don't change + * i_blocks here + */ + ISOFS_I(inode)->i_file_format = + isofs_file_compressed; + /* + * Parameters to compression + * algorithm (header size, + * block size) + */ + ISOFS_I(inode)->i_format_parm[0] = + isonum_711(&rr->u.ZF.parms[0]); + ISOFS_I(inode)->i_format_parm[1] = + isonum_711(&rr->u.ZF.parms[1]); + inode->i_size = + isonum_733(rr->u.ZF. + real_size); + } + } else { + printk(KERN_WARNING + "isofs: Unknown ZF compression " + "algorithm: %c%c\n", + rr->u.ZF.algorithm[0], + rr->u.ZF.algorithm[1]); + } + break; + } +#endif + default: + break; + } + } + ret = rock_continue(&rs); + if (ret == 0) + goto repeat; + if (ret == 1) + ret = 0; +out: + kfree(rs.buffer); + return ret; +eio: + ret = -EIO; + goto out; +} + +static char *get_symlink_chunk(char *rpnt, struct rock_ridge *rr, char *plimit) +{ + int slen; + int rootflag; + struct SL_component *oldslp; + struct SL_component *slp; + slen = rr->len - 5; + slp = &rr->u.SL.link; + while (slen > 1) { + rootflag = 0; + switch (slp->flags & ~1) { + case 0: + if (slp->len > plimit - rpnt) + return NULL; + memcpy(rpnt, slp->text, slp->len); + rpnt += slp->len; + break; + case 2: + if (rpnt >= plimit) + return NULL; + *rpnt++ = '.'; + break; + case 4: + if (2 > plimit - rpnt) + return NULL; + *rpnt++ = '.'; + *rpnt++ = '.'; + break; + case 8: + if (rpnt >= plimit) + return NULL; + rootflag = 1; + *rpnt++ = '/'; + break; + default: + printk("Symlink component flag not implemented (%d)\n", + slp->flags); + } + slen -= slp->len + 2; + oldslp = slp; + slp = (struct SL_component *)((char *)slp + slp->len + 2); + + if (slen < 2) { + /* + * If there is another SL record, and this component + * record isn't continued, then add a slash. + */ + if ((!rootflag) && (rr->u.SL.flags & 1) && + !(oldslp->flags & 1)) { + if (rpnt >= plimit) + return NULL; + *rpnt++ = '/'; + } + break; + } + + /* + * If this component record isn't continued, then append a '/'. + */ + if (!rootflag && !(oldslp->flags & 1)) { + if (rpnt >= plimit) + return NULL; + *rpnt++ = '/'; + } + } + return rpnt; +} + +int parse_rock_ridge_inode(struct iso_directory_record *de, struct inode *inode, + int relocated) +{ + int flags = relocated ? RR_RELOC_DE : 0; + int result = parse_rock_ridge_inode_internal(de, inode, flags); + + /* + * if rockridge flag was reset and we didn't look for attributes + * behind eventual XA attributes, have a look there + */ + if ((ISOFS_SB(inode->i_sb)->s_rock_offset == -1) + && (ISOFS_SB(inode->i_sb)->s_rock == 2)) { + result = parse_rock_ridge_inode_internal(de, inode, + flags | RR_REGARD_XA); + } + return result; +} + +/* + * readpage() for symlinks: reads symlink contents into the page and either + * makes it uptodate and returns 0 or returns error (-EIO) + */ +static int rock_ridge_symlink_readpage(struct file *file, struct page *page) +{ + struct inode *inode = page->mapping->host; + struct iso_inode_info *ei = ISOFS_I(inode); + struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb); + char *link = page_address(page); + unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); + struct buffer_head *bh; + char *rpnt = link; + unsigned char *pnt; + struct iso_directory_record *raw_de; + unsigned long block, offset; + int sig; + struct rock_ridge *rr; + struct rock_state rs; + int ret; + + if (!sbi->s_rock) + goto error; + + init_rock_state(&rs, inode); + block = ei->i_iget5_block; + bh = sb_bread(inode->i_sb, block); + if (!bh) + goto out_noread; + + offset = ei->i_iget5_offset; + pnt = (unsigned char *)bh->b_data + offset; + + raw_de = (struct iso_directory_record *)pnt; + + /* + * If we go past the end of the buffer, there is some sort of error. + */ + if (offset + *pnt > bufsize) + goto out_bad_span; + + /* + * Now test for possible Rock Ridge extensions which will override + * some of these numbers in the inode structure. + */ + + setup_rock_ridge(raw_de, inode, &rs); + +repeat: + while (rs.len > 2) { /* There may be one byte for padding somewhere */ + rr = (struct rock_ridge *)rs.chr; + if (rr->len < 3) + goto out; /* Something got screwed up here */ + sig = isonum_721(rs.chr); + if (rock_check_overflow(&rs, sig)) + goto out; + rs.chr += rr->len; + rs.len -= rr->len; + if (rs.len < 0) + goto out; /* corrupted isofs */ + + switch (sig) { + case SIG('R', 'R'): + if ((rr->u.RR.flags[0] & RR_SL) == 0) + goto out; + break; + case SIG('S', 'P'): + if (check_sp(rr, inode)) + goto out; + break; + case SIG('S', 'L'): + rpnt = get_symlink_chunk(rpnt, rr, + link + (PAGE_SIZE - 1)); + if (rpnt == NULL) + goto out; + break; + case SIG('C', 'E'): + /* This tells is if there is a continuation record */ + rs.cont_extent = isonum_733(rr->u.CE.extent); + rs.cont_offset = isonum_733(rr->u.CE.offset); + rs.cont_size = isonum_733(rr->u.CE.size); + default: + break; + } + } + ret = rock_continue(&rs); + if (ret == 0) + goto repeat; + if (ret < 0) + goto fail; + + if (rpnt == link) + goto fail; + brelse(bh); + *rpnt = '\0'; + SetPageUptodate(page); + unlock_page(page); + return 0; + + /* error exit from macro */ +out: + kfree(rs.buffer); + goto fail; +out_noread: + printk("unable to read i-node block"); + goto fail; +out_bad_span: + printk("symlink spans iso9660 blocks\n"); +fail: + brelse(bh); +error: + SetPageError(page); + unlock_page(page); + return -EIO; +} + +const struct address_space_operations isofs_symlink_aops = { + .readpage = rock_ridge_symlink_readpage +}; diff --git a/vendor/linux/fs/isofs/rock.h b/vendor/linux/fs/isofs/rock.h new file mode 100644 index 0000000..ed09e2b --- /dev/null +++ b/vendor/linux/fs/isofs/rock.h @@ -0,0 +1,122 @@ +/* + * These structs are used by the system-use-sharing protocol, in which the + * Rock Ridge extensions are embedded. It is quite possible that other + * extensions are present on the disk, and this is fine as long as they + * all use SUSP + */ + +struct SU_SP_s { + unsigned char magic[2]; + unsigned char skip; +} __attribute__ ((packed)); + +struct SU_CE_s { + char extent[8]; + char offset[8]; + char size[8]; +}; + +struct SU_ER_s { + unsigned char len_id; + unsigned char len_des; + unsigned char len_src; + unsigned char ext_ver; + char data[0]; +} __attribute__ ((packed)); + +struct RR_RR_s { + char flags[1]; +} __attribute__ ((packed)); + +struct RR_PX_s { + char mode[8]; + char n_links[8]; + char uid[8]; + char gid[8]; +}; + +struct RR_PN_s { + char dev_high[8]; + char dev_low[8]; +}; + +struct SL_component { + unsigned char flags; + unsigned char len; + char text[0]; +} __attribute__ ((packed)); + +struct RR_SL_s { + unsigned char flags; + struct SL_component link; +} __attribute__ ((packed)); + +struct RR_NM_s { + unsigned char flags; + char name[0]; +} __attribute__ ((packed)); + +struct RR_CL_s { + char location[8]; +}; + +struct RR_PL_s { + char location[8]; +}; + +struct stamp { + char time[7]; +} __attribute__ ((packed)); + +struct RR_TF_s { + char flags; + struct stamp times[0]; /* Variable number of these beasts */ +} __attribute__ ((packed)); + +/* Linux-specific extension for transparent decompression */ +struct RR_ZF_s { + char algorithm[2]; + char parms[2]; + char real_size[8]; +}; + +/* + * These are the bits and their meanings for flags in the TF structure. + */ +#define TF_CREATE 1 +#define TF_MODIFY 2 +#define TF_ACCESS 4 +#define TF_ATTRIBUTES 8 +#define TF_BACKUP 16 +#define TF_EXPIRATION 32 +#define TF_EFFECTIVE 64 +#define TF_LONG_FORM 128 + +struct rock_ridge { + char signature[2]; + unsigned char len; + unsigned char version; + union { + struct SU_SP_s SP; + struct SU_CE_s CE; + struct SU_ER_s ER; + struct RR_RR_s RR; + struct RR_PX_s PX; + struct RR_PN_s PN; + struct RR_SL_s SL; + struct RR_NM_s NM; + struct RR_CL_s CL; + struct RR_PL_s PL; + struct RR_TF_s TF; + struct RR_ZF_s ZF; + } u; +}; + +#define RR_PX 1 /* POSIX attributes */ +#define RR_PN 2 /* POSIX devices */ +#define RR_SL 4 /* Symbolic link */ +#define RR_NM 8 /* Alternate Name */ +#define RR_CL 16 /* Child link */ +#define RR_PL 32 /* Parent link */ +#define RR_RE 64 /* Relocation directory */ +#define RR_TF 128 /* Timestamps */ diff --git a/vendor/linux/fs/isofs/util.c b/vendor/linux/fs/isofs/util.c new file mode 100644 index 0000000..005a15c --- /dev/null +++ b/vendor/linux/fs/isofs/util.c @@ -0,0 +1,70 @@ +/* + * linux/fs/isofs/util.c + */ + +#include +#include "isofs.h" + +/* + * We have to convert from a MM/DD/YY format to the Unix ctime format. + * We have to take into account leap years and all of that good stuff. + * Unfortunately, the kernel does not have the information on hand to + * take into account daylight savings time, but it shouldn't matter. + * The time stored should be localtime (with or without DST in effect), + * and the timezone offset should hold the offset required to get back + * to GMT. Thus we should always be correct. + */ + +int iso_date(char * p, int flag) +{ + int year, month, day, hour, minute, second, tz; + int crtime; + + year = p[0]; + month = p[1]; + day = p[2]; + hour = p[3]; + minute = p[4]; + second = p[5]; + if (flag == 0) tz = p[6]; /* High sierra has no time zone */ + else tz = 0; + + if (year < 0) { + crtime = 0; + } else { + crtime = mktime64(year+1900, month, day, hour, minute, second); + + /* sign extend */ + if (tz & 0x80) + tz |= (-1 << 8); + + /* + * The timezone offset is unreliable on some disks, + * so we make a sanity check. In no case is it ever + * more than 13 hours from GMT, which is 52*15min. + * The time is always stored in localtime with the + * timezone offset being what get added to GMT to + * get to localtime. Thus we need to subtract the offset + * to get to true GMT, which is what we store the time + * as internally. On the local system, the user may set + * their timezone any way they wish, of course, so GMT + * gets converted back to localtime on the receiving + * system. + * + * NOTE: mkisofs in versions prior to mkisofs-1.10 had + * the sign wrong on the timezone offset. This has now + * been corrected there too, but if you are getting screwy + * results this may be the explanation. If enough people + * complain, a user configuration option could be added + * to add the timezone offset in with the wrong sign + * for 'compatibility' with older discs, but I cannot see how + * it will matter that much. + * + * Thanks to kuhlmav@elec.canterbury.ac.nz (Volker Kuhlmann) + * for pointing out the sign error. + */ + if (-52 <= tz && tz <= 52) + crtime -= tz * 15 * 60; + } + return crtime; +} diff --git a/vendor/linux/fs/isofs/zisofs.h b/vendor/linux/fs/isofs/zisofs.h new file mode 100644 index 0000000..2737957 --- /dev/null +++ b/vendor/linux/fs/isofs/zisofs.h @@ -0,0 +1,21 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2001 H. Peter Anvin - All Rights Reserved + * + * This program 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, Inc., 675 Mass Ave, Cambridge MA 02139, + * USA; either version 2 of the License, or (at your option) any later + * version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ + +/* + * Prototypes for functions exported from the compressed isofs subsystem + */ + +#ifdef CONFIG_ZISOFS +extern const struct address_space_operations zisofs_aops; +extern int __init zisofs_init(void); +extern void zisofs_cleanup(void); +#endif diff --git a/vendor/linux/fs/udf/Makefile b/vendor/linux/fs/udf/Makefile new file mode 100644 index 0000000..eb880f6 --- /dev/null +++ b/vendor/linux/fs/udf/Makefile @@ -0,0 +1,9 @@ +# +# Makefile for the linux udf-filesystem routines. +# + +obj-$(CONFIG_UDF_FS) += udf.o + +udf-objs := balloc.o dir.o file.o ialloc.o inode.o lowlevel.o namei.o \ + partition.o super.o truncate.o symlink.o \ + directory.o misc.o udftime.o unicode.o diff --git a/vendor/linux/fs/udf/balloc.c b/vendor/linux/fs/udf/balloc.c new file mode 100644 index 0000000..e0fd65f --- /dev/null +++ b/vendor/linux/fs/udf/balloc.c @@ -0,0 +1,733 @@ +/* + * balloc.c + * + * PURPOSE + * Block allocation handling routines for the OSTA-UDF(tm) filesystem. + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + * + * (C) 1999-2001 Ben Fennema + * (C) 1999 Stelias Computing Inc + * + * HISTORY + * + * 02/24/99 blf Created. + * + */ + +#include "udfdecl.h" + +#include + +#include "udf_i.h" +#include "udf_sb.h" + +#define udf_clear_bit __test_and_clear_bit_le +#define udf_set_bit __test_and_set_bit_le +#define udf_test_bit test_bit_le +#define udf_find_next_one_bit find_next_bit_le + +static int read_block_bitmap(struct super_block *sb, + struct udf_bitmap *bitmap, unsigned int block, + unsigned long bitmap_nr) +{ + struct buffer_head *bh = NULL; + int retval = 0; + struct kernel_lb_addr loc; + + loc.logicalBlockNum = bitmap->s_extPosition; + loc.partitionReferenceNum = UDF_SB(sb)->s_partition; + + bh = udf_tread(sb, udf_get_lb_pblock(sb, &loc, block)); + if (!bh) + retval = -EIO; + + bitmap->s_block_bitmap[bitmap_nr] = bh; + return retval; +} + +static int __load_block_bitmap(struct super_block *sb, + struct udf_bitmap *bitmap, + unsigned int block_group) +{ + int retval = 0; + int nr_groups = bitmap->s_nr_groups; + + if (block_group >= nr_groups) { + udf_debug("block_group (%d) > nr_groups (%d)\n", + block_group, nr_groups); + } + + if (bitmap->s_block_bitmap[block_group]) + return block_group; + + retval = read_block_bitmap(sb, bitmap, block_group, block_group); + if (retval < 0) + return retval; + + return block_group; +} + +static inline int load_block_bitmap(struct super_block *sb, + struct udf_bitmap *bitmap, + unsigned int block_group) +{ + int slot; + + slot = __load_block_bitmap(sb, bitmap, block_group); + + if (slot < 0) + return slot; + + if (!bitmap->s_block_bitmap[slot]) + return -EIO; + + return slot; +} + +static void udf_add_free_space(struct super_block *sb, u16 partition, u32 cnt) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + struct logicalVolIntegrityDesc *lvid; + + if (!sbi->s_lvid_bh) + return; + + lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data; + le32_add_cpu(&lvid->freeSpaceTable[partition], cnt); + udf_updated_lvid(sb); +} + +static void udf_bitmap_free_blocks(struct super_block *sb, + struct udf_bitmap *bitmap, + struct kernel_lb_addr *bloc, + uint32_t offset, + uint32_t count) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + struct buffer_head *bh = NULL; + struct udf_part_map *partmap; + unsigned long block; + unsigned long block_group; + unsigned long bit; + unsigned long i; + int bitmap_nr; + unsigned long overflow; + + mutex_lock(&sbi->s_alloc_mutex); + partmap = &sbi->s_partmaps[bloc->partitionReferenceNum]; + if (bloc->logicalBlockNum + count < count || + (bloc->logicalBlockNum + count) > partmap->s_partition_len) { + udf_debug("%d < %d || %d + %d > %d\n", + bloc->logicalBlockNum, 0, + bloc->logicalBlockNum, count, + partmap->s_partition_len); + goto error_return; + } + + block = bloc->logicalBlockNum + offset + + (sizeof(struct spaceBitmapDesc) << 3); + + do { + overflow = 0; + block_group = block >> (sb->s_blocksize_bits + 3); + bit = block % (sb->s_blocksize << 3); + + /* + * Check to see if we are freeing blocks across a group boundary. + */ + if (bit + count > (sb->s_blocksize << 3)) { + overflow = bit + count - (sb->s_blocksize << 3); + count -= overflow; + } + bitmap_nr = load_block_bitmap(sb, bitmap, block_group); + if (bitmap_nr < 0) + goto error_return; + + bh = bitmap->s_block_bitmap[bitmap_nr]; + for (i = 0; i < count; i++) { + if (udf_set_bit(bit + i, bh->b_data)) { + udf_debug("bit %ld already set\n", bit + i); + udf_debug("byte=%2x\n", + ((char *)bh->b_data)[(bit + i) >> 3]); + } + } + udf_add_free_space(sb, sbi->s_partition, count); + mark_buffer_dirty(bh); + if (overflow) { + block += count; + count = overflow; + } + } while (overflow); + +error_return: + mutex_unlock(&sbi->s_alloc_mutex); +} + +static int udf_bitmap_prealloc_blocks(struct super_block *sb, + struct udf_bitmap *bitmap, + uint16_t partition, uint32_t first_block, + uint32_t block_count) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + int alloc_count = 0; + int bit, block, block_group, group_start; + int nr_groups, bitmap_nr; + struct buffer_head *bh; + __u32 part_len; + + mutex_lock(&sbi->s_alloc_mutex); + part_len = sbi->s_partmaps[partition].s_partition_len; + if (first_block >= part_len) + goto out; + + if (first_block + block_count > part_len) + block_count = part_len - first_block; + + do { + nr_groups = udf_compute_nr_groups(sb, partition); + block = first_block + (sizeof(struct spaceBitmapDesc) << 3); + block_group = block >> (sb->s_blocksize_bits + 3); + group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc); + + bitmap_nr = load_block_bitmap(sb, bitmap, block_group); + if (bitmap_nr < 0) + goto out; + bh = bitmap->s_block_bitmap[bitmap_nr]; + + bit = block % (sb->s_blocksize << 3); + + while (bit < (sb->s_blocksize << 3) && block_count > 0) { + if (!udf_clear_bit(bit, bh->b_data)) + goto out; + block_count--; + alloc_count++; + bit++; + block++; + } + mark_buffer_dirty(bh); + } while (block_count > 0); + +out: + udf_add_free_space(sb, partition, -alloc_count); + mutex_unlock(&sbi->s_alloc_mutex); + return alloc_count; +} + +static int udf_bitmap_new_block(struct super_block *sb, + struct udf_bitmap *bitmap, uint16_t partition, + uint32_t goal, int *err) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + int newbit, bit = 0, block, block_group, group_start; + int end_goal, nr_groups, bitmap_nr, i; + struct buffer_head *bh = NULL; + char *ptr; + int newblock = 0; + + *err = -ENOSPC; + mutex_lock(&sbi->s_alloc_mutex); + +repeat: + if (goal >= sbi->s_partmaps[partition].s_partition_len) + goal = 0; + + nr_groups = bitmap->s_nr_groups; + block = goal + (sizeof(struct spaceBitmapDesc) << 3); + block_group = block >> (sb->s_blocksize_bits + 3); + group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc); + + bitmap_nr = load_block_bitmap(sb, bitmap, block_group); + if (bitmap_nr < 0) + goto error_return; + bh = bitmap->s_block_bitmap[bitmap_nr]; + ptr = memscan((char *)bh->b_data + group_start, 0xFF, + sb->s_blocksize - group_start); + + if ((ptr - ((char *)bh->b_data)) < sb->s_blocksize) { + bit = block % (sb->s_blocksize << 3); + if (udf_test_bit(bit, bh->b_data)) + goto got_block; + + end_goal = (bit + 63) & ~63; + bit = udf_find_next_one_bit(bh->b_data, end_goal, bit); + if (bit < end_goal) + goto got_block; + + ptr = memscan((char *)bh->b_data + (bit >> 3), 0xFF, + sb->s_blocksize - ((bit + 7) >> 3)); + newbit = (ptr - ((char *)bh->b_data)) << 3; + if (newbit < sb->s_blocksize << 3) { + bit = newbit; + goto search_back; + } + + newbit = udf_find_next_one_bit(bh->b_data, + sb->s_blocksize << 3, bit); + if (newbit < sb->s_blocksize << 3) { + bit = newbit; + goto got_block; + } + } + + for (i = 0; i < (nr_groups * 2); i++) { + block_group++; + if (block_group >= nr_groups) + block_group = 0; + group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc); + + bitmap_nr = load_block_bitmap(sb, bitmap, block_group); + if (bitmap_nr < 0) + goto error_return; + bh = bitmap->s_block_bitmap[bitmap_nr]; + if (i < nr_groups) { + ptr = memscan((char *)bh->b_data + group_start, 0xFF, + sb->s_blocksize - group_start); + if ((ptr - ((char *)bh->b_data)) < sb->s_blocksize) { + bit = (ptr - ((char *)bh->b_data)) << 3; + break; + } + } else { + bit = udf_find_next_one_bit(bh->b_data, + sb->s_blocksize << 3, + group_start << 3); + if (bit < sb->s_blocksize << 3) + break; + } + } + if (i >= (nr_groups * 2)) { + mutex_unlock(&sbi->s_alloc_mutex); + return newblock; + } + if (bit < sb->s_blocksize << 3) + goto search_back; + else + bit = udf_find_next_one_bit(bh->b_data, sb->s_blocksize << 3, + group_start << 3); + if (bit >= sb->s_blocksize << 3) { + mutex_unlock(&sbi->s_alloc_mutex); + return 0; + } + +search_back: + i = 0; + while (i < 7 && bit > (group_start << 3) && + udf_test_bit(bit - 1, bh->b_data)) { + ++i; + --bit; + } + +got_block: + newblock = bit + (block_group << (sb->s_blocksize_bits + 3)) - + (sizeof(struct spaceBitmapDesc) << 3); + + if (!udf_clear_bit(bit, bh->b_data)) { + udf_debug("bit already cleared for block %d\n", bit); + goto repeat; + } + + mark_buffer_dirty(bh); + + udf_add_free_space(sb, partition, -1); + mutex_unlock(&sbi->s_alloc_mutex); + *err = 0; + return newblock; + +error_return: + *err = -EIO; + mutex_unlock(&sbi->s_alloc_mutex); + return 0; +} + +static void udf_table_free_blocks(struct super_block *sb, + struct inode *table, + struct kernel_lb_addr *bloc, + uint32_t offset, + uint32_t count) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + struct udf_part_map *partmap; + uint32_t start, end; + uint32_t elen; + struct kernel_lb_addr eloc; + struct extent_position oepos, epos; + int8_t etype; + struct udf_inode_info *iinfo; + + mutex_lock(&sbi->s_alloc_mutex); + partmap = &sbi->s_partmaps[bloc->partitionReferenceNum]; + if (bloc->logicalBlockNum + count < count || + (bloc->logicalBlockNum + count) > partmap->s_partition_len) { + udf_debug("%d < %d || %d + %d > %d\n", + bloc->logicalBlockNum, 0, + bloc->logicalBlockNum, count, + partmap->s_partition_len); + goto error_return; + } + + iinfo = UDF_I(table); + udf_add_free_space(sb, sbi->s_partition, count); + + start = bloc->logicalBlockNum + offset; + end = bloc->logicalBlockNum + offset + count - 1; + + epos.offset = oepos.offset = sizeof(struct unallocSpaceEntry); + elen = 0; + epos.block = oepos.block = iinfo->i_location; + epos.bh = oepos.bh = NULL; + + while (count && + (etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) { + if (((eloc.logicalBlockNum + + (elen >> sb->s_blocksize_bits)) == start)) { + if ((0x3FFFFFFF - elen) < + (count << sb->s_blocksize_bits)) { + uint32_t tmp = ((0x3FFFFFFF - elen) >> + sb->s_blocksize_bits); + count -= tmp; + start += tmp; + elen = (etype << 30) | + (0x40000000 - sb->s_blocksize); + } else { + elen = (etype << 30) | + (elen + + (count << sb->s_blocksize_bits)); + start += count; + count = 0; + } + udf_write_aext(table, &oepos, &eloc, elen, 1); + } else if (eloc.logicalBlockNum == (end + 1)) { + if ((0x3FFFFFFF - elen) < + (count << sb->s_blocksize_bits)) { + uint32_t tmp = ((0x3FFFFFFF - elen) >> + sb->s_blocksize_bits); + count -= tmp; + end -= tmp; + eloc.logicalBlockNum -= tmp; + elen = (etype << 30) | + (0x40000000 - sb->s_blocksize); + } else { + eloc.logicalBlockNum = start; + elen = (etype << 30) | + (elen + + (count << sb->s_blocksize_bits)); + end -= count; + count = 0; + } + udf_write_aext(table, &oepos, &eloc, elen, 1); + } + + if (epos.bh != oepos.bh) { + oepos.block = epos.block; + brelse(oepos.bh); + get_bh(epos.bh); + oepos.bh = epos.bh; + oepos.offset = 0; + } else { + oepos.offset = epos.offset; + } + } + + if (count) { + /* + * NOTE: we CANNOT use udf_add_aext here, as it can try to + * allocate a new block, and since we hold the super block + * lock already very bad things would happen :) + * + * We copy the behavior of udf_add_aext, but instead of + * trying to allocate a new block close to the existing one, + * we just steal a block from the extent we are trying to add. + * + * It would be nice if the blocks were close together, but it + * isn't required. + */ + + int adsize; + + eloc.logicalBlockNum = start; + elen = EXT_RECORDED_ALLOCATED | + (count << sb->s_blocksize_bits); + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + adsize = sizeof(struct short_ad); + else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + adsize = sizeof(struct long_ad); + else { + brelse(oepos.bh); + brelse(epos.bh); + goto error_return; + } + + if (epos.offset + (2 * adsize) > sb->s_blocksize) { + /* Steal a block from the extent being free'd */ + udf_setup_indirect_aext(table, eloc.logicalBlockNum, + &epos); + + eloc.logicalBlockNum++; + elen -= sb->s_blocksize; + } + + /* It's possible that stealing the block emptied the extent */ + if (elen) + __udf_add_aext(table, &epos, &eloc, elen, 1); + } + + brelse(epos.bh); + brelse(oepos.bh); + +error_return: + mutex_unlock(&sbi->s_alloc_mutex); + return; +} + +static int udf_table_prealloc_blocks(struct super_block *sb, + struct inode *table, uint16_t partition, + uint32_t first_block, uint32_t block_count) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + int alloc_count = 0; + uint32_t elen, adsize; + struct kernel_lb_addr eloc; + struct extent_position epos; + int8_t etype = -1; + struct udf_inode_info *iinfo; + + if (first_block >= sbi->s_partmaps[partition].s_partition_len) + return 0; + + iinfo = UDF_I(table); + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + adsize = sizeof(struct short_ad); + else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + adsize = sizeof(struct long_ad); + else + return 0; + + mutex_lock(&sbi->s_alloc_mutex); + epos.offset = sizeof(struct unallocSpaceEntry); + epos.block = iinfo->i_location; + epos.bh = NULL; + eloc.logicalBlockNum = 0xFFFFFFFF; + + while (first_block != eloc.logicalBlockNum && + (etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) { + udf_debug("eloc=%d, elen=%d, first_block=%d\n", + eloc.logicalBlockNum, elen, first_block); + ; /* empty loop body */ + } + + if (first_block == eloc.logicalBlockNum) { + epos.offset -= adsize; + + alloc_count = (elen >> sb->s_blocksize_bits); + if (alloc_count > block_count) { + alloc_count = block_count; + eloc.logicalBlockNum += alloc_count; + elen -= (alloc_count << sb->s_blocksize_bits); + udf_write_aext(table, &epos, &eloc, + (etype << 30) | elen, 1); + } else + udf_delete_aext(table, epos, eloc, + (etype << 30) | elen); + } else { + alloc_count = 0; + } + + brelse(epos.bh); + + if (alloc_count) + udf_add_free_space(sb, partition, -alloc_count); + mutex_unlock(&sbi->s_alloc_mutex); + return alloc_count; +} + +static int udf_table_new_block(struct super_block *sb, + struct inode *table, uint16_t partition, + uint32_t goal, int *err) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + uint32_t spread = 0xFFFFFFFF, nspread = 0xFFFFFFFF; + uint32_t newblock = 0, adsize; + uint32_t elen, goal_elen = 0; + struct kernel_lb_addr eloc, uninitialized_var(goal_eloc); + struct extent_position epos, goal_epos; + int8_t etype; + struct udf_inode_info *iinfo = UDF_I(table); + + *err = -ENOSPC; + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + adsize = sizeof(struct short_ad); + else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + adsize = sizeof(struct long_ad); + else + return newblock; + + mutex_lock(&sbi->s_alloc_mutex); + if (goal >= sbi->s_partmaps[partition].s_partition_len) + goal = 0; + + /* We search for the closest matching block to goal. If we find + a exact hit, we stop. Otherwise we keep going till we run out + of extents. We store the buffer_head, bloc, and extoffset + of the current closest match and use that when we are done. + */ + epos.offset = sizeof(struct unallocSpaceEntry); + epos.block = iinfo->i_location; + epos.bh = goal_epos.bh = NULL; + + while (spread && + (etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) { + if (goal >= eloc.logicalBlockNum) { + if (goal < eloc.logicalBlockNum + + (elen >> sb->s_blocksize_bits)) + nspread = 0; + else + nspread = goal - eloc.logicalBlockNum - + (elen >> sb->s_blocksize_bits); + } else { + nspread = eloc.logicalBlockNum - goal; + } + + if (nspread < spread) { + spread = nspread; + if (goal_epos.bh != epos.bh) { + brelse(goal_epos.bh); + goal_epos.bh = epos.bh; + get_bh(goal_epos.bh); + } + goal_epos.block = epos.block; + goal_epos.offset = epos.offset - adsize; + goal_eloc = eloc; + goal_elen = (etype << 30) | elen; + } + } + + brelse(epos.bh); + + if (spread == 0xFFFFFFFF) { + brelse(goal_epos.bh); + mutex_unlock(&sbi->s_alloc_mutex); + return 0; + } + + /* Only allocate blocks from the beginning of the extent. + That way, we only delete (empty) extents, never have to insert an + extent because of splitting */ + /* This works, but very poorly.... */ + + newblock = goal_eloc.logicalBlockNum; + goal_eloc.logicalBlockNum++; + goal_elen -= sb->s_blocksize; + + if (goal_elen) + udf_write_aext(table, &goal_epos, &goal_eloc, goal_elen, 1); + else + udf_delete_aext(table, goal_epos, goal_eloc, goal_elen); + brelse(goal_epos.bh); + + udf_add_free_space(sb, partition, -1); + + mutex_unlock(&sbi->s_alloc_mutex); + *err = 0; + return newblock; +} + +void udf_free_blocks(struct super_block *sb, struct inode *inode, + struct kernel_lb_addr *bloc, uint32_t offset, + uint32_t count) +{ + uint16_t partition = bloc->partitionReferenceNum; + struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition]; + + if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) { + udf_bitmap_free_blocks(sb, map->s_uspace.s_bitmap, + bloc, offset, count); + } else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) { + udf_table_free_blocks(sb, map->s_uspace.s_table, + bloc, offset, count); + } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) { + udf_bitmap_free_blocks(sb, map->s_fspace.s_bitmap, + bloc, offset, count); + } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) { + udf_table_free_blocks(sb, map->s_fspace.s_table, + bloc, offset, count); + } + + if (inode) { + inode_sub_bytes(inode, + ((sector_t)count) << sb->s_blocksize_bits); + } +} + +inline int udf_prealloc_blocks(struct super_block *sb, + struct inode *inode, + uint16_t partition, uint32_t first_block, + uint32_t block_count) +{ + struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition]; + int allocated; + + if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) + allocated = udf_bitmap_prealloc_blocks(sb, + map->s_uspace.s_bitmap, + partition, first_block, + block_count); + else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) + allocated = udf_table_prealloc_blocks(sb, + map->s_uspace.s_table, + partition, first_block, + block_count); + else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) + allocated = udf_bitmap_prealloc_blocks(sb, + map->s_fspace.s_bitmap, + partition, first_block, + block_count); + else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) + allocated = udf_table_prealloc_blocks(sb, + map->s_fspace.s_table, + partition, first_block, + block_count); + else + return 0; + + if (inode && allocated > 0) + inode_add_bytes(inode, allocated << sb->s_blocksize_bits); + return allocated; +} + +inline int udf_new_block(struct super_block *sb, + struct inode *inode, + uint16_t partition, uint32_t goal, int *err) +{ + struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition]; + int block; + + if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) + block = udf_bitmap_new_block(sb, + map->s_uspace.s_bitmap, + partition, goal, err); + else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) + block = udf_table_new_block(sb, + map->s_uspace.s_table, + partition, goal, err); + else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) + block = udf_bitmap_new_block(sb, + map->s_fspace.s_bitmap, + partition, goal, err); + else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) + block = udf_table_new_block(sb, + map->s_fspace.s_table, + partition, goal, err); + else { + *err = -EIO; + return 0; + } + if (inode && block) + inode_add_bytes(inode, sb->s_blocksize); + return block; +} diff --git a/vendor/linux/fs/udf/dir.c b/vendor/linux/fs/udf/dir.c new file mode 100644 index 0000000..aaec13c --- /dev/null +++ b/vendor/linux/fs/udf/dir.c @@ -0,0 +1,208 @@ +/* + * dir.c + * + * PURPOSE + * Directory handling routines for the OSTA-UDF(tm) filesystem. + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + * + * (C) 1998-2004 Ben Fennema + * + * HISTORY + * + * 10/05/98 dgb Split directory operations into its own file + * Implemented directory reads via do_udf_readdir + * 10/06/98 Made directory operations work! + * 11/17/98 Rewrote directory to support ICBTAG_FLAG_AD_LONG + * 11/25/98 blf Rewrote directory handling (readdir+lookup) to support reading + * across blocks. + * 12/12/98 Split out the lookup code to namei.c. bulk of directory + * code now in directory.c:udf_fileident_read. + */ + +#include "udfdecl.h" + +#include +#include +#include +#include + +#include "udf_i.h" +#include "udf_sb.h" + + +static int udf_readdir(struct file *file, struct dir_context *ctx) +{ + struct inode *dir = file_inode(file); + struct udf_inode_info *iinfo = UDF_I(dir); + struct udf_fileident_bh fibh = { .sbh = NULL, .ebh = NULL}; + struct fileIdentDesc *fi = NULL; + struct fileIdentDesc cfi; + int block, iblock; + loff_t nf_pos; + int flen; + unsigned char *fname = NULL, *copy_name = NULL; + unsigned char *nameptr; + uint16_t liu; + uint8_t lfi; + loff_t size = udf_ext0_offset(dir) + dir->i_size; + struct buffer_head *tmp, *bha[16]; + struct kernel_lb_addr eloc; + uint32_t elen; + sector_t offset; + int i, num, ret = 0; + struct extent_position epos = { NULL, 0, {0, 0} }; + struct super_block *sb = dir->i_sb; + + if (ctx->pos == 0) { + if (!dir_emit_dot(file, ctx)) + return 0; + ctx->pos = 1; + } + nf_pos = (ctx->pos - 1) << 2; + if (nf_pos >= size) + goto out; + + fname = kmalloc(UDF_NAME_LEN, GFP_NOFS); + if (!fname) { + ret = -ENOMEM; + goto out; + } + + if (nf_pos == 0) + nf_pos = udf_ext0_offset(dir); + + fibh.soffset = fibh.eoffset = nf_pos & (sb->s_blocksize - 1); + if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { + if (inode_bmap(dir, nf_pos >> sb->s_blocksize_bits, + &epos, &eloc, &elen, &offset) + != (EXT_RECORDED_ALLOCATED >> 30)) { + ret = -ENOENT; + goto out; + } + block = udf_get_lb_pblock(sb, &eloc, offset); + if ((++offset << sb->s_blocksize_bits) < elen) { + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + epos.offset -= sizeof(struct short_ad); + else if (iinfo->i_alloc_type == + ICBTAG_FLAG_AD_LONG) + epos.offset -= sizeof(struct long_ad); + } else { + offset = 0; + } + + if (!(fibh.sbh = fibh.ebh = udf_tread(sb, block))) { + ret = -EIO; + goto out; + } + + if (!(offset & ((16 >> (sb->s_blocksize_bits - 9)) - 1))) { + i = 16 >> (sb->s_blocksize_bits - 9); + if (i + offset > (elen >> sb->s_blocksize_bits)) + i = (elen >> sb->s_blocksize_bits) - offset; + for (num = 0; i > 0; i--) { + block = udf_get_lb_pblock(sb, &eloc, offset + i); + tmp = udf_tgetblk(sb, block); + if (tmp && !buffer_uptodate(tmp) && !buffer_locked(tmp)) + bha[num++] = tmp; + else + brelse(tmp); + } + if (num) { + ll_rw_block(REQ_OP_READ, REQ_RAHEAD, num, bha); + for (i = 0; i < num; i++) + brelse(bha[i]); + } + } + } + + while (nf_pos < size) { + struct kernel_lb_addr tloc; + + ctx->pos = (nf_pos >> 2) + 1; + + fi = udf_fileident_read(dir, &nf_pos, &fibh, &cfi, &epos, &eloc, + &elen, &offset); + if (!fi) + goto out; + + liu = le16_to_cpu(cfi.lengthOfImpUse); + lfi = cfi.lengthFileIdent; + + if (fibh.sbh == fibh.ebh) { + nameptr = fi->fileIdent + liu; + } else { + int poffset; /* Unpaded ending offset */ + + poffset = fibh.soffset + sizeof(struct fileIdentDesc) + liu + lfi; + + if (poffset >= lfi) { + nameptr = (char *)(fibh.ebh->b_data + poffset - lfi); + } else { + if (!copy_name) { + copy_name = kmalloc(UDF_NAME_LEN, + GFP_NOFS); + if (!copy_name) { + ret = -ENOMEM; + goto out; + } + } + nameptr = copy_name; + memcpy(nameptr, fi->fileIdent + liu, + lfi - poffset); + memcpy(nameptr + lfi - poffset, + fibh.ebh->b_data, poffset); + } + } + + if ((cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { + if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE)) + continue; + } + + if ((cfi.fileCharacteristics & FID_FILE_CHAR_HIDDEN) != 0) { + if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE)) + continue; + } + + if (cfi.fileCharacteristics & FID_FILE_CHAR_PARENT) { + if (!dir_emit_dotdot(file, ctx)) + goto out; + continue; + } + + flen = udf_get_filename(sb, nameptr, lfi, fname, UDF_NAME_LEN); + if (flen < 0) + continue; + + tloc = lelb_to_cpu(cfi.icb.extLocation); + iblock = udf_get_lb_pblock(sb, &tloc, 0); + if (!dir_emit(ctx, fname, flen, iblock, DT_UNKNOWN)) + goto out; + } /* end while */ + + ctx->pos = (nf_pos >> 2) + 1; + +out: + if (fibh.sbh != fibh.ebh) + brelse(fibh.ebh); + brelse(fibh.sbh); + brelse(epos.bh); + kfree(fname); + kfree(copy_name); + + return ret; +} + +/* readdir and lookup functions */ +const struct file_operations udf_dir_operations = { + .llseek = generic_file_llseek, + .read = generic_read_dir, + .iterate_shared = udf_readdir, + .unlocked_ioctl = udf_ioctl, + .fsync = generic_file_fsync, +}; diff --git a/vendor/linux/fs/udf/directory.c b/vendor/linux/fs/udf/directory.c new file mode 100644 index 0000000..988d535 --- /dev/null +++ b/vendor/linux/fs/udf/directory.c @@ -0,0 +1,240 @@ +/* + * directory.c + * + * PURPOSE + * Directory related functions + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + */ + +#include "udfdecl.h" +#include "udf_i.h" + +#include +#include + +struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t *nf_pos, + struct udf_fileident_bh *fibh, + struct fileIdentDesc *cfi, + struct extent_position *epos, + struct kernel_lb_addr *eloc, uint32_t *elen, + sector_t *offset) +{ + struct fileIdentDesc *fi; + int i, num, block; + struct buffer_head *tmp, *bha[16]; + struct udf_inode_info *iinfo = UDF_I(dir); + + fibh->soffset = fibh->eoffset; + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { + fi = udf_get_fileident(iinfo->i_ext.i_data - + (iinfo->i_efe ? + sizeof(struct extendedFileEntry) : + sizeof(struct fileEntry)), + dir->i_sb->s_blocksize, + &(fibh->eoffset)); + if (!fi) + return NULL; + + *nf_pos += fibh->eoffset - fibh->soffset; + + memcpy((uint8_t *)cfi, (uint8_t *)fi, + sizeof(struct fileIdentDesc)); + + return fi; + } + + if (fibh->eoffset == dir->i_sb->s_blocksize) { + int lextoffset = epos->offset; + unsigned char blocksize_bits = dir->i_sb->s_blocksize_bits; + + if (udf_next_aext(dir, epos, eloc, elen, 1) != + (EXT_RECORDED_ALLOCATED >> 30)) + return NULL; + + block = udf_get_lb_pblock(dir->i_sb, eloc, *offset); + + (*offset)++; + + if ((*offset << blocksize_bits) >= *elen) + *offset = 0; + else + epos->offset = lextoffset; + + brelse(fibh->sbh); + fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block); + if (!fibh->sbh) + return NULL; + fibh->soffset = fibh->eoffset = 0; + + if (!(*offset & ((16 >> (blocksize_bits - 9)) - 1))) { + i = 16 >> (blocksize_bits - 9); + if (i + *offset > (*elen >> blocksize_bits)) + i = (*elen >> blocksize_bits)-*offset; + for (num = 0; i > 0; i--) { + block = udf_get_lb_pblock(dir->i_sb, eloc, + *offset + i); + tmp = udf_tgetblk(dir->i_sb, block); + if (tmp && !buffer_uptodate(tmp) && + !buffer_locked(tmp)) + bha[num++] = tmp; + else + brelse(tmp); + } + if (num) { + ll_rw_block(REQ_OP_READ, REQ_RAHEAD, num, bha); + for (i = 0; i < num; i++) + brelse(bha[i]); + } + } + } else if (fibh->sbh != fibh->ebh) { + brelse(fibh->sbh); + fibh->sbh = fibh->ebh; + } + + fi = udf_get_fileident(fibh->sbh->b_data, dir->i_sb->s_blocksize, + &(fibh->eoffset)); + + if (!fi) + return NULL; + + *nf_pos += fibh->eoffset - fibh->soffset; + + if (fibh->eoffset <= dir->i_sb->s_blocksize) { + memcpy((uint8_t *)cfi, (uint8_t *)fi, + sizeof(struct fileIdentDesc)); + } else if (fibh->eoffset > dir->i_sb->s_blocksize) { + int lextoffset = epos->offset; + + if (udf_next_aext(dir, epos, eloc, elen, 1) != + (EXT_RECORDED_ALLOCATED >> 30)) + return NULL; + + block = udf_get_lb_pblock(dir->i_sb, eloc, *offset); + + (*offset)++; + + if ((*offset << dir->i_sb->s_blocksize_bits) >= *elen) + *offset = 0; + else + epos->offset = lextoffset; + + fibh->soffset -= dir->i_sb->s_blocksize; + fibh->eoffset -= dir->i_sb->s_blocksize; + + fibh->ebh = udf_tread(dir->i_sb, block); + if (!fibh->ebh) + return NULL; + + if (sizeof(struct fileIdentDesc) > -fibh->soffset) { + int fi_len; + + memcpy((uint8_t *)cfi, (uint8_t *)fi, -fibh->soffset); + memcpy((uint8_t *)cfi - fibh->soffset, + fibh->ebh->b_data, + sizeof(struct fileIdentDesc) + fibh->soffset); + + fi_len = (sizeof(struct fileIdentDesc) + + cfi->lengthFileIdent + + le16_to_cpu(cfi->lengthOfImpUse) + 3) & ~3; + + *nf_pos += fi_len - (fibh->eoffset - fibh->soffset); + fibh->eoffset = fibh->soffset + fi_len; + } else { + memcpy((uint8_t *)cfi, (uint8_t *)fi, + sizeof(struct fileIdentDesc)); + } + } + return fi; +} + +struct fileIdentDesc *udf_get_fileident(void *buffer, int bufsize, int *offset) +{ + struct fileIdentDesc *fi; + int lengthThisIdent; + uint8_t *ptr; + int padlen; + + if ((!buffer) || (!offset)) { + udf_debug("invalidparms, buffer=%p, offset=%p\n", + buffer, offset); + return NULL; + } + + ptr = buffer; + + if ((*offset > 0) && (*offset < bufsize)) + ptr += *offset; + fi = (struct fileIdentDesc *)ptr; + if (fi->descTag.tagIdent != cpu_to_le16(TAG_IDENT_FID)) { + udf_debug("0x%x != TAG_IDENT_FID\n", + le16_to_cpu(fi->descTag.tagIdent)); + udf_debug("offset: %u sizeof: %lu bufsize: %u\n", + *offset, (unsigned long)sizeof(struct fileIdentDesc), + bufsize); + return NULL; + } + if ((*offset + sizeof(struct fileIdentDesc)) > bufsize) + lengthThisIdent = sizeof(struct fileIdentDesc); + else + lengthThisIdent = sizeof(struct fileIdentDesc) + + fi->lengthFileIdent + le16_to_cpu(fi->lengthOfImpUse); + + /* we need to figure padding, too! */ + padlen = lengthThisIdent % UDF_NAME_PAD; + if (padlen) + lengthThisIdent += (UDF_NAME_PAD - padlen); + *offset = *offset + lengthThisIdent; + + return fi; +} + +struct short_ad *udf_get_fileshortad(uint8_t *ptr, int maxoffset, uint32_t *offset, + int inc) +{ + struct short_ad *sa; + + if ((!ptr) || (!offset)) { + pr_err("%s: invalidparms\n", __func__); + return NULL; + } + + if ((*offset + sizeof(struct short_ad)) > maxoffset) + return NULL; + else { + sa = (struct short_ad *)ptr; + if (sa->extLength == 0) + return NULL; + } + + if (inc) + *offset += sizeof(struct short_ad); + return sa; +} + +struct long_ad *udf_get_filelongad(uint8_t *ptr, int maxoffset, uint32_t *offset, int inc) +{ + struct long_ad *la; + + if ((!ptr) || (!offset)) { + pr_err("%s: invalidparms\n", __func__); + return NULL; + } + + if ((*offset + sizeof(struct long_ad)) > maxoffset) + return NULL; + else { + la = (struct long_ad *)ptr; + if (la->extLength == 0) + return NULL; + } + + if (inc) + *offset += sizeof(struct long_ad); + return la; +} diff --git a/vendor/linux/fs/udf/ecma_167.h b/vendor/linux/fs/udf/ecma_167.h new file mode 100644 index 0000000..4792b77 --- /dev/null +++ b/vendor/linux/fs/udf/ecma_167.h @@ -0,0 +1,796 @@ +/* + * ecma_167.h + * + * This file is based on ECMA-167 3rd edition (June 1997) + * http://www.ecma.ch + * + * Copyright (c) 2001-2002 Ben Fennema + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU Public License ("GPL"). + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#ifndef _ECMA_167_H +#define _ECMA_167_H 1 + +/* Character set specification (ECMA 167r3 1/7.2.1) */ +struct charspec { + uint8_t charSetType; + uint8_t charSetInfo[63]; +} __attribute__ ((packed)); + +/* Character Set Type (ECMA 167r3 1/7.2.1.1) */ +#define CHARSPEC_TYPE_CS0 0x00 /* (1/7.2.2) */ +#define CHARSPEC_TYPE_CS1 0x01 /* (1/7.2.3) */ +#define CHARSPEC_TYPE_CS2 0x02 /* (1/7.2.4) */ +#define CHARSPEC_TYPE_CS3 0x03 /* (1/7.2.5) */ +#define CHARSPEC_TYPE_CS4 0x04 /* (1/7.2.6) */ +#define CHARSPEC_TYPE_CS5 0x05 /* (1/7.2.7) */ +#define CHARSPEC_TYPE_CS6 0x06 /* (1/7.2.8) */ +#define CHARSPEC_TYPE_CS7 0x07 /* (1/7.2.9) */ +#define CHARSPEC_TYPE_CS8 0x08 /* (1/7.2.10) */ + +typedef uint8_t dstring; + +/* Timestamp (ECMA 167r3 1/7.3) */ +struct timestamp { + __le16 typeAndTimezone; + __le16 year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t minute; + uint8_t second; + uint8_t centiseconds; + uint8_t hundredsOfMicroseconds; + uint8_t microseconds; +} __attribute__ ((packed)); + +/* Type and Time Zone (ECMA 167r3 1/7.3.1) */ +#define TIMESTAMP_TYPE_MASK 0xF000 +#define TIMESTAMP_TYPE_CUT 0x0000 +#define TIMESTAMP_TYPE_LOCAL 0x1000 +#define TIMESTAMP_TYPE_AGREEMENT 0x2000 +#define TIMESTAMP_TIMEZONE_MASK 0x0FFF + +/* Entity identifier (ECMA 167r3 1/7.4) */ +struct regid { + uint8_t flags; + uint8_t ident[23]; + uint8_t identSuffix[8]; +} __attribute__ ((packed)); + +/* Flags (ECMA 167r3 1/7.4.1) */ +#define ENTITYID_FLAGS_DIRTY 0x00 +#define ENTITYID_FLAGS_PROTECTED 0x01 + +/* Volume Structure Descriptor (ECMA 167r3 2/9.1) */ +#define VSD_STD_ID_LEN 5 +struct volStructDesc { + uint8_t structType; + uint8_t stdIdent[VSD_STD_ID_LEN]; + uint8_t structVersion; + uint8_t structData[2041]; +} __attribute__ ((packed)); + +/* Standard Identifier (EMCA 167r2 2/9.1.2) */ +#define VSD_STD_ID_NSR02 "NSR02" /* (3/9.1) */ + +/* Standard Identifier (ECMA 167r3 2/9.1.2) */ +#define VSD_STD_ID_BEA01 "BEA01" /* (2/9.2) */ +#define VSD_STD_ID_BOOT2 "BOOT2" /* (2/9.4) */ +#define VSD_STD_ID_CD001 "CD001" /* (ECMA-119) */ +#define VSD_STD_ID_CDW02 "CDW02" /* (ECMA-168) */ +#define VSD_STD_ID_NSR03 "NSR03" /* (3/9.1) */ +#define VSD_STD_ID_TEA01 "TEA01" /* (2/9.3) */ + +/* Beginning Extended Area Descriptor (ECMA 167r3 2/9.2) */ +struct beginningExtendedAreaDesc { + uint8_t structType; + uint8_t stdIdent[VSD_STD_ID_LEN]; + uint8_t structVersion; + uint8_t structData[2041]; +} __attribute__ ((packed)); + +/* Terminating Extended Area Descriptor (ECMA 167r3 2/9.3) */ +struct terminatingExtendedAreaDesc { + uint8_t structType; + uint8_t stdIdent[VSD_STD_ID_LEN]; + uint8_t structVersion; + uint8_t structData[2041]; +} __attribute__ ((packed)); + +/* Boot Descriptor (ECMA 167r3 2/9.4) */ +struct bootDesc { + uint8_t structType; + uint8_t stdIdent[VSD_STD_ID_LEN]; + uint8_t structVersion; + uint8_t reserved1; + struct regid archType; + struct regid bootIdent; + __le32 bootExtLocation; + __le32 bootExtLength; + __le64 loadAddress; + __le64 startAddress; + struct timestamp descCreationDateAndTime; + __le16 flags; + uint8_t reserved2[32]; + uint8_t bootUse[1906]; +} __attribute__ ((packed)); + +/* Flags (ECMA 167r3 2/9.4.12) */ +#define BOOT_FLAGS_ERASE 0x01 + +/* Extent Descriptor (ECMA 167r3 3/7.1) */ +struct extent_ad { + __le32 extLength; + __le32 extLocation; +} __attribute__ ((packed)); + +struct kernel_extent_ad { + uint32_t extLength; + uint32_t extLocation; +}; + +/* Descriptor Tag (ECMA 167r3 3/7.2) */ +struct tag { + __le16 tagIdent; + __le16 descVersion; + uint8_t tagChecksum; + uint8_t reserved; + __le16 tagSerialNum; + __le16 descCRC; + __le16 descCRCLength; + __le32 tagLocation; +} __attribute__ ((packed)); + +/* Tag Identifier (ECMA 167r3 3/7.2.1) */ +#define TAG_IDENT_PVD 0x0001 +#define TAG_IDENT_AVDP 0x0002 +#define TAG_IDENT_VDP 0x0003 +#define TAG_IDENT_IUVD 0x0004 +#define TAG_IDENT_PD 0x0005 +#define TAG_IDENT_LVD 0x0006 +#define TAG_IDENT_USD 0x0007 +#define TAG_IDENT_TD 0x0008 +#define TAG_IDENT_LVID 0x0009 + +/* NSR Descriptor (ECMA 167r3 3/9.1) */ +struct NSRDesc { + uint8_t structType; + uint8_t stdIdent[VSD_STD_ID_LEN]; + uint8_t structVersion; + uint8_t reserved; + uint8_t structData[2040]; +} __attribute__ ((packed)); + +/* Primary Volume Descriptor (ECMA 167r3 3/10.1) */ +struct primaryVolDesc { + struct tag descTag; + __le32 volDescSeqNum; + __le32 primaryVolDescNum; + dstring volIdent[32]; + __le16 volSeqNum; + __le16 maxVolSeqNum; + __le16 interchangeLvl; + __le16 maxInterchangeLvl; + __le32 charSetList; + __le32 maxCharSetList; + dstring volSetIdent[128]; + struct charspec descCharSet; + struct charspec explanatoryCharSet; + struct extent_ad volAbstract; + struct extent_ad volCopyright; + struct regid appIdent; + struct timestamp recordingDateAndTime; + struct regid impIdent; + uint8_t impUse[64]; + __le32 predecessorVolDescSeqLocation; + __le16 flags; + uint8_t reserved[22]; +} __attribute__ ((packed)); + +/* Flags (ECMA 167r3 3/10.1.21) */ +#define PVD_FLAGS_VSID_COMMON 0x0001 + +/* Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */ +struct anchorVolDescPtr { + struct tag descTag; + struct extent_ad mainVolDescSeqExt; + struct extent_ad reserveVolDescSeqExt; + uint8_t reserved[480]; +} __attribute__ ((packed)); + +/* Volume Descriptor Pointer (ECMA 167r3 3/10.3) */ +struct volDescPtr { + struct tag descTag; + __le32 volDescSeqNum; + struct extent_ad nextVolDescSeqExt; + uint8_t reserved[484]; +} __attribute__ ((packed)); + +/* Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */ +struct impUseVolDesc { + struct tag descTag; + __le32 volDescSeqNum; + struct regid impIdent; + uint8_t impUse[460]; +} __attribute__ ((packed)); + +/* Partition Descriptor (ECMA 167r3 3/10.5) */ +struct partitionDesc { + struct tag descTag; + __le32 volDescSeqNum; + __le16 partitionFlags; + __le16 partitionNumber; + struct regid partitionContents; + uint8_t partitionContentsUse[128]; + __le32 accessType; + __le32 partitionStartingLocation; + __le32 partitionLength; + struct regid impIdent; + uint8_t impUse[128]; + uint8_t reserved[156]; +} __attribute__ ((packed)); + +/* Partition Flags (ECMA 167r3 3/10.5.3) */ +#define PD_PARTITION_FLAGS_ALLOC 0x0001 + +/* Partition Contents (ECMA 167r2 3/10.5.3) */ +#define PD_PARTITION_CONTENTS_NSR02 "+NSR02" + +/* Partition Contents (ECMA 167r3 3/10.5.5) */ +#define PD_PARTITION_CONTENTS_FDC01 "+FDC01" +#define PD_PARTITION_CONTENTS_CD001 "+CD001" +#define PD_PARTITION_CONTENTS_CDW02 "+CDW02" +#define PD_PARTITION_CONTENTS_NSR03 "+NSR03" + +/* Access Type (ECMA 167r3 3/10.5.7) */ +#define PD_ACCESS_TYPE_NONE 0x00000000 +#define PD_ACCESS_TYPE_READ_ONLY 0x00000001 +#define PD_ACCESS_TYPE_WRITE_ONCE 0x00000002 +#define PD_ACCESS_TYPE_REWRITABLE 0x00000003 +#define PD_ACCESS_TYPE_OVERWRITABLE 0x00000004 + +/* Logical Volume Descriptor (ECMA 167r3 3/10.6) */ +struct logicalVolDesc { + struct tag descTag; + __le32 volDescSeqNum; + struct charspec descCharSet; + dstring logicalVolIdent[128]; + __le32 logicalBlockSize; + struct regid domainIdent; + uint8_t logicalVolContentsUse[16]; + __le32 mapTableLength; + __le32 numPartitionMaps; + struct regid impIdent; + uint8_t impUse[128]; + struct extent_ad integritySeqExt; + uint8_t partitionMaps[0]; +} __attribute__ ((packed)); + +/* Generic Partition Map (ECMA 167r3 3/10.7.1) */ +struct genericPartitionMap { + uint8_t partitionMapType; + uint8_t partitionMapLength; + uint8_t partitionMapping[0]; +} __attribute__ ((packed)); + +/* Partition Map Type (ECMA 167r3 3/10.7.1.1) */ +#define GP_PARTITION_MAP_TYPE_UNDEF 0x00 +#define GP_PARTIITON_MAP_TYPE_1 0x01 +#define GP_PARTITION_MAP_TYPE_2 0x02 + +/* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */ +struct genericPartitionMap1 { + uint8_t partitionMapType; + uint8_t partitionMapLength; + __le16 volSeqNum; + __le16 partitionNum; +} __attribute__ ((packed)); + +/* Type 2 Partition Map (ECMA 167r3 3/10.7.3) */ +struct genericPartitionMap2 { + uint8_t partitionMapType; + uint8_t partitionMapLength; + uint8_t partitionIdent[62]; +} __attribute__ ((packed)); + +/* Unallocated Space Descriptor (ECMA 167r3 3/10.8) */ +struct unallocSpaceDesc { + struct tag descTag; + __le32 volDescSeqNum; + __le32 numAllocDescs; + struct extent_ad allocDescs[0]; +} __attribute__ ((packed)); + +/* Terminating Descriptor (ECMA 167r3 3/10.9) */ +struct terminatingDesc { + struct tag descTag; + uint8_t reserved[496]; +} __attribute__ ((packed)); + +/* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */ +struct logicalVolIntegrityDesc { + struct tag descTag; + struct timestamp recordingDateAndTime; + __le32 integrityType; + struct extent_ad nextIntegrityExt; + uint8_t logicalVolContentsUse[32]; + __le32 numOfPartitions; + __le32 lengthOfImpUse; + __le32 freeSpaceTable[0]; + __le32 sizeTable[0]; + uint8_t impUse[0]; +} __attribute__ ((packed)); + +/* Integrity Type (ECMA 167r3 3/10.10.3) */ +#define LVID_INTEGRITY_TYPE_OPEN 0x00000000 +#define LVID_INTEGRITY_TYPE_CLOSE 0x00000001 + +/* Recorded Address (ECMA 167r3 4/7.1) */ +struct lb_addr { + __le32 logicalBlockNum; + __le16 partitionReferenceNum; +} __attribute__ ((packed)); + +/* ... and its in-core analog */ +struct kernel_lb_addr { + uint32_t logicalBlockNum; + uint16_t partitionReferenceNum; +}; + +/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */ +struct short_ad { + __le32 extLength; + __le32 extPosition; +} __attribute__ ((packed)); + +/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */ +struct long_ad { + __le32 extLength; + struct lb_addr extLocation; + uint8_t impUse[6]; +} __attribute__ ((packed)); + +struct kernel_long_ad { + uint32_t extLength; + struct kernel_lb_addr extLocation; + uint8_t impUse[6]; +}; + +/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */ +struct ext_ad { + __le32 extLength; + __le32 recordedLength; + __le32 informationLength; + struct lb_addr extLocation; +} __attribute__ ((packed)); + +struct kernel_ext_ad { + uint32_t extLength; + uint32_t recordedLength; + uint32_t informationLength; + struct kernel_lb_addr extLocation; +}; + +/* Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */ + +/* Tag Identifier (ECMA 167r3 4/7.2.1) */ +#define TAG_IDENT_FSD 0x0100 +#define TAG_IDENT_FID 0x0101 +#define TAG_IDENT_AED 0x0102 +#define TAG_IDENT_IE 0x0103 +#define TAG_IDENT_TE 0x0104 +#define TAG_IDENT_FE 0x0105 +#define TAG_IDENT_EAHD 0x0106 +#define TAG_IDENT_USE 0x0107 +#define TAG_IDENT_SBD 0x0108 +#define TAG_IDENT_PIE 0x0109 +#define TAG_IDENT_EFE 0x010A + +/* File Set Descriptor (ECMA 167r3 4/14.1) */ +struct fileSetDesc { + struct tag descTag; + struct timestamp recordingDateAndTime; + __le16 interchangeLvl; + __le16 maxInterchangeLvl; + __le32 charSetList; + __le32 maxCharSetList; + __le32 fileSetNum; + __le32 fileSetDescNum; + struct charspec logicalVolIdentCharSet; + dstring logicalVolIdent[128]; + struct charspec fileSetCharSet; + dstring fileSetIdent[32]; + dstring copyrightFileIdent[32]; + dstring abstractFileIdent[32]; + struct long_ad rootDirectoryICB; + struct regid domainIdent; + struct long_ad nextExt; + struct long_ad streamDirectoryICB; + uint8_t reserved[32]; +} __attribute__ ((packed)); + +/* Partition Header Descriptor (ECMA 167r3 4/14.3) */ +struct partitionHeaderDesc { + struct short_ad unallocSpaceTable; + struct short_ad unallocSpaceBitmap; + struct short_ad partitionIntegrityTable; + struct short_ad freedSpaceTable; + struct short_ad freedSpaceBitmap; + uint8_t reserved[88]; +} __attribute__ ((packed)); + +/* File Identifier Descriptor (ECMA 167r3 4/14.4) */ +struct fileIdentDesc { + struct tag descTag; + __le16 fileVersionNum; + uint8_t fileCharacteristics; + uint8_t lengthFileIdent; + struct long_ad icb; + __le16 lengthOfImpUse; + uint8_t impUse[0]; + uint8_t fileIdent[0]; + uint8_t padding[0]; +} __attribute__ ((packed)); + +/* File Characteristics (ECMA 167r3 4/14.4.3) */ +#define FID_FILE_CHAR_HIDDEN 0x01 +#define FID_FILE_CHAR_DIRECTORY 0x02 +#define FID_FILE_CHAR_DELETED 0x04 +#define FID_FILE_CHAR_PARENT 0x08 +#define FID_FILE_CHAR_METADATA 0x10 + +/* Allocation Ext Descriptor (ECMA 167r3 4/14.5) */ +struct allocExtDesc { + struct tag descTag; + __le32 previousAllocExtLocation; + __le32 lengthAllocDescs; +} __attribute__ ((packed)); + +/* ICB Tag (ECMA 167r3 4/14.6) */ +struct icbtag { + __le32 priorRecordedNumDirectEntries; + __le16 strategyType; + __le16 strategyParameter; + __le16 numEntries; + uint8_t reserved; + uint8_t fileType; + struct lb_addr parentICBLocation; + __le16 flags; +} __attribute__ ((packed)); + +/* Strategy Type (ECMA 167r3 4/14.6.2) */ +#define ICBTAG_STRATEGY_TYPE_UNDEF 0x0000 +#define ICBTAG_STRATEGY_TYPE_1 0x0001 +#define ICBTAG_STRATEGY_TYPE_2 0x0002 +#define ICBTAG_STRATEGY_TYPE_3 0x0003 +#define ICBTAG_STRATEGY_TYPE_4 0x0004 + +/* File Type (ECMA 167r3 4/14.6.6) */ +#define ICBTAG_FILE_TYPE_UNDEF 0x00 +#define ICBTAG_FILE_TYPE_USE 0x01 +#define ICBTAG_FILE_TYPE_PIE 0x02 +#define ICBTAG_FILE_TYPE_IE 0x03 +#define ICBTAG_FILE_TYPE_DIRECTORY 0x04 +#define ICBTAG_FILE_TYPE_REGULAR 0x05 +#define ICBTAG_FILE_TYPE_BLOCK 0x06 +#define ICBTAG_FILE_TYPE_CHAR 0x07 +#define ICBTAG_FILE_TYPE_EA 0x08 +#define ICBTAG_FILE_TYPE_FIFO 0x09 +#define ICBTAG_FILE_TYPE_SOCKET 0x0A +#define ICBTAG_FILE_TYPE_TE 0x0B +#define ICBTAG_FILE_TYPE_SYMLINK 0x0C +#define ICBTAG_FILE_TYPE_STREAMDIR 0x0D + +/* Flags (ECMA 167r3 4/14.6.8) */ +#define ICBTAG_FLAG_AD_MASK 0x0007 +#define ICBTAG_FLAG_AD_SHORT 0x0000 +#define ICBTAG_FLAG_AD_LONG 0x0001 +#define ICBTAG_FLAG_AD_EXTENDED 0x0002 +#define ICBTAG_FLAG_AD_IN_ICB 0x0003 +#define ICBTAG_FLAG_SORTED 0x0008 +#define ICBTAG_FLAG_NONRELOCATABLE 0x0010 +#define ICBTAG_FLAG_ARCHIVE 0x0020 +#define ICBTAG_FLAG_SETUID 0x0040 +#define ICBTAG_FLAG_SETGID 0x0080 +#define ICBTAG_FLAG_STICKY 0x0100 +#define ICBTAG_FLAG_CONTIGUOUS 0x0200 +#define ICBTAG_FLAG_SYSTEM 0x0400 +#define ICBTAG_FLAG_TRANSFORMED 0x0800 +#define ICBTAG_FLAG_MULTIVERSIONS 0x1000 +#define ICBTAG_FLAG_STREAM 0x2000 + +/* Indirect Entry (ECMA 167r3 4/14.7) */ +struct indirectEntry { + struct tag descTag; + struct icbtag icbTag; + struct long_ad indirectICB; +} __attribute__ ((packed)); + +/* Terminal Entry (ECMA 167r3 4/14.8) */ +struct terminalEntry { + struct tag descTag; + struct icbtag icbTag; +} __attribute__ ((packed)); + +/* File Entry (ECMA 167r3 4/14.9) */ +struct fileEntry { + struct tag descTag; + struct icbtag icbTag; + __le32 uid; + __le32 gid; + __le32 permissions; + __le16 fileLinkCount; + uint8_t recordFormat; + uint8_t recordDisplayAttr; + __le32 recordLength; + __le64 informationLength; + __le64 logicalBlocksRecorded; + struct timestamp accessTime; + struct timestamp modificationTime; + struct timestamp attrTime; + __le32 checkpoint; + struct long_ad extendedAttrICB; + struct regid impIdent; + __le64 uniqueID; + __le32 lengthExtendedAttr; + __le32 lengthAllocDescs; + uint8_t extendedAttr[0]; + uint8_t allocDescs[0]; +} __attribute__ ((packed)); + +/* Permissions (ECMA 167r3 4/14.9.5) */ +#define FE_PERM_O_EXEC 0x00000001U +#define FE_PERM_O_WRITE 0x00000002U +#define FE_PERM_O_READ 0x00000004U +#define FE_PERM_O_CHATTR 0x00000008U +#define FE_PERM_O_DELETE 0x00000010U +#define FE_PERM_G_EXEC 0x00000020U +#define FE_PERM_G_WRITE 0x00000040U +#define FE_PERM_G_READ 0x00000080U +#define FE_PERM_G_CHATTR 0x00000100U +#define FE_PERM_G_DELETE 0x00000200U +#define FE_PERM_U_EXEC 0x00000400U +#define FE_PERM_U_WRITE 0x00000800U +#define FE_PERM_U_READ 0x00001000U +#define FE_PERM_U_CHATTR 0x00002000U +#define FE_PERM_U_DELETE 0x00004000U + +/* Record Format (ECMA 167r3 4/14.9.7) */ +#define FE_RECORD_FMT_UNDEF 0x00 +#define FE_RECORD_FMT_FIXED_PAD 0x01 +#define FE_RECORD_FMT_FIXED 0x02 +#define FE_RECORD_FMT_VARIABLE8 0x03 +#define FE_RECORD_FMT_VARIABLE16 0x04 +#define FE_RECORD_FMT_VARIABLE16_MSB 0x05 +#define FE_RECORD_FMT_VARIABLE32 0x06 +#define FE_RECORD_FMT_PRINT 0x07 +#define FE_RECORD_FMT_LF 0x08 +#define FE_RECORD_FMT_CR 0x09 +#define FE_RECORD_FMT_CRLF 0x0A +#define FE_RECORD_FMT_LFCR 0x0B + +/* Record Display Attributes (ECMA 167r3 4/14.9.8) */ +#define FE_RECORD_DISPLAY_ATTR_UNDEF 0x00 +#define FE_RECORD_DISPLAY_ATTR_1 0x01 +#define FE_RECORD_DISPLAY_ATTR_2 0x02 +#define FE_RECORD_DISPLAY_ATTR_3 0x03 + +/* Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */ +struct extendedAttrHeaderDesc { + struct tag descTag; + __le32 impAttrLocation; + __le32 appAttrLocation; +} __attribute__ ((packed)); + +/* Generic Format (ECMA 167r3 4/14.10.2) */ +struct genericFormat { + __le32 attrType; + uint8_t attrSubtype; + uint8_t reserved[3]; + __le32 attrLength; + uint8_t attrData[0]; +} __attribute__ ((packed)); + +/* Character Set Information (ECMA 167r3 4/14.10.3) */ +struct charSetInfo { + __le32 attrType; + uint8_t attrSubtype; + uint8_t reserved[3]; + __le32 attrLength; + __le32 escapeSeqLength; + uint8_t charSetType; + uint8_t escapeSeq[0]; +} __attribute__ ((packed)); + +/* Alternate Permissions (ECMA 167r3 4/14.10.4) */ +struct altPerms { + __le32 attrType; + uint8_t attrSubtype; + uint8_t reserved[3]; + __le32 attrLength; + __le16 ownerIdent; + __le16 groupIdent; + __le16 permission; +} __attribute__ ((packed)); + +/* File Times Extended Attribute (ECMA 167r3 4/14.10.5) */ +struct fileTimesExtAttr { + __le32 attrType; + uint8_t attrSubtype; + uint8_t reserved[3]; + __le32 attrLength; + __le32 dataLength; + __le32 fileTimeExistence; + uint8_t fileTimes; +} __attribute__ ((packed)); + +/* FileTimeExistence (ECMA 167r3 4/14.10.5.6) */ +#define FTE_CREATION 0x00000001 +#define FTE_DELETION 0x00000004 +#define FTE_EFFECTIVE 0x00000008 +#define FTE_BACKUP 0x00000002 + +/* Information Times Extended Attribute (ECMA 167r3 4/14.10.6) */ +struct infoTimesExtAttr { + __le32 attrType; + uint8_t attrSubtype; + uint8_t reserved[3]; + __le32 attrLength; + __le32 dataLength; + __le32 infoTimeExistence; + uint8_t infoTimes[0]; +} __attribute__ ((packed)); + +/* Device Specification (ECMA 167r3 4/14.10.7) */ +struct deviceSpec { + __le32 attrType; + uint8_t attrSubtype; + uint8_t reserved[3]; + __le32 attrLength; + __le32 impUseLength; + __le32 majorDeviceIdent; + __le32 minorDeviceIdent; + uint8_t impUse[0]; +} __attribute__ ((packed)); + +/* Implementation Use Extended Attr (ECMA 167r3 4/14.10.8) */ +struct impUseExtAttr { + __le32 attrType; + uint8_t attrSubtype; + uint8_t reserved[3]; + __le32 attrLength; + __le32 impUseLength; + struct regid impIdent; + uint8_t impUse[0]; +} __attribute__ ((packed)); + +/* Application Use Extended Attribute (ECMA 167r3 4/14.10.9) */ +struct appUseExtAttr { + __le32 attrType; + uint8_t attrSubtype; + uint8_t reserved[3]; + __le32 attrLength; + __le32 appUseLength; + struct regid appIdent; + uint8_t appUse[0]; +} __attribute__ ((packed)); + +#define EXTATTR_CHAR_SET 1 +#define EXTATTR_ALT_PERMS 3 +#define EXTATTR_FILE_TIMES 5 +#define EXTATTR_INFO_TIMES 6 +#define EXTATTR_DEV_SPEC 12 +#define EXTATTR_IMP_USE 2048 +#define EXTATTR_APP_USE 65536 + +/* Unallocated Space Entry (ECMA 167r3 4/14.11) */ +struct unallocSpaceEntry { + struct tag descTag; + struct icbtag icbTag; + __le32 lengthAllocDescs; + uint8_t allocDescs[0]; +} __attribute__ ((packed)); + +/* Space Bitmap Descriptor (ECMA 167r3 4/14.12) */ +struct spaceBitmapDesc { + struct tag descTag; + __le32 numOfBits; + __le32 numOfBytes; + uint8_t bitmap[0]; +} __attribute__ ((packed)); + +/* Partition Integrity Entry (ECMA 167r3 4/14.13) */ +struct partitionIntegrityEntry { + struct tag descTag; + struct icbtag icbTag; + struct timestamp recordingDateAndTime; + uint8_t integrityType; + uint8_t reserved[175]; + struct regid impIdent; + uint8_t impUse[256]; +} __attribute__ ((packed)); + +/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */ + +/* Extent Length (ECMA 167r3 4/14.14.1.1) */ +#define EXT_RECORDED_ALLOCATED 0x00000000 +#define EXT_NOT_RECORDED_ALLOCATED 0x40000000 +#define EXT_NOT_RECORDED_NOT_ALLOCATED 0x80000000 +#define EXT_NEXT_EXTENT_ALLOCDECS 0xC0000000 + +/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */ + +/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */ + +/* Logical Volume Header Descriptor (ECMA 167r3 4/14.15) */ +struct logicalVolHeaderDesc { + __le64 uniqueID; + uint8_t reserved[24]; +} __attribute__ ((packed)); + +/* Path Component (ECMA 167r3 4/14.16.1) */ +struct pathComponent { + uint8_t componentType; + uint8_t lengthComponentIdent; + __le16 componentFileVersionNum; + dstring componentIdent[0]; +} __attribute__ ((packed)); + +/* File Entry (ECMA 167r3 4/14.17) */ +struct extendedFileEntry { + struct tag descTag; + struct icbtag icbTag; + __le32 uid; + __le32 gid; + __le32 permissions; + __le16 fileLinkCount; + uint8_t recordFormat; + uint8_t recordDisplayAttr; + __le32 recordLength; + __le64 informationLength; + __le64 objectSize; + __le64 logicalBlocksRecorded; + struct timestamp accessTime; + struct timestamp modificationTime; + struct timestamp createTime; + struct timestamp attrTime; + __le32 checkpoint; + __le32 reserved; + struct long_ad extendedAttrICB; + struct long_ad streamDirectoryICB; + struct regid impIdent; + __le64 uniqueID; + __le32 lengthExtendedAttr; + __le32 lengthAllocDescs; + uint8_t extendedAttr[0]; + uint8_t allocDescs[0]; +} __attribute__ ((packed)); + +#endif /* _ECMA_167_H */ diff --git a/vendor/linux/fs/udf/file.c b/vendor/linux/fs/udf/file.c new file mode 100644 index 0000000..dbcb3a4 --- /dev/null +++ b/vendor/linux/fs/udf/file.c @@ -0,0 +1,282 @@ +/* + * file.c + * + * PURPOSE + * File handling routines for the OSTA-UDF(tm) filesystem. + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + * + * (C) 1998-1999 Dave Boynton + * (C) 1998-2004 Ben Fennema + * (C) 1999-2000 Stelias Computing Inc + * + * HISTORY + * + * 10/02/98 dgb Attempt to integrate into udf.o + * 10/07/98 Switched to using generic_readpage, etc., like isofs + * And it works! + * 12/06/98 blf Added udf_file_read. uses generic_file_read for all cases but + * ICBTAG_FLAG_AD_IN_ICB. + * 04/06/99 64 bit file handling on 32 bit systems taken from ext2 file.c + * 05/12/99 Preliminary file write support + */ + +#include "udfdecl.h" +#include +#include +#include +#include /* memset */ +#include +#include +#include +#include + +#include "udf_i.h" +#include "udf_sb.h" + +static void __udf_adinicb_readpage(struct page *page) +{ + struct inode *inode = page->mapping->host; + char *kaddr; + struct udf_inode_info *iinfo = UDF_I(inode); + + kaddr = kmap(page); + memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr, inode->i_size); + memset(kaddr + inode->i_size, 0, PAGE_SIZE - inode->i_size); + flush_dcache_page(page); + SetPageUptodate(page); + kunmap(page); +} + +static int udf_adinicb_readpage(struct file *file, struct page *page) +{ + BUG_ON(!PageLocked(page)); + __udf_adinicb_readpage(page); + unlock_page(page); + + return 0; +} + +static int udf_adinicb_writepage(struct page *page, + struct writeback_control *wbc) +{ + struct inode *inode = page->mapping->host; + char *kaddr; + struct udf_inode_info *iinfo = UDF_I(inode); + + BUG_ON(!PageLocked(page)); + + kaddr = kmap(page); + memcpy(iinfo->i_ext.i_data + iinfo->i_lenEAttr, kaddr, inode->i_size); + mark_inode_dirty(inode); + SetPageUptodate(page); + kunmap(page); + unlock_page(page); + + return 0; +} + +static int udf_adinicb_write_begin(struct file *file, + struct address_space *mapping, loff_t pos, + unsigned len, unsigned flags, struct page **pagep, + void **fsdata) +{ + struct page *page; + + if (WARN_ON_ONCE(pos >= PAGE_SIZE)) + return -EIO; + page = grab_cache_page_write_begin(mapping, 0, flags); + if (!page) + return -ENOMEM; + *pagep = page; + + if (!PageUptodate(page)) + __udf_adinicb_readpage(page); + return 0; +} + +static ssize_t udf_adinicb_direct_IO(struct kiocb *iocb, struct iov_iter *iter) +{ + /* Fallback to buffered I/O. */ + return 0; +} + +static int udf_adinicb_write_end(struct file *file, struct address_space *mapping, + loff_t pos, unsigned len, unsigned copied, + struct page *page, void *fsdata) +{ + struct inode *inode = page->mapping->host; + loff_t last_pos = pos + copied; + if (last_pos > inode->i_size) + i_size_write(inode, last_pos); + set_page_dirty(page); + unlock_page(page); + put_page(page); + return copied; +} + +const struct address_space_operations udf_adinicb_aops = { + .readpage = udf_adinicb_readpage, + .writepage = udf_adinicb_writepage, + .write_begin = udf_adinicb_write_begin, + .write_end = udf_adinicb_write_end, + .direct_IO = udf_adinicb_direct_IO, +}; + +static ssize_t udf_file_write_iter(struct kiocb *iocb, struct iov_iter *from) +{ + ssize_t retval; + struct file *file = iocb->ki_filp; + struct inode *inode = file_inode(file); + struct udf_inode_info *iinfo = UDF_I(inode); + int err; + + inode_lock(inode); + + retval = generic_write_checks(iocb, from); + if (retval <= 0) + goto out; + + down_write(&iinfo->i_data_sem); + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { + loff_t end = iocb->ki_pos + iov_iter_count(from); + + if (inode->i_sb->s_blocksize < + (udf_file_entry_alloc_offset(inode) + end)) { + err = udf_expand_file_adinicb(inode); + if (err) { + inode_unlock(inode); + udf_debug("udf_expand_adinicb: err=%d\n", err); + return err; + } + } else { + iinfo->i_lenAlloc = max(end, inode->i_size); + up_write(&iinfo->i_data_sem); + } + } else + up_write(&iinfo->i_data_sem); + + retval = __generic_file_write_iter(iocb, from); +out: + inode_unlock(inode); + + if (retval > 0) { + mark_inode_dirty(inode); + retval = generic_write_sync(iocb, retval); + } + + return retval; +} + +long udf_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + struct inode *inode = file_inode(filp); + long old_block, new_block; + int result = -EINVAL; + + if (inode_permission(inode, MAY_READ) != 0) { + udf_debug("no permission to access inode %lu\n", inode->i_ino); + result = -EPERM; + goto out; + } + + if (!arg) { + udf_debug("invalid argument to udf_ioctl\n"); + result = -EINVAL; + goto out; + } + + switch (cmd) { + case UDF_GETVOLIDENT: + if (copy_to_user((char __user *)arg, + UDF_SB(inode->i_sb)->s_volume_ident, 32)) + result = -EFAULT; + else + result = 0; + goto out; + case UDF_RELOCATE_BLOCKS: + if (!capable(CAP_SYS_ADMIN)) { + result = -EPERM; + goto out; + } + if (get_user(old_block, (long __user *)arg)) { + result = -EFAULT; + goto out; + } + result = udf_relocate_blocks(inode->i_sb, + old_block, &new_block); + if (result == 0) + result = put_user(new_block, (long __user *)arg); + goto out; + case UDF_GETEASIZE: + result = put_user(UDF_I(inode)->i_lenEAttr, (int __user *)arg); + goto out; + case UDF_GETEABLOCK: + result = copy_to_user((char __user *)arg, + UDF_I(inode)->i_ext.i_data, + UDF_I(inode)->i_lenEAttr) ? -EFAULT : 0; + goto out; + } + +out: + return result; +} + +static int udf_release_file(struct inode *inode, struct file *filp) +{ + if (filp->f_mode & FMODE_WRITE && + atomic_read(&inode->i_writecount) == 1) { + /* + * Grab i_mutex to avoid races with writes changing i_size + * while we are running. + */ + inode_lock(inode); + down_write(&UDF_I(inode)->i_data_sem); + udf_discard_prealloc(inode); + udf_truncate_tail_extent(inode); + up_write(&UDF_I(inode)->i_data_sem); + inode_unlock(inode); + } + return 0; +} + +const struct file_operations udf_file_operations = { + .read_iter = generic_file_read_iter, + .unlocked_ioctl = udf_ioctl, + .open = generic_file_open, + .mmap = generic_file_mmap, + .write_iter = udf_file_write_iter, + .release = udf_release_file, + .fsync = generic_file_fsync, + .splice_read = generic_file_splice_read, + .llseek = generic_file_llseek, +}; + +static int udf_setattr(struct dentry *dentry, struct iattr *attr) +{ + struct inode *inode = d_inode(dentry); + int error; + + error = setattr_prepare(dentry, attr); + if (error) + return error; + + if ((attr->ia_valid & ATTR_SIZE) && + attr->ia_size != i_size_read(inode)) { + error = udf_setsize(inode, attr->ia_size); + if (error) + return error; + } + + setattr_copy(inode, attr); + mark_inode_dirty(inode); + return 0; +} + +const struct inode_operations udf_file_inode_operations = { + .setattr = udf_setattr, +}; diff --git a/vendor/linux/fs/udf/ialloc.c b/vendor/linux/fs/udf/ialloc.c new file mode 100644 index 0000000..c1ed18a --- /dev/null +++ b/vendor/linux/fs/udf/ialloc.c @@ -0,0 +1,133 @@ +/* + * ialloc.c + * + * PURPOSE + * Inode allocation handling routines for the OSTA-UDF(tm) filesystem. + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + * + * (C) 1998-2001 Ben Fennema + * + * HISTORY + * + * 02/24/99 blf Created. + * + */ + +#include "udfdecl.h" +#include +#include +#include + +#include "udf_i.h" +#include "udf_sb.h" + +void udf_free_inode(struct inode *inode) +{ + struct super_block *sb = inode->i_sb; + struct udf_sb_info *sbi = UDF_SB(sb); + struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sb); + + if (lvidiu) { + mutex_lock(&sbi->s_alloc_mutex); + if (S_ISDIR(inode->i_mode)) + le32_add_cpu(&lvidiu->numDirs, -1); + else + le32_add_cpu(&lvidiu->numFiles, -1); + udf_updated_lvid(sb); + mutex_unlock(&sbi->s_alloc_mutex); + } + + udf_free_blocks(sb, NULL, &UDF_I(inode)->i_location, 0, 1); +} + +struct inode *udf_new_inode(struct inode *dir, umode_t mode) +{ + struct super_block *sb = dir->i_sb; + struct udf_sb_info *sbi = UDF_SB(sb); + struct inode *inode; + int block; + uint32_t start = UDF_I(dir)->i_location.logicalBlockNum; + struct udf_inode_info *iinfo; + struct udf_inode_info *dinfo = UDF_I(dir); + struct logicalVolIntegrityDescImpUse *lvidiu; + int err; + + inode = new_inode(sb); + + if (!inode) + return ERR_PTR(-ENOMEM); + + iinfo = UDF_I(inode); + if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_EXTENDED_FE)) { + iinfo->i_efe = 1; + if (UDF_VERS_USE_EXTENDED_FE > sbi->s_udfrev) + sbi->s_udfrev = UDF_VERS_USE_EXTENDED_FE; + iinfo->i_ext.i_data = kzalloc(inode->i_sb->s_blocksize - + sizeof(struct extendedFileEntry), + GFP_KERNEL); + } else { + iinfo->i_efe = 0; + iinfo->i_ext.i_data = kzalloc(inode->i_sb->s_blocksize - + sizeof(struct fileEntry), + GFP_KERNEL); + } + if (!iinfo->i_ext.i_data) { + iput(inode); + return ERR_PTR(-ENOMEM); + } + + err = -ENOSPC; + block = udf_new_block(dir->i_sb, NULL, + dinfo->i_location.partitionReferenceNum, + start, &err); + if (err) { + iput(inode); + return ERR_PTR(err); + } + + lvidiu = udf_sb_lvidiu(sb); + if (lvidiu) { + iinfo->i_unique = lvid_get_unique_id(sb); + inode->i_generation = iinfo->i_unique; + mutex_lock(&sbi->s_alloc_mutex); + if (S_ISDIR(mode)) + le32_add_cpu(&lvidiu->numDirs, 1); + else + le32_add_cpu(&lvidiu->numFiles, 1); + udf_updated_lvid(sb); + mutex_unlock(&sbi->s_alloc_mutex); + } + + inode_init_owner(inode, dir, mode); + + iinfo->i_location.logicalBlockNum = block; + iinfo->i_location.partitionReferenceNum = + dinfo->i_location.partitionReferenceNum; + inode->i_ino = udf_get_lb_pblock(sb, &iinfo->i_location, 0); + inode->i_blocks = 0; + iinfo->i_lenEAttr = 0; + iinfo->i_lenAlloc = 0; + iinfo->i_use = 0; + iinfo->i_checkpoint = 1; + if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_AD_IN_ICB)) + iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB; + else if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD)) + iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT; + else + iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; + inode->i_mtime = inode->i_atime = inode->i_ctime = + iinfo->i_crtime = current_time(inode); + if (unlikely(insert_inode_locked(inode) < 0)) { + make_bad_inode(inode); + iput(inode); + return ERR_PTR(-EIO); + } + mark_inode_dirty(inode); + + return inode; +} diff --git a/vendor/linux/fs/udf/inode.c b/vendor/linux/fs/udf/inode.c new file mode 100644 index 0000000..aad4640 --- /dev/null +++ b/vendor/linux/fs/udf/inode.c @@ -0,0 +1,2339 @@ +/* + * inode.c + * + * PURPOSE + * Inode handling routines for the OSTA-UDF(tm) filesystem. + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + * + * (C) 1998 Dave Boynton + * (C) 1998-2004 Ben Fennema + * (C) 1999-2000 Stelias Computing Inc + * + * HISTORY + * + * 10/04/98 dgb Added rudimentary directory functions + * 10/07/98 Fully working udf_block_map! It works! + * 11/25/98 bmap altered to better support extents + * 12/06/98 blf partition support in udf_iget, udf_block_map + * and udf_read_inode + * 12/12/98 rewrote udf_block_map to handle next extents and descs across + * block boundaries (which is not actually allowed) + * 12/20/98 added support for strategy 4096 + * 03/07/99 rewrote udf_block_map (again) + * New funcs, inode_bmap, udf_next_aext + * 04/19/99 Support for writing device EA's for major/minor # + */ + +#include "udfdecl.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include "udf_i.h" +#include "udf_sb.h" + +MODULE_AUTHOR("Ben Fennema"); +MODULE_DESCRIPTION("Universal Disk Format Filesystem"); +MODULE_LICENSE("GPL"); + +#define EXTENT_MERGE_SIZE 5 + +static umode_t udf_convert_permissions(struct fileEntry *); +static int udf_update_inode(struct inode *, int); +static int udf_sync_inode(struct inode *inode); +static int udf_alloc_i_data(struct inode *inode, size_t size); +static sector_t inode_getblk(struct inode *, sector_t, int *, int *); +static int8_t udf_insert_aext(struct inode *, struct extent_position, + struct kernel_lb_addr, uint32_t); +static void udf_split_extents(struct inode *, int *, int, int, + struct kernel_long_ad[EXTENT_MERGE_SIZE], int *); +static void udf_prealloc_extents(struct inode *, int, int, + struct kernel_long_ad[EXTENT_MERGE_SIZE], int *); +static void udf_merge_extents(struct inode *, + struct kernel_long_ad[EXTENT_MERGE_SIZE], int *); +static void udf_update_extents(struct inode *, + struct kernel_long_ad[EXTENT_MERGE_SIZE], int, int, + struct extent_position *); +static int udf_get_block(struct inode *, sector_t, struct buffer_head *, int); + +static void __udf_clear_extent_cache(struct inode *inode) +{ + struct udf_inode_info *iinfo = UDF_I(inode); + + if (iinfo->cached_extent.lstart != -1) { + brelse(iinfo->cached_extent.epos.bh); + iinfo->cached_extent.lstart = -1; + } +} + +/* Invalidate extent cache */ +static void udf_clear_extent_cache(struct inode *inode) +{ + struct udf_inode_info *iinfo = UDF_I(inode); + + spin_lock(&iinfo->i_extent_cache_lock); + __udf_clear_extent_cache(inode); + spin_unlock(&iinfo->i_extent_cache_lock); +} + +/* Return contents of extent cache */ +static int udf_read_extent_cache(struct inode *inode, loff_t bcount, + loff_t *lbcount, struct extent_position *pos) +{ + struct udf_inode_info *iinfo = UDF_I(inode); + int ret = 0; + + spin_lock(&iinfo->i_extent_cache_lock); + if ((iinfo->cached_extent.lstart <= bcount) && + (iinfo->cached_extent.lstart != -1)) { + /* Cache hit */ + *lbcount = iinfo->cached_extent.lstart; + memcpy(pos, &iinfo->cached_extent.epos, + sizeof(struct extent_position)); + if (pos->bh) + get_bh(pos->bh); + ret = 1; + } + spin_unlock(&iinfo->i_extent_cache_lock); + return ret; +} + +/* Add extent to extent cache */ +static void udf_update_extent_cache(struct inode *inode, loff_t estart, + struct extent_position *pos, int next_epos) +{ + struct udf_inode_info *iinfo = UDF_I(inode); + + spin_lock(&iinfo->i_extent_cache_lock); + /* Invalidate previously cached extent */ + __udf_clear_extent_cache(inode); + if (pos->bh) + get_bh(pos->bh); + memcpy(&iinfo->cached_extent.epos, pos, + sizeof(struct extent_position)); + iinfo->cached_extent.lstart = estart; + if (next_epos) + switch (iinfo->i_alloc_type) { + case ICBTAG_FLAG_AD_SHORT: + iinfo->cached_extent.epos.offset -= + sizeof(struct short_ad); + break; + case ICBTAG_FLAG_AD_LONG: + iinfo->cached_extent.epos.offset -= + sizeof(struct long_ad); + } + spin_unlock(&iinfo->i_extent_cache_lock); +} + +void udf_evict_inode(struct inode *inode) +{ + struct udf_inode_info *iinfo = UDF_I(inode); + int want_delete = 0; + + if (!inode->i_nlink && !is_bad_inode(inode)) { + want_delete = 1; + udf_setsize(inode, 0); + udf_update_inode(inode, IS_SYNC(inode)); + } + truncate_inode_pages_final(&inode->i_data); + invalidate_inode_buffers(inode); + clear_inode(inode); + if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB && + inode->i_size != iinfo->i_lenExtents) { + udf_warn(inode->i_sb, "Inode %lu (mode %o) has inode size %llu different from extent length %llu. Filesystem need not be standards compliant.\n", + inode->i_ino, inode->i_mode, + (unsigned long long)inode->i_size, + (unsigned long long)iinfo->i_lenExtents); + } + kfree(iinfo->i_ext.i_data); + iinfo->i_ext.i_data = NULL; + udf_clear_extent_cache(inode); + if (want_delete) { + udf_free_inode(inode); + } +} + +static void udf_write_failed(struct address_space *mapping, loff_t to) +{ + struct inode *inode = mapping->host; + struct udf_inode_info *iinfo = UDF_I(inode); + loff_t isize = inode->i_size; + + if (to > isize) { + truncate_pagecache(inode, isize); + if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { + down_write(&iinfo->i_data_sem); + udf_clear_extent_cache(inode); + udf_truncate_extents(inode); + up_write(&iinfo->i_data_sem); + } + } +} + +static int udf_writepage(struct page *page, struct writeback_control *wbc) +{ + return block_write_full_page(page, udf_get_block, wbc); +} + +static int udf_writepages(struct address_space *mapping, + struct writeback_control *wbc) +{ + return mpage_writepages(mapping, wbc, udf_get_block); +} + +static int udf_readpage(struct file *file, struct page *page) +{ + return mpage_readpage(page, udf_get_block); +} + +static int udf_readpages(struct file *file, struct address_space *mapping, + struct list_head *pages, unsigned nr_pages) +{ + return mpage_readpages(mapping, pages, nr_pages, udf_get_block); +} + +static int udf_write_begin(struct file *file, struct address_space *mapping, + loff_t pos, unsigned len, unsigned flags, + struct page **pagep, void **fsdata) +{ + int ret; + + ret = block_write_begin(mapping, pos, len, flags, pagep, udf_get_block); + if (unlikely(ret)) + udf_write_failed(mapping, pos + len); + return ret; +} + +static ssize_t udf_direct_IO(struct kiocb *iocb, struct iov_iter *iter) +{ + struct file *file = iocb->ki_filp; + struct address_space *mapping = file->f_mapping; + struct inode *inode = mapping->host; + size_t count = iov_iter_count(iter); + ssize_t ret; + + ret = blockdev_direct_IO(iocb, inode, iter, udf_get_block); + if (unlikely(ret < 0 && iov_iter_rw(iter) == WRITE)) + udf_write_failed(mapping, iocb->ki_pos + count); + return ret; +} + +static sector_t udf_bmap(struct address_space *mapping, sector_t block) +{ + return generic_block_bmap(mapping, block, udf_get_block); +} + +const struct address_space_operations udf_aops = { + .readpage = udf_readpage, + .readpages = udf_readpages, + .writepage = udf_writepage, + .writepages = udf_writepages, + .write_begin = udf_write_begin, + .write_end = generic_write_end, + .direct_IO = udf_direct_IO, + .bmap = udf_bmap, +}; + +/* + * Expand file stored in ICB to a normal one-block-file + * + * This function requires i_data_sem for writing and releases it. + * This function requires i_mutex held + */ +int udf_expand_file_adinicb(struct inode *inode) +{ + struct page *page; + char *kaddr; + struct udf_inode_info *iinfo = UDF_I(inode); + int err; + struct writeback_control udf_wbc = { + .sync_mode = WB_SYNC_NONE, + .nr_to_write = 1, + }; + + WARN_ON_ONCE(!inode_is_locked(inode)); + if (!iinfo->i_lenAlloc) { + if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD)) + iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT; + else + iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; + /* from now on we have normal address_space methods */ + inode->i_data.a_ops = &udf_aops; + up_write(&iinfo->i_data_sem); + mark_inode_dirty(inode); + return 0; + } + /* + * Release i_data_sem so that we can lock a page - page lock ranks + * above i_data_sem. i_mutex still protects us against file changes. + */ + up_write(&iinfo->i_data_sem); + + page = find_or_create_page(inode->i_mapping, 0, GFP_NOFS); + if (!page) + return -ENOMEM; + + if (!PageUptodate(page)) { + kaddr = kmap(page); + memset(kaddr + iinfo->i_lenAlloc, 0x00, + PAGE_SIZE - iinfo->i_lenAlloc); + memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr, + iinfo->i_lenAlloc); + flush_dcache_page(page); + SetPageUptodate(page); + kunmap(page); + } + down_write(&iinfo->i_data_sem); + memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr, 0x00, + iinfo->i_lenAlloc); + iinfo->i_lenAlloc = 0; + if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD)) + iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT; + else + iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; + /* from now on we have normal address_space methods */ + inode->i_data.a_ops = &udf_aops; + up_write(&iinfo->i_data_sem); + err = inode->i_data.a_ops->writepage(page, &udf_wbc); + if (err) { + /* Restore everything back so that we don't lose data... */ + lock_page(page); + kaddr = kmap(page); + down_write(&iinfo->i_data_sem); + memcpy(iinfo->i_ext.i_data + iinfo->i_lenEAttr, kaddr, + inode->i_size); + kunmap(page); + unlock_page(page); + iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB; + inode->i_data.a_ops = &udf_adinicb_aops; + up_write(&iinfo->i_data_sem); + } + put_page(page); + mark_inode_dirty(inode); + + return err; +} + +struct buffer_head *udf_expand_dir_adinicb(struct inode *inode, int *block, + int *err) +{ + int newblock; + struct buffer_head *dbh = NULL; + struct kernel_lb_addr eloc; + uint8_t alloctype; + struct extent_position epos; + + struct udf_fileident_bh sfibh, dfibh; + loff_t f_pos = udf_ext0_offset(inode); + int size = udf_ext0_offset(inode) + inode->i_size; + struct fileIdentDesc cfi, *sfi, *dfi; + struct udf_inode_info *iinfo = UDF_I(inode); + + if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD)) + alloctype = ICBTAG_FLAG_AD_SHORT; + else + alloctype = ICBTAG_FLAG_AD_LONG; + + if (!inode->i_size) { + iinfo->i_alloc_type = alloctype; + mark_inode_dirty(inode); + return NULL; + } + + /* alloc block, and copy data to it */ + *block = udf_new_block(inode->i_sb, inode, + iinfo->i_location.partitionReferenceNum, + iinfo->i_location.logicalBlockNum, err); + if (!(*block)) + return NULL; + newblock = udf_get_pblock(inode->i_sb, *block, + iinfo->i_location.partitionReferenceNum, + 0); + if (!newblock) + return NULL; + dbh = udf_tgetblk(inode->i_sb, newblock); + if (!dbh) + return NULL; + lock_buffer(dbh); + memset(dbh->b_data, 0x00, inode->i_sb->s_blocksize); + set_buffer_uptodate(dbh); + unlock_buffer(dbh); + mark_buffer_dirty_inode(dbh, inode); + + sfibh.soffset = sfibh.eoffset = + f_pos & (inode->i_sb->s_blocksize - 1); + sfibh.sbh = sfibh.ebh = NULL; + dfibh.soffset = dfibh.eoffset = 0; + dfibh.sbh = dfibh.ebh = dbh; + while (f_pos < size) { + iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB; + sfi = udf_fileident_read(inode, &f_pos, &sfibh, &cfi, NULL, + NULL, NULL, NULL); + if (!sfi) { + brelse(dbh); + return NULL; + } + iinfo->i_alloc_type = alloctype; + sfi->descTag.tagLocation = cpu_to_le32(*block); + dfibh.soffset = dfibh.eoffset; + dfibh.eoffset += (sfibh.eoffset - sfibh.soffset); + dfi = (struct fileIdentDesc *)(dbh->b_data + dfibh.soffset); + if (udf_write_fi(inode, sfi, dfi, &dfibh, sfi->impUse, + sfi->fileIdent + + le16_to_cpu(sfi->lengthOfImpUse))) { + iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB; + brelse(dbh); + return NULL; + } + } + mark_buffer_dirty_inode(dbh, inode); + + memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr, 0, + iinfo->i_lenAlloc); + iinfo->i_lenAlloc = 0; + eloc.logicalBlockNum = *block; + eloc.partitionReferenceNum = + iinfo->i_location.partitionReferenceNum; + iinfo->i_lenExtents = inode->i_size; + epos.bh = NULL; + epos.block = iinfo->i_location; + epos.offset = udf_file_entry_alloc_offset(inode); + udf_add_aext(inode, &epos, &eloc, inode->i_size, 0); + /* UniqueID stuff */ + + brelse(epos.bh); + mark_inode_dirty(inode); + return dbh; +} + +static int udf_get_block(struct inode *inode, sector_t block, + struct buffer_head *bh_result, int create) +{ + int err, new; + sector_t phys = 0; + struct udf_inode_info *iinfo; + + if (!create) { + phys = udf_block_map(inode, block); + if (phys) + map_bh(bh_result, inode->i_sb, phys); + return 0; + } + + err = -EIO; + new = 0; + iinfo = UDF_I(inode); + + down_write(&iinfo->i_data_sem); + if (block == iinfo->i_next_alloc_block + 1) { + iinfo->i_next_alloc_block++; + iinfo->i_next_alloc_goal++; + } + + udf_clear_extent_cache(inode); + phys = inode_getblk(inode, block, &err, &new); + if (!phys) + goto abort; + + if (new) + set_buffer_new(bh_result); + map_bh(bh_result, inode->i_sb, phys); + +abort: + up_write(&iinfo->i_data_sem); + return err; +} + +static struct buffer_head *udf_getblk(struct inode *inode, long block, + int create, int *err) +{ + struct buffer_head *bh; + struct buffer_head dummy; + + dummy.b_state = 0; + dummy.b_blocknr = -1000; + *err = udf_get_block(inode, block, &dummy, create); + if (!*err && buffer_mapped(&dummy)) { + bh = sb_getblk(inode->i_sb, dummy.b_blocknr); + if (buffer_new(&dummy)) { + lock_buffer(bh); + memset(bh->b_data, 0x00, inode->i_sb->s_blocksize); + set_buffer_uptodate(bh); + unlock_buffer(bh); + mark_buffer_dirty_inode(bh, inode); + } + return bh; + } + + return NULL; +} + +/* Extend the file by 'blocks' blocks, return the number of extents added */ +static int udf_do_extend_file(struct inode *inode, + struct extent_position *last_pos, + struct kernel_long_ad *last_ext, + sector_t blocks) +{ + sector_t add; + int count = 0, fake = !(last_ext->extLength & UDF_EXTENT_LENGTH_MASK); + struct super_block *sb = inode->i_sb; + struct kernel_lb_addr prealloc_loc = {}; + int prealloc_len = 0; + struct udf_inode_info *iinfo; + int err; + + /* The previous extent is fake and we should not extend by anything + * - there's nothing to do... */ + if (!blocks && fake) + return 0; + + iinfo = UDF_I(inode); + /* Round the last extent up to a multiple of block size */ + if (last_ext->extLength & (sb->s_blocksize - 1)) { + last_ext->extLength = + (last_ext->extLength & UDF_EXTENT_FLAG_MASK) | + (((last_ext->extLength & UDF_EXTENT_LENGTH_MASK) + + sb->s_blocksize - 1) & ~(sb->s_blocksize - 1)); + iinfo->i_lenExtents = + (iinfo->i_lenExtents + sb->s_blocksize - 1) & + ~(sb->s_blocksize - 1); + } + + /* Last extent are just preallocated blocks? */ + if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) == + EXT_NOT_RECORDED_ALLOCATED) { + /* Save the extent so that we can reattach it to the end */ + prealloc_loc = last_ext->extLocation; + prealloc_len = last_ext->extLength; + /* Mark the extent as a hole */ + last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | + (last_ext->extLength & UDF_EXTENT_LENGTH_MASK); + last_ext->extLocation.logicalBlockNum = 0; + last_ext->extLocation.partitionReferenceNum = 0; + } + + /* Can we merge with the previous extent? */ + if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) == + EXT_NOT_RECORDED_NOT_ALLOCATED) { + add = ((1 << 30) - sb->s_blocksize - + (last_ext->extLength & UDF_EXTENT_LENGTH_MASK)) >> + sb->s_blocksize_bits; + if (add > blocks) + add = blocks; + blocks -= add; + last_ext->extLength += add << sb->s_blocksize_bits; + } + + if (fake) { + udf_add_aext(inode, last_pos, &last_ext->extLocation, + last_ext->extLength, 1); + count++; + } else { + struct kernel_lb_addr tmploc; + uint32_t tmplen; + + udf_write_aext(inode, last_pos, &last_ext->extLocation, + last_ext->extLength, 1); + /* + * We've rewritten the last extent but there may be empty + * indirect extent after it - enter it. + */ + udf_next_aext(inode, last_pos, &tmploc, &tmplen, 0); + } + + /* Managed to do everything necessary? */ + if (!blocks) + goto out; + + /* All further extents will be NOT_RECORDED_NOT_ALLOCATED */ + last_ext->extLocation.logicalBlockNum = 0; + last_ext->extLocation.partitionReferenceNum = 0; + add = (1 << (30-sb->s_blocksize_bits)) - 1; + last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | + (add << sb->s_blocksize_bits); + + /* Create enough extents to cover the whole hole */ + while (blocks > add) { + blocks -= add; + err = udf_add_aext(inode, last_pos, &last_ext->extLocation, + last_ext->extLength, 1); + if (err) + return err; + count++; + } + if (blocks) { + last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | + (blocks << sb->s_blocksize_bits); + err = udf_add_aext(inode, last_pos, &last_ext->extLocation, + last_ext->extLength, 1); + if (err) + return err; + count++; + } + +out: + /* Do we have some preallocated blocks saved? */ + if (prealloc_len) { + err = udf_add_aext(inode, last_pos, &prealloc_loc, + prealloc_len, 1); + if (err) + return err; + last_ext->extLocation = prealloc_loc; + last_ext->extLength = prealloc_len; + count++; + } + + /* last_pos should point to the last written extent... */ + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + last_pos->offset -= sizeof(struct short_ad); + else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + last_pos->offset -= sizeof(struct long_ad); + else + return -EIO; + + return count; +} + +static int udf_extend_file(struct inode *inode, loff_t newsize) +{ + + struct extent_position epos; + struct kernel_lb_addr eloc; + uint32_t elen; + int8_t etype; + struct super_block *sb = inode->i_sb; + sector_t first_block = newsize >> sb->s_blocksize_bits, offset; + int adsize; + struct udf_inode_info *iinfo = UDF_I(inode); + struct kernel_long_ad extent; + int err; + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + adsize = sizeof(struct short_ad); + else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + adsize = sizeof(struct long_ad); + else + BUG(); + + etype = inode_bmap(inode, first_block, &epos, &eloc, &elen, &offset); + + /* File has extent covering the new size (could happen when extending + * inside a block)? */ + if (etype != -1) + return 0; + if (newsize & (sb->s_blocksize - 1)) + offset++; + /* Extended file just to the boundary of the last file block? */ + if (offset == 0) + return 0; + + /* Truncate is extending the file by 'offset' blocks */ + if ((!epos.bh && epos.offset == udf_file_entry_alloc_offset(inode)) || + (epos.bh && epos.offset == sizeof(struct allocExtDesc))) { + /* File has no extents at all or has empty last + * indirect extent! Create a fake extent... */ + extent.extLocation.logicalBlockNum = 0; + extent.extLocation.partitionReferenceNum = 0; + extent.extLength = EXT_NOT_RECORDED_NOT_ALLOCATED; + } else { + epos.offset -= adsize; + etype = udf_next_aext(inode, &epos, &extent.extLocation, + &extent.extLength, 0); + extent.extLength |= etype << 30; + } + err = udf_do_extend_file(inode, &epos, &extent, offset); + if (err < 0) + goto out; + err = 0; + iinfo->i_lenExtents = newsize; +out: + brelse(epos.bh); + return err; +} + +static sector_t inode_getblk(struct inode *inode, sector_t block, + int *err, int *new) +{ + struct kernel_long_ad laarr[EXTENT_MERGE_SIZE]; + struct extent_position prev_epos, cur_epos, next_epos; + int count = 0, startnum = 0, endnum = 0; + uint32_t elen = 0, tmpelen; + struct kernel_lb_addr eloc, tmpeloc; + int c = 1; + loff_t lbcount = 0, b_off = 0; + uint32_t newblocknum, newblock; + sector_t offset = 0; + int8_t etype; + struct udf_inode_info *iinfo = UDF_I(inode); + int goal = 0, pgoal = iinfo->i_location.logicalBlockNum; + int lastblock = 0; + bool isBeyondEOF; + + *err = 0; + *new = 0; + prev_epos.offset = udf_file_entry_alloc_offset(inode); + prev_epos.block = iinfo->i_location; + prev_epos.bh = NULL; + cur_epos = next_epos = prev_epos; + b_off = (loff_t)block << inode->i_sb->s_blocksize_bits; + + /* find the extent which contains the block we are looking for. + alternate between laarr[0] and laarr[1] for locations of the + current extent, and the previous extent */ + do { + if (prev_epos.bh != cur_epos.bh) { + brelse(prev_epos.bh); + get_bh(cur_epos.bh); + prev_epos.bh = cur_epos.bh; + } + if (cur_epos.bh != next_epos.bh) { + brelse(cur_epos.bh); + get_bh(next_epos.bh); + cur_epos.bh = next_epos.bh; + } + + lbcount += elen; + + prev_epos.block = cur_epos.block; + cur_epos.block = next_epos.block; + + prev_epos.offset = cur_epos.offset; + cur_epos.offset = next_epos.offset; + + etype = udf_next_aext(inode, &next_epos, &eloc, &elen, 1); + if (etype == -1) + break; + + c = !c; + + laarr[c].extLength = (etype << 30) | elen; + laarr[c].extLocation = eloc; + + if (etype != (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) + pgoal = eloc.logicalBlockNum + + ((elen + inode->i_sb->s_blocksize - 1) >> + inode->i_sb->s_blocksize_bits); + + count++; + } while (lbcount + elen <= b_off); + + b_off -= lbcount; + offset = b_off >> inode->i_sb->s_blocksize_bits; + /* + * Move prev_epos and cur_epos into indirect extent if we are at + * the pointer to it + */ + udf_next_aext(inode, &prev_epos, &tmpeloc, &tmpelen, 0); + udf_next_aext(inode, &cur_epos, &tmpeloc, &tmpelen, 0); + + /* if the extent is allocated and recorded, return the block + if the extent is not a multiple of the blocksize, round up */ + + if (etype == (EXT_RECORDED_ALLOCATED >> 30)) { + if (elen & (inode->i_sb->s_blocksize - 1)) { + elen = EXT_RECORDED_ALLOCATED | + ((elen + inode->i_sb->s_blocksize - 1) & + ~(inode->i_sb->s_blocksize - 1)); + udf_write_aext(inode, &cur_epos, &eloc, elen, 1); + } + brelse(prev_epos.bh); + brelse(cur_epos.bh); + brelse(next_epos.bh); + newblock = udf_get_lb_pblock(inode->i_sb, &eloc, offset); + return newblock; + } + + /* Are we beyond EOF? */ + if (etype == -1) { + int ret; + isBeyondEOF = true; + if (count) { + if (c) + laarr[0] = laarr[1]; + startnum = 1; + } else { + /* Create a fake extent when there's not one */ + memset(&laarr[0].extLocation, 0x00, + sizeof(struct kernel_lb_addr)); + laarr[0].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED; + /* Will udf_do_extend_file() create real extent from + a fake one? */ + startnum = (offset > 0); + } + /* Create extents for the hole between EOF and offset */ + ret = udf_do_extend_file(inode, &prev_epos, laarr, offset); + if (ret < 0) { + brelse(prev_epos.bh); + brelse(cur_epos.bh); + brelse(next_epos.bh); + *err = ret; + return 0; + } + c = 0; + offset = 0; + count += ret; + /* We are not covered by a preallocated extent? */ + if ((laarr[0].extLength & UDF_EXTENT_FLAG_MASK) != + EXT_NOT_RECORDED_ALLOCATED) { + /* Is there any real extent? - otherwise we overwrite + * the fake one... */ + if (count) + c = !c; + laarr[c].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | + inode->i_sb->s_blocksize; + memset(&laarr[c].extLocation, 0x00, + sizeof(struct kernel_lb_addr)); + count++; + } + endnum = c + 1; + lastblock = 1; + } else { + isBeyondEOF = false; + endnum = startnum = ((count > 2) ? 2 : count); + + /* if the current extent is in position 0, + swap it with the previous */ + if (!c && count != 1) { + laarr[2] = laarr[0]; + laarr[0] = laarr[1]; + laarr[1] = laarr[2]; + c = 1; + } + + /* if the current block is located in an extent, + read the next extent */ + etype = udf_next_aext(inode, &next_epos, &eloc, &elen, 0); + if (etype != -1) { + laarr[c + 1].extLength = (etype << 30) | elen; + laarr[c + 1].extLocation = eloc; + count++; + startnum++; + endnum++; + } else + lastblock = 1; + } + + /* if the current extent is not recorded but allocated, get the + * block in the extent corresponding to the requested block */ + if ((laarr[c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30)) + newblocknum = laarr[c].extLocation.logicalBlockNum + offset; + else { /* otherwise, allocate a new block */ + if (iinfo->i_next_alloc_block == block) + goal = iinfo->i_next_alloc_goal; + + if (!goal) { + if (!(goal = pgoal)) /* XXX: what was intended here? */ + goal = iinfo->i_location.logicalBlockNum + 1; + } + + newblocknum = udf_new_block(inode->i_sb, inode, + iinfo->i_location.partitionReferenceNum, + goal, err); + if (!newblocknum) { + brelse(prev_epos.bh); + brelse(cur_epos.bh); + brelse(next_epos.bh); + *err = -ENOSPC; + return 0; + } + if (isBeyondEOF) + iinfo->i_lenExtents += inode->i_sb->s_blocksize; + } + + /* if the extent the requsted block is located in contains multiple + * blocks, split the extent into at most three extents. blocks prior + * to requested block, requested block, and blocks after requested + * block */ + udf_split_extents(inode, &c, offset, newblocknum, laarr, &endnum); + +#ifdef UDF_PREALLOCATE + /* We preallocate blocks only for regular files. It also makes sense + * for directories but there's a problem when to drop the + * preallocation. We might use some delayed work for that but I feel + * it's overengineering for a filesystem like UDF. */ + if (S_ISREG(inode->i_mode)) + udf_prealloc_extents(inode, c, lastblock, laarr, &endnum); +#endif + + /* merge any continuous blocks in laarr */ + udf_merge_extents(inode, laarr, &endnum); + + /* write back the new extents, inserting new extents if the new number + * of extents is greater than the old number, and deleting extents if + * the new number of extents is less than the old number */ + udf_update_extents(inode, laarr, startnum, endnum, &prev_epos); + + brelse(prev_epos.bh); + brelse(cur_epos.bh); + brelse(next_epos.bh); + + newblock = udf_get_pblock(inode->i_sb, newblocknum, + iinfo->i_location.partitionReferenceNum, 0); + if (!newblock) { + *err = -EIO; + return 0; + } + *new = 1; + iinfo->i_next_alloc_block = block; + iinfo->i_next_alloc_goal = newblocknum; + inode->i_ctime = current_time(inode); + + if (IS_SYNC(inode)) + udf_sync_inode(inode); + else + mark_inode_dirty(inode); + + return newblock; +} + +static void udf_split_extents(struct inode *inode, int *c, int offset, + int newblocknum, + struct kernel_long_ad laarr[EXTENT_MERGE_SIZE], + int *endnum) +{ + unsigned long blocksize = inode->i_sb->s_blocksize; + unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits; + + if ((laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30) || + (laarr[*c].extLength >> 30) == + (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) { + int curr = *c; + int blen = ((laarr[curr].extLength & UDF_EXTENT_LENGTH_MASK) + + blocksize - 1) >> blocksize_bits; + int8_t etype = (laarr[curr].extLength >> 30); + + if (blen == 1) + ; + else if (!offset || blen == offset + 1) { + laarr[curr + 2] = laarr[curr + 1]; + laarr[curr + 1] = laarr[curr]; + } else { + laarr[curr + 3] = laarr[curr + 1]; + laarr[curr + 2] = laarr[curr + 1] = laarr[curr]; + } + + if (offset) { + if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { + udf_free_blocks(inode->i_sb, inode, + &laarr[curr].extLocation, + 0, offset); + laarr[curr].extLength = + EXT_NOT_RECORDED_NOT_ALLOCATED | + (offset << blocksize_bits); + laarr[curr].extLocation.logicalBlockNum = 0; + laarr[curr].extLocation. + partitionReferenceNum = 0; + } else + laarr[curr].extLength = (etype << 30) | + (offset << blocksize_bits); + curr++; + (*c)++; + (*endnum)++; + } + + laarr[curr].extLocation.logicalBlockNum = newblocknum; + if (etype == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) + laarr[curr].extLocation.partitionReferenceNum = + UDF_I(inode)->i_location.partitionReferenceNum; + laarr[curr].extLength = EXT_RECORDED_ALLOCATED | + blocksize; + curr++; + + if (blen != offset + 1) { + if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) + laarr[curr].extLocation.logicalBlockNum += + offset + 1; + laarr[curr].extLength = (etype << 30) | + ((blen - (offset + 1)) << blocksize_bits); + curr++; + (*endnum)++; + } + } +} + +static void udf_prealloc_extents(struct inode *inode, int c, int lastblock, + struct kernel_long_ad laarr[EXTENT_MERGE_SIZE], + int *endnum) +{ + int start, length = 0, currlength = 0, i; + + if (*endnum >= (c + 1)) { + if (!lastblock) + return; + else + start = c; + } else { + if ((laarr[c + 1].extLength >> 30) == + (EXT_NOT_RECORDED_ALLOCATED >> 30)) { + start = c + 1; + length = currlength = + (((laarr[c + 1].extLength & + UDF_EXTENT_LENGTH_MASK) + + inode->i_sb->s_blocksize - 1) >> + inode->i_sb->s_blocksize_bits); + } else + start = c; + } + + for (i = start + 1; i <= *endnum; i++) { + if (i == *endnum) { + if (lastblock) + length += UDF_DEFAULT_PREALLOC_BLOCKS; + } else if ((laarr[i].extLength >> 30) == + (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) { + length += (((laarr[i].extLength & + UDF_EXTENT_LENGTH_MASK) + + inode->i_sb->s_blocksize - 1) >> + inode->i_sb->s_blocksize_bits); + } else + break; + } + + if (length) { + int next = laarr[start].extLocation.logicalBlockNum + + (((laarr[start].extLength & UDF_EXTENT_LENGTH_MASK) + + inode->i_sb->s_blocksize - 1) >> + inode->i_sb->s_blocksize_bits); + int numalloc = udf_prealloc_blocks(inode->i_sb, inode, + laarr[start].extLocation.partitionReferenceNum, + next, (UDF_DEFAULT_PREALLOC_BLOCKS > length ? + length : UDF_DEFAULT_PREALLOC_BLOCKS) - + currlength); + if (numalloc) { + if (start == (c + 1)) + laarr[start].extLength += + (numalloc << + inode->i_sb->s_blocksize_bits); + else { + memmove(&laarr[c + 2], &laarr[c + 1], + sizeof(struct long_ad) * (*endnum - (c + 1))); + (*endnum)++; + laarr[c + 1].extLocation.logicalBlockNum = next; + laarr[c + 1].extLocation.partitionReferenceNum = + laarr[c].extLocation. + partitionReferenceNum; + laarr[c + 1].extLength = + EXT_NOT_RECORDED_ALLOCATED | + (numalloc << + inode->i_sb->s_blocksize_bits); + start = c + 1; + } + + for (i = start + 1; numalloc && i < *endnum; i++) { + int elen = ((laarr[i].extLength & + UDF_EXTENT_LENGTH_MASK) + + inode->i_sb->s_blocksize - 1) >> + inode->i_sb->s_blocksize_bits; + + if (elen > numalloc) { + laarr[i].extLength -= + (numalloc << + inode->i_sb->s_blocksize_bits); + numalloc = 0; + } else { + numalloc -= elen; + if (*endnum > (i + 1)) + memmove(&laarr[i], + &laarr[i + 1], + sizeof(struct long_ad) * + (*endnum - (i + 1))); + i--; + (*endnum)--; + } + } + UDF_I(inode)->i_lenExtents += + numalloc << inode->i_sb->s_blocksize_bits; + } + } +} + +static void udf_merge_extents(struct inode *inode, + struct kernel_long_ad laarr[EXTENT_MERGE_SIZE], + int *endnum) +{ + int i; + unsigned long blocksize = inode->i_sb->s_blocksize; + unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits; + + for (i = 0; i < (*endnum - 1); i++) { + struct kernel_long_ad *li /*l[i]*/ = &laarr[i]; + struct kernel_long_ad *lip1 /*l[i plus 1]*/ = &laarr[i + 1]; + + if (((li->extLength >> 30) == (lip1->extLength >> 30)) && + (((li->extLength >> 30) == + (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) || + ((lip1->extLocation.logicalBlockNum - + li->extLocation.logicalBlockNum) == + (((li->extLength & UDF_EXTENT_LENGTH_MASK) + + blocksize - 1) >> blocksize_bits)))) { + + if (((li->extLength & UDF_EXTENT_LENGTH_MASK) + + (lip1->extLength & UDF_EXTENT_LENGTH_MASK) + + blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK) { + lip1->extLength = (lip1->extLength - + (li->extLength & + UDF_EXTENT_LENGTH_MASK) + + UDF_EXTENT_LENGTH_MASK) & + ~(blocksize - 1); + li->extLength = (li->extLength & + UDF_EXTENT_FLAG_MASK) + + (UDF_EXTENT_LENGTH_MASK + 1) - + blocksize; + lip1->extLocation.logicalBlockNum = + li->extLocation.logicalBlockNum + + ((li->extLength & + UDF_EXTENT_LENGTH_MASK) >> + blocksize_bits); + } else { + li->extLength = lip1->extLength + + (((li->extLength & + UDF_EXTENT_LENGTH_MASK) + + blocksize - 1) & ~(blocksize - 1)); + if (*endnum > (i + 2)) + memmove(&laarr[i + 1], &laarr[i + 2], + sizeof(struct long_ad) * + (*endnum - (i + 2))); + i--; + (*endnum)--; + } + } else if (((li->extLength >> 30) == + (EXT_NOT_RECORDED_ALLOCATED >> 30)) && + ((lip1->extLength >> 30) == + (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))) { + udf_free_blocks(inode->i_sb, inode, &li->extLocation, 0, + ((li->extLength & + UDF_EXTENT_LENGTH_MASK) + + blocksize - 1) >> blocksize_bits); + li->extLocation.logicalBlockNum = 0; + li->extLocation.partitionReferenceNum = 0; + + if (((li->extLength & UDF_EXTENT_LENGTH_MASK) + + (lip1->extLength & UDF_EXTENT_LENGTH_MASK) + + blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK) { + lip1->extLength = (lip1->extLength - + (li->extLength & + UDF_EXTENT_LENGTH_MASK) + + UDF_EXTENT_LENGTH_MASK) & + ~(blocksize - 1); + li->extLength = (li->extLength & + UDF_EXTENT_FLAG_MASK) + + (UDF_EXTENT_LENGTH_MASK + 1) - + blocksize; + } else { + li->extLength = lip1->extLength + + (((li->extLength & + UDF_EXTENT_LENGTH_MASK) + + blocksize - 1) & ~(blocksize - 1)); + if (*endnum > (i + 2)) + memmove(&laarr[i + 1], &laarr[i + 2], + sizeof(struct long_ad) * + (*endnum - (i + 2))); + i--; + (*endnum)--; + } + } else if ((li->extLength >> 30) == + (EXT_NOT_RECORDED_ALLOCATED >> 30)) { + udf_free_blocks(inode->i_sb, inode, + &li->extLocation, 0, + ((li->extLength & + UDF_EXTENT_LENGTH_MASK) + + blocksize - 1) >> blocksize_bits); + li->extLocation.logicalBlockNum = 0; + li->extLocation.partitionReferenceNum = 0; + li->extLength = (li->extLength & + UDF_EXTENT_LENGTH_MASK) | + EXT_NOT_RECORDED_NOT_ALLOCATED; + } + } +} + +static void udf_update_extents(struct inode *inode, + struct kernel_long_ad laarr[EXTENT_MERGE_SIZE], + int startnum, int endnum, + struct extent_position *epos) +{ + int start = 0, i; + struct kernel_lb_addr tmploc; + uint32_t tmplen; + + if (startnum > endnum) { + for (i = 0; i < (startnum - endnum); i++) + udf_delete_aext(inode, *epos, laarr[i].extLocation, + laarr[i].extLength); + } else if (startnum < endnum) { + for (i = 0; i < (endnum - startnum); i++) { + udf_insert_aext(inode, *epos, laarr[i].extLocation, + laarr[i].extLength); + udf_next_aext(inode, epos, &laarr[i].extLocation, + &laarr[i].extLength, 1); + start++; + } + } + + for (i = start; i < endnum; i++) { + udf_next_aext(inode, epos, &tmploc, &tmplen, 0); + udf_write_aext(inode, epos, &laarr[i].extLocation, + laarr[i].extLength, 1); + } +} + +struct buffer_head *udf_bread(struct inode *inode, int block, + int create, int *err) +{ + struct buffer_head *bh = NULL; + + bh = udf_getblk(inode, block, create, err); + if (!bh) + return NULL; + + if (buffer_uptodate(bh)) + return bh; + + ll_rw_block(REQ_OP_READ, 0, 1, &bh); + + wait_on_buffer(bh); + if (buffer_uptodate(bh)) + return bh; + + brelse(bh); + *err = -EIO; + return NULL; +} + +int udf_setsize(struct inode *inode, loff_t newsize) +{ + int err; + struct udf_inode_info *iinfo; + int bsize = 1 << inode->i_blkbits; + + if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || + S_ISLNK(inode->i_mode))) + return -EINVAL; + if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) + return -EPERM; + + iinfo = UDF_I(inode); + if (newsize > inode->i_size) { + down_write(&iinfo->i_data_sem); + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { + if (bsize < + (udf_file_entry_alloc_offset(inode) + newsize)) { + err = udf_expand_file_adinicb(inode); + if (err) + return err; + down_write(&iinfo->i_data_sem); + } else { + iinfo->i_lenAlloc = newsize; + goto set_size; + } + } + err = udf_extend_file(inode, newsize); + if (err) { + up_write(&iinfo->i_data_sem); + return err; + } +set_size: + truncate_setsize(inode, newsize); + up_write(&iinfo->i_data_sem); + } else { + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { + down_write(&iinfo->i_data_sem); + udf_clear_extent_cache(inode); + memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr + newsize, + 0x00, bsize - newsize - + udf_file_entry_alloc_offset(inode)); + iinfo->i_lenAlloc = newsize; + truncate_setsize(inode, newsize); + up_write(&iinfo->i_data_sem); + goto update_time; + } + err = block_truncate_page(inode->i_mapping, newsize, + udf_get_block); + if (err) + return err; + down_write(&iinfo->i_data_sem); + udf_clear_extent_cache(inode); + truncate_setsize(inode, newsize); + udf_truncate_extents(inode); + up_write(&iinfo->i_data_sem); + } +update_time: + inode->i_mtime = inode->i_ctime = current_time(inode); + if (IS_SYNC(inode)) + udf_sync_inode(inode); + else + mark_inode_dirty(inode); + return 0; +} + +/* + * Maximum length of linked list formed by ICB hierarchy. The chosen number is + * arbitrary - just that we hopefully don't limit any real use of rewritten + * inode on write-once media but avoid looping for too long on corrupted media. + */ +#define UDF_MAX_ICB_NESTING 1024 + +static int udf_read_inode(struct inode *inode, bool hidden_inode) +{ + struct buffer_head *bh = NULL; + struct fileEntry *fe; + struct extendedFileEntry *efe; + uint16_t ident; + struct udf_inode_info *iinfo = UDF_I(inode); + struct udf_sb_info *sbi = UDF_SB(inode->i_sb); + struct kernel_lb_addr *iloc = &iinfo->i_location; + unsigned int link_count; + unsigned int indirections = 0; + int bs = inode->i_sb->s_blocksize; + int ret = -EIO; + +reread: + if (iloc->logicalBlockNum >= + sbi->s_partmaps[iloc->partitionReferenceNum].s_partition_len) { + udf_debug("block=%d, partition=%d out of range\n", + iloc->logicalBlockNum, iloc->partitionReferenceNum); + return -EIO; + } + + /* + * Set defaults, but the inode is still incomplete! + * Note: get_new_inode() sets the following on a new inode: + * i_sb = sb + * i_no = ino + * i_flags = sb->s_flags + * i_state = 0 + * clean_inode(): zero fills and sets + * i_count = 1 + * i_nlink = 1 + * i_op = NULL; + */ + bh = udf_read_ptagged(inode->i_sb, iloc, 0, &ident); + if (!bh) { + udf_err(inode->i_sb, "(ino %ld) failed !bh\n", inode->i_ino); + return -EIO; + } + + if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE && + ident != TAG_IDENT_USE) { + udf_err(inode->i_sb, "(ino %ld) failed ident=%d\n", + inode->i_ino, ident); + goto out; + } + + fe = (struct fileEntry *)bh->b_data; + efe = (struct extendedFileEntry *)bh->b_data; + + if (fe->icbTag.strategyType == cpu_to_le16(4096)) { + struct buffer_head *ibh; + + ibh = udf_read_ptagged(inode->i_sb, iloc, 1, &ident); + if (ident == TAG_IDENT_IE && ibh) { + struct kernel_lb_addr loc; + struct indirectEntry *ie; + + ie = (struct indirectEntry *)ibh->b_data; + loc = lelb_to_cpu(ie->indirectICB.extLocation); + + if (ie->indirectICB.extLength) { + brelse(ibh); + memcpy(&iinfo->i_location, &loc, + sizeof(struct kernel_lb_addr)); + if (++indirections > UDF_MAX_ICB_NESTING) { + udf_err(inode->i_sb, + "too many ICBs in ICB hierarchy" + " (max %d supported)\n", + UDF_MAX_ICB_NESTING); + goto out; + } + brelse(bh); + goto reread; + } + } + brelse(ibh); + } else if (fe->icbTag.strategyType != cpu_to_le16(4)) { + udf_err(inode->i_sb, "unsupported strategy type: %d\n", + le16_to_cpu(fe->icbTag.strategyType)); + goto out; + } + if (fe->icbTag.strategyType == cpu_to_le16(4)) + iinfo->i_strat4096 = 0; + else /* if (fe->icbTag.strategyType == cpu_to_le16(4096)) */ + iinfo->i_strat4096 = 1; + + iinfo->i_alloc_type = le16_to_cpu(fe->icbTag.flags) & + ICBTAG_FLAG_AD_MASK; + iinfo->i_unique = 0; + iinfo->i_lenEAttr = 0; + iinfo->i_lenExtents = 0; + iinfo->i_lenAlloc = 0; + iinfo->i_next_alloc_block = 0; + iinfo->i_next_alloc_goal = 0; + if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_EFE)) { + iinfo->i_efe = 1; + iinfo->i_use = 0; + ret = udf_alloc_i_data(inode, bs - + sizeof(struct extendedFileEntry)); + if (ret) + goto out; + memcpy(iinfo->i_ext.i_data, + bh->b_data + sizeof(struct extendedFileEntry), + bs - sizeof(struct extendedFileEntry)); + } else if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_FE)) { + iinfo->i_efe = 0; + iinfo->i_use = 0; + ret = udf_alloc_i_data(inode, bs - sizeof(struct fileEntry)); + if (ret) + goto out; + memcpy(iinfo->i_ext.i_data, + bh->b_data + sizeof(struct fileEntry), + bs - sizeof(struct fileEntry)); + } else if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_USE)) { + iinfo->i_efe = 0; + iinfo->i_use = 1; + iinfo->i_lenAlloc = le32_to_cpu( + ((struct unallocSpaceEntry *)bh->b_data)-> + lengthAllocDescs); + ret = udf_alloc_i_data(inode, bs - + sizeof(struct unallocSpaceEntry)); + if (ret) + goto out; + memcpy(iinfo->i_ext.i_data, + bh->b_data + sizeof(struct unallocSpaceEntry), + bs - sizeof(struct unallocSpaceEntry)); + return 0; + } + + ret = -EIO; + read_lock(&sbi->s_cred_lock); + i_uid_write(inode, le32_to_cpu(fe->uid)); + if (!uid_valid(inode->i_uid) || + UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_IGNORE) || + UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_SET)) + inode->i_uid = UDF_SB(inode->i_sb)->s_uid; + + i_gid_write(inode, le32_to_cpu(fe->gid)); + if (!gid_valid(inode->i_gid) || + UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_IGNORE) || + UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_SET)) + inode->i_gid = UDF_SB(inode->i_sb)->s_gid; + + if (fe->icbTag.fileType != ICBTAG_FILE_TYPE_DIRECTORY && + sbi->s_fmode != UDF_INVALID_MODE) + inode->i_mode = sbi->s_fmode; + else if (fe->icbTag.fileType == ICBTAG_FILE_TYPE_DIRECTORY && + sbi->s_dmode != UDF_INVALID_MODE) + inode->i_mode = sbi->s_dmode; + else + inode->i_mode = udf_convert_permissions(fe); + inode->i_mode &= ~sbi->s_umask; + read_unlock(&sbi->s_cred_lock); + + link_count = le16_to_cpu(fe->fileLinkCount); + if (!link_count) { + if (!hidden_inode) { + ret = -ESTALE; + goto out; + } + link_count = 1; + } + set_nlink(inode, link_count); + + inode->i_size = le64_to_cpu(fe->informationLength); + iinfo->i_lenExtents = inode->i_size; + + if (iinfo->i_efe == 0) { + inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) << + (inode->i_sb->s_blocksize_bits - 9); + + if (!udf_disk_stamp_to_time(&inode->i_atime, fe->accessTime)) + inode->i_atime = sbi->s_record_time; + + if (!udf_disk_stamp_to_time(&inode->i_mtime, + fe->modificationTime)) + inode->i_mtime = sbi->s_record_time; + + if (!udf_disk_stamp_to_time(&inode->i_ctime, fe->attrTime)) + inode->i_ctime = sbi->s_record_time; + + iinfo->i_unique = le64_to_cpu(fe->uniqueID); + iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr); + iinfo->i_lenAlloc = le32_to_cpu(fe->lengthAllocDescs); + iinfo->i_checkpoint = le32_to_cpu(fe->checkpoint); + } else { + inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) << + (inode->i_sb->s_blocksize_bits - 9); + + if (!udf_disk_stamp_to_time(&inode->i_atime, efe->accessTime)) + inode->i_atime = sbi->s_record_time; + + if (!udf_disk_stamp_to_time(&inode->i_mtime, + efe->modificationTime)) + inode->i_mtime = sbi->s_record_time; + + if (!udf_disk_stamp_to_time(&iinfo->i_crtime, efe->createTime)) + iinfo->i_crtime = sbi->s_record_time; + + if (!udf_disk_stamp_to_time(&inode->i_ctime, efe->attrTime)) + inode->i_ctime = sbi->s_record_time; + + iinfo->i_unique = le64_to_cpu(efe->uniqueID); + iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr); + iinfo->i_lenAlloc = le32_to_cpu(efe->lengthAllocDescs); + iinfo->i_checkpoint = le32_to_cpu(efe->checkpoint); + } + inode->i_generation = iinfo->i_unique; + + /* + * Sanity check length of allocation descriptors and extended attrs to + * avoid integer overflows + */ + if (iinfo->i_lenEAttr > bs || iinfo->i_lenAlloc > bs) + goto out; + /* Now do exact checks */ + if (udf_file_entry_alloc_offset(inode) + iinfo->i_lenAlloc > bs) + goto out; + /* Sanity checks for files in ICB so that we don't get confused later */ + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { + /* + * For file in ICB data is stored in allocation descriptor + * so sizes should match + */ + if (iinfo->i_lenAlloc != inode->i_size) + goto out; + /* File in ICB has to fit in there... */ + if (inode->i_size > bs - udf_file_entry_alloc_offset(inode)) + goto out; + } + + switch (fe->icbTag.fileType) { + case ICBTAG_FILE_TYPE_DIRECTORY: + inode->i_op = &udf_dir_inode_operations; + inode->i_fop = &udf_dir_operations; + inode->i_mode |= S_IFDIR; + inc_nlink(inode); + break; + case ICBTAG_FILE_TYPE_REALTIME: + case ICBTAG_FILE_TYPE_REGULAR: + case ICBTAG_FILE_TYPE_UNDEF: + case ICBTAG_FILE_TYPE_VAT20: + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) + inode->i_data.a_ops = &udf_adinicb_aops; + else + inode->i_data.a_ops = &udf_aops; + inode->i_op = &udf_file_inode_operations; + inode->i_fop = &udf_file_operations; + inode->i_mode |= S_IFREG; + break; + case ICBTAG_FILE_TYPE_BLOCK: + inode->i_mode |= S_IFBLK; + break; + case ICBTAG_FILE_TYPE_CHAR: + inode->i_mode |= S_IFCHR; + break; + case ICBTAG_FILE_TYPE_FIFO: + init_special_inode(inode, inode->i_mode | S_IFIFO, 0); + break; + case ICBTAG_FILE_TYPE_SOCKET: + init_special_inode(inode, inode->i_mode | S_IFSOCK, 0); + break; + case ICBTAG_FILE_TYPE_SYMLINK: + inode->i_data.a_ops = &udf_symlink_aops; + inode->i_op = &page_symlink_inode_operations; + inode_nohighmem(inode); + inode->i_mode = S_IFLNK | S_IRWXUGO; + break; + case ICBTAG_FILE_TYPE_MAIN: + udf_debug("METADATA FILE-----\n"); + break; + case ICBTAG_FILE_TYPE_MIRROR: + udf_debug("METADATA MIRROR FILE-----\n"); + break; + case ICBTAG_FILE_TYPE_BITMAP: + udf_debug("METADATA BITMAP FILE-----\n"); + break; + default: + udf_err(inode->i_sb, "(ino %ld) failed unknown file type=%d\n", + inode->i_ino, fe->icbTag.fileType); + goto out; + } + if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { + struct deviceSpec *dsea = + (struct deviceSpec *)udf_get_extendedattr(inode, 12, 1); + if (dsea) { + init_special_inode(inode, inode->i_mode, + MKDEV(le32_to_cpu(dsea->majorDeviceIdent), + le32_to_cpu(dsea->minorDeviceIdent))); + /* Developer ID ??? */ + } else + goto out; + } + ret = 0; +out: + brelse(bh); + return ret; +} + +static int udf_alloc_i_data(struct inode *inode, size_t size) +{ + struct udf_inode_info *iinfo = UDF_I(inode); + iinfo->i_ext.i_data = kmalloc(size, GFP_KERNEL); + + if (!iinfo->i_ext.i_data) { + udf_err(inode->i_sb, "(ino %ld) no free memory\n", + inode->i_ino); + return -ENOMEM; + } + + return 0; +} + +static umode_t udf_convert_permissions(struct fileEntry *fe) +{ + umode_t mode; + uint32_t permissions; + uint32_t flags; + + permissions = le32_to_cpu(fe->permissions); + flags = le16_to_cpu(fe->icbTag.flags); + + mode = ((permissions) & S_IRWXO) | + ((permissions >> 2) & S_IRWXG) | + ((permissions >> 4) & S_IRWXU) | + ((flags & ICBTAG_FLAG_SETUID) ? S_ISUID : 0) | + ((flags & ICBTAG_FLAG_SETGID) ? S_ISGID : 0) | + ((flags & ICBTAG_FLAG_STICKY) ? S_ISVTX : 0); + + return mode; +} + +int udf_write_inode(struct inode *inode, struct writeback_control *wbc) +{ + return udf_update_inode(inode, wbc->sync_mode == WB_SYNC_ALL); +} + +static int udf_sync_inode(struct inode *inode) +{ + return udf_update_inode(inode, 1); +} + +static int udf_update_inode(struct inode *inode, int do_sync) +{ + struct buffer_head *bh = NULL; + struct fileEntry *fe; + struct extendedFileEntry *efe; + uint64_t lb_recorded; + uint32_t udfperms; + uint16_t icbflags; + uint16_t crclen; + int err = 0; + struct udf_sb_info *sbi = UDF_SB(inode->i_sb); + unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits; + struct udf_inode_info *iinfo = UDF_I(inode); + + bh = udf_tgetblk(inode->i_sb, + udf_get_lb_pblock(inode->i_sb, &iinfo->i_location, 0)); + if (!bh) { + udf_debug("getblk failure\n"); + return -EIO; + } + + lock_buffer(bh); + memset(bh->b_data, 0, inode->i_sb->s_blocksize); + fe = (struct fileEntry *)bh->b_data; + efe = (struct extendedFileEntry *)bh->b_data; + + if (iinfo->i_use) { + struct unallocSpaceEntry *use = + (struct unallocSpaceEntry *)bh->b_data; + + use->lengthAllocDescs = cpu_to_le32(iinfo->i_lenAlloc); + memcpy(bh->b_data + sizeof(struct unallocSpaceEntry), + iinfo->i_ext.i_data, inode->i_sb->s_blocksize - + sizeof(struct unallocSpaceEntry)); + use->descTag.tagIdent = cpu_to_le16(TAG_IDENT_USE); + crclen = sizeof(struct unallocSpaceEntry); + + goto finish; + } + + if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_FORGET)) + fe->uid = cpu_to_le32(-1); + else + fe->uid = cpu_to_le32(i_uid_read(inode)); + + if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_FORGET)) + fe->gid = cpu_to_le32(-1); + else + fe->gid = cpu_to_le32(i_gid_read(inode)); + + udfperms = ((inode->i_mode & S_IRWXO)) | + ((inode->i_mode & S_IRWXG) << 2) | + ((inode->i_mode & S_IRWXU) << 4); + + udfperms |= (le32_to_cpu(fe->permissions) & + (FE_PERM_O_DELETE | FE_PERM_O_CHATTR | + FE_PERM_G_DELETE | FE_PERM_G_CHATTR | + FE_PERM_U_DELETE | FE_PERM_U_CHATTR)); + fe->permissions = cpu_to_le32(udfperms); + + if (S_ISDIR(inode->i_mode) && inode->i_nlink > 0) + fe->fileLinkCount = cpu_to_le16(inode->i_nlink - 1); + else + fe->fileLinkCount = cpu_to_le16(inode->i_nlink); + + fe->informationLength = cpu_to_le64(inode->i_size); + + if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { + struct regid *eid; + struct deviceSpec *dsea = + (struct deviceSpec *)udf_get_extendedattr(inode, 12, 1); + if (!dsea) { + dsea = (struct deviceSpec *) + udf_add_extendedattr(inode, + sizeof(struct deviceSpec) + + sizeof(struct regid), 12, 0x3); + dsea->attrType = cpu_to_le32(12); + dsea->attrSubtype = 1; + dsea->attrLength = cpu_to_le32( + sizeof(struct deviceSpec) + + sizeof(struct regid)); + dsea->impUseLength = cpu_to_le32(sizeof(struct regid)); + } + eid = (struct regid *)dsea->impUse; + memset(eid, 0, sizeof(struct regid)); + strcpy(eid->ident, UDF_ID_DEVELOPER); + eid->identSuffix[0] = UDF_OS_CLASS_UNIX; + eid->identSuffix[1] = UDF_OS_ID_LINUX; + dsea->majorDeviceIdent = cpu_to_le32(imajor(inode)); + dsea->minorDeviceIdent = cpu_to_le32(iminor(inode)); + } + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) + lb_recorded = 0; /* No extents => no blocks! */ + else + lb_recorded = + (inode->i_blocks + (1 << (blocksize_bits - 9)) - 1) >> + (blocksize_bits - 9); + + if (iinfo->i_efe == 0) { + memcpy(bh->b_data + sizeof(struct fileEntry), + iinfo->i_ext.i_data, + inode->i_sb->s_blocksize - sizeof(struct fileEntry)); + fe->logicalBlocksRecorded = cpu_to_le64(lb_recorded); + + udf_time_to_disk_stamp(&fe->accessTime, inode->i_atime); + udf_time_to_disk_stamp(&fe->modificationTime, inode->i_mtime); + udf_time_to_disk_stamp(&fe->attrTime, inode->i_ctime); + memset(&(fe->impIdent), 0, sizeof(struct regid)); + strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER); + fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; + fe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; + fe->uniqueID = cpu_to_le64(iinfo->i_unique); + fe->lengthExtendedAttr = cpu_to_le32(iinfo->i_lenEAttr); + fe->lengthAllocDescs = cpu_to_le32(iinfo->i_lenAlloc); + fe->checkpoint = cpu_to_le32(iinfo->i_checkpoint); + fe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_FE); + crclen = sizeof(struct fileEntry); + } else { + memcpy(bh->b_data + sizeof(struct extendedFileEntry), + iinfo->i_ext.i_data, + inode->i_sb->s_blocksize - + sizeof(struct extendedFileEntry)); + efe->objectSize = cpu_to_le64(inode->i_size); + efe->logicalBlocksRecorded = cpu_to_le64(lb_recorded); + + if (iinfo->i_crtime.tv_sec > inode->i_atime.tv_sec || + (iinfo->i_crtime.tv_sec == inode->i_atime.tv_sec && + iinfo->i_crtime.tv_nsec > inode->i_atime.tv_nsec)) + iinfo->i_crtime = inode->i_atime; + + if (iinfo->i_crtime.tv_sec > inode->i_mtime.tv_sec || + (iinfo->i_crtime.tv_sec == inode->i_mtime.tv_sec && + iinfo->i_crtime.tv_nsec > inode->i_mtime.tv_nsec)) + iinfo->i_crtime = inode->i_mtime; + + if (iinfo->i_crtime.tv_sec > inode->i_ctime.tv_sec || + (iinfo->i_crtime.tv_sec == inode->i_ctime.tv_sec && + iinfo->i_crtime.tv_nsec > inode->i_ctime.tv_nsec)) + iinfo->i_crtime = inode->i_ctime; + + udf_time_to_disk_stamp(&efe->accessTime, inode->i_atime); + udf_time_to_disk_stamp(&efe->modificationTime, inode->i_mtime); + udf_time_to_disk_stamp(&efe->createTime, iinfo->i_crtime); + udf_time_to_disk_stamp(&efe->attrTime, inode->i_ctime); + + memset(&(efe->impIdent), 0, sizeof(struct regid)); + strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER); + efe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; + efe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; + efe->uniqueID = cpu_to_le64(iinfo->i_unique); + efe->lengthExtendedAttr = cpu_to_le32(iinfo->i_lenEAttr); + efe->lengthAllocDescs = cpu_to_le32(iinfo->i_lenAlloc); + efe->checkpoint = cpu_to_le32(iinfo->i_checkpoint); + efe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EFE); + crclen = sizeof(struct extendedFileEntry); + } + +finish: + if (iinfo->i_strat4096) { + fe->icbTag.strategyType = cpu_to_le16(4096); + fe->icbTag.strategyParameter = cpu_to_le16(1); + fe->icbTag.numEntries = cpu_to_le16(2); + } else { + fe->icbTag.strategyType = cpu_to_le16(4); + fe->icbTag.numEntries = cpu_to_le16(1); + } + + if (iinfo->i_use) + fe->icbTag.fileType = ICBTAG_FILE_TYPE_USE; + else if (S_ISDIR(inode->i_mode)) + fe->icbTag.fileType = ICBTAG_FILE_TYPE_DIRECTORY; + else if (S_ISREG(inode->i_mode)) + fe->icbTag.fileType = ICBTAG_FILE_TYPE_REGULAR; + else if (S_ISLNK(inode->i_mode)) + fe->icbTag.fileType = ICBTAG_FILE_TYPE_SYMLINK; + else if (S_ISBLK(inode->i_mode)) + fe->icbTag.fileType = ICBTAG_FILE_TYPE_BLOCK; + else if (S_ISCHR(inode->i_mode)) + fe->icbTag.fileType = ICBTAG_FILE_TYPE_CHAR; + else if (S_ISFIFO(inode->i_mode)) + fe->icbTag.fileType = ICBTAG_FILE_TYPE_FIFO; + else if (S_ISSOCK(inode->i_mode)) + fe->icbTag.fileType = ICBTAG_FILE_TYPE_SOCKET; + + icbflags = iinfo->i_alloc_type | + ((inode->i_mode & S_ISUID) ? ICBTAG_FLAG_SETUID : 0) | + ((inode->i_mode & S_ISGID) ? ICBTAG_FLAG_SETGID : 0) | + ((inode->i_mode & S_ISVTX) ? ICBTAG_FLAG_STICKY : 0) | + (le16_to_cpu(fe->icbTag.flags) & + ~(ICBTAG_FLAG_AD_MASK | ICBTAG_FLAG_SETUID | + ICBTAG_FLAG_SETGID | ICBTAG_FLAG_STICKY)); + + fe->icbTag.flags = cpu_to_le16(icbflags); + if (sbi->s_udfrev >= 0x0200) + fe->descTag.descVersion = cpu_to_le16(3); + else + fe->descTag.descVersion = cpu_to_le16(2); + fe->descTag.tagSerialNum = cpu_to_le16(sbi->s_serial_number); + fe->descTag.tagLocation = cpu_to_le32( + iinfo->i_location.logicalBlockNum); + crclen += iinfo->i_lenEAttr + iinfo->i_lenAlloc - sizeof(struct tag); + fe->descTag.descCRCLength = cpu_to_le16(crclen); + fe->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)fe + sizeof(struct tag), + crclen)); + fe->descTag.tagChecksum = udf_tag_checksum(&fe->descTag); + + set_buffer_uptodate(bh); + unlock_buffer(bh); + + /* write the data blocks */ + mark_buffer_dirty(bh); + if (do_sync) { + sync_dirty_buffer(bh); + if (buffer_write_io_error(bh)) { + udf_warn(inode->i_sb, "IO error syncing udf inode [%08lx]\n", + inode->i_ino); + err = -EIO; + } + } + brelse(bh); + + return err; +} + +struct inode *__udf_iget(struct super_block *sb, struct kernel_lb_addr *ino, + bool hidden_inode) +{ + unsigned long block = udf_get_lb_pblock(sb, ino, 0); + struct inode *inode = iget_locked(sb, block); + int err; + + if (!inode) + return ERR_PTR(-ENOMEM); + + if (!(inode->i_state & I_NEW)) + return inode; + + memcpy(&UDF_I(inode)->i_location, ino, sizeof(struct kernel_lb_addr)); + err = udf_read_inode(inode, hidden_inode); + if (err < 0) { + iget_failed(inode); + return ERR_PTR(err); + } + unlock_new_inode(inode); + + return inode; +} + +int udf_setup_indirect_aext(struct inode *inode, int block, + struct extent_position *epos) +{ + struct super_block *sb = inode->i_sb; + struct buffer_head *bh; + struct allocExtDesc *aed; + struct extent_position nepos; + struct kernel_lb_addr neloc; + int ver, adsize; + + if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + adsize = sizeof(struct short_ad); + else if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_LONG) + adsize = sizeof(struct long_ad); + else + return -EIO; + + neloc.logicalBlockNum = block; + neloc.partitionReferenceNum = epos->block.partitionReferenceNum; + + bh = udf_tgetblk(sb, udf_get_lb_pblock(sb, &neloc, 0)); + if (!bh) + return -EIO; + lock_buffer(bh); + memset(bh->b_data, 0x00, sb->s_blocksize); + set_buffer_uptodate(bh); + unlock_buffer(bh); + mark_buffer_dirty_inode(bh, inode); + + aed = (struct allocExtDesc *)(bh->b_data); + if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT)) { + aed->previousAllocExtLocation = + cpu_to_le32(epos->block.logicalBlockNum); + } + aed->lengthAllocDescs = cpu_to_le32(0); + if (UDF_SB(sb)->s_udfrev >= 0x0200) + ver = 3; + else + ver = 2; + udf_new_tag(bh->b_data, TAG_IDENT_AED, ver, 1, block, + sizeof(struct tag)); + + nepos.block = neloc; + nepos.offset = sizeof(struct allocExtDesc); + nepos.bh = bh; + + /* + * Do we have to copy current last extent to make space for indirect + * one? + */ + if (epos->offset + adsize > sb->s_blocksize) { + struct kernel_lb_addr cp_loc; + uint32_t cp_len; + int cp_type; + + epos->offset -= adsize; + cp_type = udf_current_aext(inode, epos, &cp_loc, &cp_len, 0); + cp_len |= ((uint32_t)cp_type) << 30; + + __udf_add_aext(inode, &nepos, &cp_loc, cp_len, 1); + udf_write_aext(inode, epos, &nepos.block, + sb->s_blocksize | EXT_NEXT_EXTENT_ALLOCDECS, 0); + } else { + __udf_add_aext(inode, epos, &nepos.block, + sb->s_blocksize | EXT_NEXT_EXTENT_ALLOCDECS, 0); + } + + brelse(epos->bh); + *epos = nepos; + + return 0; +} + +/* + * Append extent at the given position - should be the first free one in inode + * / indirect extent. This function assumes there is enough space in the inode + * or indirect extent. Use udf_add_aext() if you didn't check for this before. + */ +int __udf_add_aext(struct inode *inode, struct extent_position *epos, + struct kernel_lb_addr *eloc, uint32_t elen, int inc) +{ + struct udf_inode_info *iinfo = UDF_I(inode); + struct allocExtDesc *aed; + int adsize; + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + adsize = sizeof(struct short_ad); + else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + adsize = sizeof(struct long_ad); + else + return -EIO; + + if (!epos->bh) { + WARN_ON(iinfo->i_lenAlloc != + epos->offset - udf_file_entry_alloc_offset(inode)); + } else { + aed = (struct allocExtDesc *)epos->bh->b_data; + WARN_ON(le32_to_cpu(aed->lengthAllocDescs) != + epos->offset - sizeof(struct allocExtDesc)); + WARN_ON(epos->offset + adsize > inode->i_sb->s_blocksize); + } + + udf_write_aext(inode, epos, eloc, elen, inc); + + if (!epos->bh) { + iinfo->i_lenAlloc += adsize; + mark_inode_dirty(inode); + } else { + aed = (struct allocExtDesc *)epos->bh->b_data; + le32_add_cpu(&aed->lengthAllocDescs, adsize); + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || + UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) + udf_update_tag(epos->bh->b_data, + epos->offset + (inc ? 0 : adsize)); + else + udf_update_tag(epos->bh->b_data, + sizeof(struct allocExtDesc)); + mark_buffer_dirty_inode(epos->bh, inode); + } + + return 0; +} + +/* + * Append extent at given position - should be the first free one in inode + * / indirect extent. Takes care of allocating and linking indirect blocks. + */ +int udf_add_aext(struct inode *inode, struct extent_position *epos, + struct kernel_lb_addr *eloc, uint32_t elen, int inc) +{ + int adsize; + struct super_block *sb = inode->i_sb; + + if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + adsize = sizeof(struct short_ad); + else if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_LONG) + adsize = sizeof(struct long_ad); + else + return -EIO; + + if (epos->offset + (2 * adsize) > sb->s_blocksize) { + int err; + int new_block; + + new_block = udf_new_block(sb, NULL, + epos->block.partitionReferenceNum, + epos->block.logicalBlockNum, &err); + if (!new_block) + return -ENOSPC; + + err = udf_setup_indirect_aext(inode, new_block, epos); + if (err) + return err; + } + + return __udf_add_aext(inode, epos, eloc, elen, inc); +} + +void udf_write_aext(struct inode *inode, struct extent_position *epos, + struct kernel_lb_addr *eloc, uint32_t elen, int inc) +{ + int adsize; + uint8_t *ptr; + struct short_ad *sad; + struct long_ad *lad; + struct udf_inode_info *iinfo = UDF_I(inode); + + if (!epos->bh) + ptr = iinfo->i_ext.i_data + epos->offset - + udf_file_entry_alloc_offset(inode) + + iinfo->i_lenEAttr; + else + ptr = epos->bh->b_data + epos->offset; + + switch (iinfo->i_alloc_type) { + case ICBTAG_FLAG_AD_SHORT: + sad = (struct short_ad *)ptr; + sad->extLength = cpu_to_le32(elen); + sad->extPosition = cpu_to_le32(eloc->logicalBlockNum); + adsize = sizeof(struct short_ad); + break; + case ICBTAG_FLAG_AD_LONG: + lad = (struct long_ad *)ptr; + lad->extLength = cpu_to_le32(elen); + lad->extLocation = cpu_to_lelb(*eloc); + memset(lad->impUse, 0x00, sizeof(lad->impUse)); + adsize = sizeof(struct long_ad); + break; + default: + return; + } + + if (epos->bh) { + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || + UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) { + struct allocExtDesc *aed = + (struct allocExtDesc *)epos->bh->b_data; + udf_update_tag(epos->bh->b_data, + le32_to_cpu(aed->lengthAllocDescs) + + sizeof(struct allocExtDesc)); + } + mark_buffer_dirty_inode(epos->bh, inode); + } else { + mark_inode_dirty(inode); + } + + if (inc) + epos->offset += adsize; +} + +/* + * Only 1 indirect extent in a row really makes sense but allow upto 16 in case + * someone does some weird stuff. + */ +#define UDF_MAX_INDIR_EXTS 16 + +int8_t udf_next_aext(struct inode *inode, struct extent_position *epos, + struct kernel_lb_addr *eloc, uint32_t *elen, int inc) +{ + int8_t etype; + unsigned int indirections = 0; + + while ((etype = udf_current_aext(inode, epos, eloc, elen, inc)) == + (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) { + int block; + + if (++indirections > UDF_MAX_INDIR_EXTS) { + udf_err(inode->i_sb, + "too many indirect extents in inode %lu\n", + inode->i_ino); + return -1; + } + + epos->block = *eloc; + epos->offset = sizeof(struct allocExtDesc); + brelse(epos->bh); + block = udf_get_lb_pblock(inode->i_sb, &epos->block, 0); + epos->bh = udf_tread(inode->i_sb, block); + if (!epos->bh) { + udf_debug("reading block %d failed!\n", block); + return -1; + } + } + + return etype; +} + +int8_t udf_current_aext(struct inode *inode, struct extent_position *epos, + struct kernel_lb_addr *eloc, uint32_t *elen, int inc) +{ + int alen; + int8_t etype; + uint8_t *ptr; + struct short_ad *sad; + struct long_ad *lad; + struct udf_inode_info *iinfo = UDF_I(inode); + + if (!epos->bh) { + if (!epos->offset) + epos->offset = udf_file_entry_alloc_offset(inode); + ptr = iinfo->i_ext.i_data + epos->offset - + udf_file_entry_alloc_offset(inode) + + iinfo->i_lenEAttr; + alen = udf_file_entry_alloc_offset(inode) + + iinfo->i_lenAlloc; + } else { + if (!epos->offset) + epos->offset = sizeof(struct allocExtDesc); + ptr = epos->bh->b_data + epos->offset; + alen = sizeof(struct allocExtDesc) + + le32_to_cpu(((struct allocExtDesc *)epos->bh->b_data)-> + lengthAllocDescs); + } + + switch (iinfo->i_alloc_type) { + case ICBTAG_FLAG_AD_SHORT: + sad = udf_get_fileshortad(ptr, alen, &epos->offset, inc); + if (!sad) + return -1; + etype = le32_to_cpu(sad->extLength) >> 30; + eloc->logicalBlockNum = le32_to_cpu(sad->extPosition); + eloc->partitionReferenceNum = + iinfo->i_location.partitionReferenceNum; + *elen = le32_to_cpu(sad->extLength) & UDF_EXTENT_LENGTH_MASK; + break; + case ICBTAG_FLAG_AD_LONG: + lad = udf_get_filelongad(ptr, alen, &epos->offset, inc); + if (!lad) + return -1; + etype = le32_to_cpu(lad->extLength) >> 30; + *eloc = lelb_to_cpu(lad->extLocation); + *elen = le32_to_cpu(lad->extLength) & UDF_EXTENT_LENGTH_MASK; + break; + default: + udf_debug("alloc_type = %d unsupported\n", iinfo->i_alloc_type); + return -1; + } + + return etype; +} + +static int8_t udf_insert_aext(struct inode *inode, struct extent_position epos, + struct kernel_lb_addr neloc, uint32_t nelen) +{ + struct kernel_lb_addr oeloc; + uint32_t oelen; + int8_t etype; + + if (epos.bh) + get_bh(epos.bh); + + while ((etype = udf_next_aext(inode, &epos, &oeloc, &oelen, 0)) != -1) { + udf_write_aext(inode, &epos, &neloc, nelen, 1); + neloc = oeloc; + nelen = (etype << 30) | oelen; + } + udf_add_aext(inode, &epos, &neloc, nelen, 1); + brelse(epos.bh); + + return (nelen >> 30); +} + +int8_t udf_delete_aext(struct inode *inode, struct extent_position epos, + struct kernel_lb_addr eloc, uint32_t elen) +{ + struct extent_position oepos; + int adsize; + int8_t etype; + struct allocExtDesc *aed; + struct udf_inode_info *iinfo; + + if (epos.bh) { + get_bh(epos.bh); + get_bh(epos.bh); + } + + iinfo = UDF_I(inode); + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + adsize = sizeof(struct short_ad); + else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + adsize = sizeof(struct long_ad); + else + adsize = 0; + + oepos = epos; + if (udf_next_aext(inode, &epos, &eloc, &elen, 1) == -1) + return -1; + + while ((etype = udf_next_aext(inode, &epos, &eloc, &elen, 1)) != -1) { + udf_write_aext(inode, &oepos, &eloc, (etype << 30) | elen, 1); + if (oepos.bh != epos.bh) { + oepos.block = epos.block; + brelse(oepos.bh); + get_bh(epos.bh); + oepos.bh = epos.bh; + oepos.offset = epos.offset - adsize; + } + } + memset(&eloc, 0x00, sizeof(struct kernel_lb_addr)); + elen = 0; + + if (epos.bh != oepos.bh) { + udf_free_blocks(inode->i_sb, inode, &epos.block, 0, 1); + udf_write_aext(inode, &oepos, &eloc, elen, 1); + udf_write_aext(inode, &oepos, &eloc, elen, 1); + if (!oepos.bh) { + iinfo->i_lenAlloc -= (adsize * 2); + mark_inode_dirty(inode); + } else { + aed = (struct allocExtDesc *)oepos.bh->b_data; + le32_add_cpu(&aed->lengthAllocDescs, -(2 * adsize)); + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || + UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) + udf_update_tag(oepos.bh->b_data, + oepos.offset - (2 * adsize)); + else + udf_update_tag(oepos.bh->b_data, + sizeof(struct allocExtDesc)); + mark_buffer_dirty_inode(oepos.bh, inode); + } + } else { + udf_write_aext(inode, &oepos, &eloc, elen, 1); + if (!oepos.bh) { + iinfo->i_lenAlloc -= adsize; + mark_inode_dirty(inode); + } else { + aed = (struct allocExtDesc *)oepos.bh->b_data; + le32_add_cpu(&aed->lengthAllocDescs, -adsize); + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || + UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) + udf_update_tag(oepos.bh->b_data, + epos.offset - adsize); + else + udf_update_tag(oepos.bh->b_data, + sizeof(struct allocExtDesc)); + mark_buffer_dirty_inode(oepos.bh, inode); + } + } + + brelse(epos.bh); + brelse(oepos.bh); + + return (elen >> 30); +} + +int8_t inode_bmap(struct inode *inode, sector_t block, + struct extent_position *pos, struct kernel_lb_addr *eloc, + uint32_t *elen, sector_t *offset) +{ + unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits; + loff_t lbcount = 0, bcount = + (loff_t) block << blocksize_bits; + int8_t etype; + struct udf_inode_info *iinfo; + + iinfo = UDF_I(inode); + if (!udf_read_extent_cache(inode, bcount, &lbcount, pos)) { + pos->offset = 0; + pos->block = iinfo->i_location; + pos->bh = NULL; + } + *elen = 0; + do { + etype = udf_next_aext(inode, pos, eloc, elen, 1); + if (etype == -1) { + *offset = (bcount - lbcount) >> blocksize_bits; + iinfo->i_lenExtents = lbcount; + return -1; + } + lbcount += *elen; + } while (lbcount <= bcount); + /* update extent cache */ + udf_update_extent_cache(inode, lbcount - *elen, pos, 1); + *offset = (bcount + *elen - lbcount) >> blocksize_bits; + + return etype; +} + +long udf_block_map(struct inode *inode, sector_t block) +{ + struct kernel_lb_addr eloc; + uint32_t elen; + sector_t offset; + struct extent_position epos = {}; + int ret; + + down_read(&UDF_I(inode)->i_data_sem); + + if (inode_bmap(inode, block, &epos, &eloc, &elen, &offset) == + (EXT_RECORDED_ALLOCATED >> 30)) + ret = udf_get_lb_pblock(inode->i_sb, &eloc, offset); + else + ret = 0; + + up_read(&UDF_I(inode)->i_data_sem); + brelse(epos.bh); + + if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_VARCONV)) + return udf_fixed_to_variable(ret); + else + return ret; +} diff --git a/vendor/linux/fs/udf/lowlevel.c b/vendor/linux/fs/udf/lowlevel.c new file mode 100644 index 0000000..6ad5a45 --- /dev/null +++ b/vendor/linux/fs/udf/lowlevel.c @@ -0,0 +1,67 @@ +/* + * lowlevel.c + * + * PURPOSE + * Low Level Device Routines for the UDF filesystem + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + * + * (C) 1999-2001 Ben Fennema + * + * HISTORY + * + * 03/26/99 blf Created. + */ + +#include "udfdecl.h" + +#include +#include +#include + +#include "udf_sb.h" + +unsigned int udf_get_last_session(struct super_block *sb) +{ + struct cdrom_multisession ms_info; + unsigned int vol_desc_start; + struct block_device *bdev = sb->s_bdev; + int i; + + vol_desc_start = 0; + ms_info.addr_format = CDROM_LBA; + i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long)&ms_info); + + if (i == 0) { + udf_debug("XA disk: %s, vol_desc_start=%d\n", + ms_info.xa_flag ? "yes" : "no", ms_info.addr.lba); + if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */ + vol_desc_start = ms_info.addr.lba; + } else { + udf_debug("CDROMMULTISESSION not supported: rc=%d\n", i); + } + return vol_desc_start; +} + +unsigned long udf_get_last_block(struct super_block *sb) +{ + struct block_device *bdev = sb->s_bdev; + unsigned long lblock = 0; + + /* + * ioctl failed or returned obviously bogus value? + * Try using the device size... + */ + if (ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock) || + lblock == 0) + lblock = bdev->bd_inode->i_size >> sb->s_blocksize_bits; + + if (lblock) + return lblock - 1; + else + return 0; +} diff --git a/vendor/linux/fs/udf/misc.c b/vendor/linux/fs/udf/misc.c new file mode 100644 index 0000000..71d1c25 --- /dev/null +++ b/vendor/linux/fs/udf/misc.c @@ -0,0 +1,298 @@ +/* + * misc.c + * + * PURPOSE + * Miscellaneous routines for the OSTA-UDF(tm) filesystem. + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + * + * (C) 1998 Dave Boynton + * (C) 1998-2004 Ben Fennema + * (C) 1999-2000 Stelias Computing Inc + * + * HISTORY + * + * 04/19/99 blf partial support for reading/writing specific EA's + */ + +#include "udfdecl.h" + +#include +#include +#include + +#include "udf_i.h" +#include "udf_sb.h" + +struct buffer_head *udf_tgetblk(struct super_block *sb, int block) +{ + if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV)) + return sb_getblk(sb, udf_fixed_to_variable(block)); + else + return sb_getblk(sb, block); +} + +struct buffer_head *udf_tread(struct super_block *sb, int block) +{ + if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV)) + return sb_bread(sb, udf_fixed_to_variable(block)); + else + return sb_bread(sb, block); +} + +struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size, + uint32_t type, uint8_t loc) +{ + uint8_t *ea = NULL, *ad = NULL; + int offset; + uint16_t crclen; + struct udf_inode_info *iinfo = UDF_I(inode); + + ea = iinfo->i_ext.i_data; + if (iinfo->i_lenEAttr) { + ad = iinfo->i_ext.i_data + iinfo->i_lenEAttr; + } else { + ad = ea; + size += sizeof(struct extendedAttrHeaderDesc); + } + + offset = inode->i_sb->s_blocksize - udf_file_entry_alloc_offset(inode) - + iinfo->i_lenAlloc; + + /* TODO - Check for FreeEASpace */ + + if (loc & 0x01 && offset >= size) { + struct extendedAttrHeaderDesc *eahd; + eahd = (struct extendedAttrHeaderDesc *)ea; + + if (iinfo->i_lenAlloc) + memmove(&ad[size], ad, iinfo->i_lenAlloc); + + if (iinfo->i_lenEAttr) { + /* check checksum/crc */ + if (eahd->descTag.tagIdent != + cpu_to_le16(TAG_IDENT_EAHD) || + le32_to_cpu(eahd->descTag.tagLocation) != + iinfo->i_location.logicalBlockNum) + return NULL; + } else { + struct udf_sb_info *sbi = UDF_SB(inode->i_sb); + + size -= sizeof(struct extendedAttrHeaderDesc); + iinfo->i_lenEAttr += + sizeof(struct extendedAttrHeaderDesc); + eahd->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EAHD); + if (sbi->s_udfrev >= 0x0200) + eahd->descTag.descVersion = cpu_to_le16(3); + else + eahd->descTag.descVersion = cpu_to_le16(2); + eahd->descTag.tagSerialNum = + cpu_to_le16(sbi->s_serial_number); + eahd->descTag.tagLocation = cpu_to_le32( + iinfo->i_location.logicalBlockNum); + eahd->impAttrLocation = cpu_to_le32(0xFFFFFFFF); + eahd->appAttrLocation = cpu_to_le32(0xFFFFFFFF); + } + + offset = iinfo->i_lenEAttr; + if (type < 2048) { + if (le32_to_cpu(eahd->appAttrLocation) < + iinfo->i_lenEAttr) { + uint32_t aal = + le32_to_cpu(eahd->appAttrLocation); + memmove(&ea[offset - aal + size], + &ea[aal], offset - aal); + offset -= aal; + eahd->appAttrLocation = + cpu_to_le32(aal + size); + } + if (le32_to_cpu(eahd->impAttrLocation) < + iinfo->i_lenEAttr) { + uint32_t ial = + le32_to_cpu(eahd->impAttrLocation); + memmove(&ea[offset - ial + size], + &ea[ial], offset - ial); + offset -= ial; + eahd->impAttrLocation = + cpu_to_le32(ial + size); + } + } else if (type < 65536) { + if (le32_to_cpu(eahd->appAttrLocation) < + iinfo->i_lenEAttr) { + uint32_t aal = + le32_to_cpu(eahd->appAttrLocation); + memmove(&ea[offset - aal + size], + &ea[aal], offset - aal); + offset -= aal; + eahd->appAttrLocation = + cpu_to_le32(aal + size); + } + } + /* rewrite CRC + checksum of eahd */ + crclen = sizeof(struct extendedAttrHeaderDesc) - sizeof(struct tag); + eahd->descTag.descCRCLength = cpu_to_le16(crclen); + eahd->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)eahd + + sizeof(struct tag), crclen)); + eahd->descTag.tagChecksum = udf_tag_checksum(&eahd->descTag); + iinfo->i_lenEAttr += size; + return (struct genericFormat *)&ea[offset]; + } + if (loc & 0x02) + ; + + return NULL; +} + +struct genericFormat *udf_get_extendedattr(struct inode *inode, uint32_t type, + uint8_t subtype) +{ + struct genericFormat *gaf; + uint8_t *ea = NULL; + uint32_t offset; + struct udf_inode_info *iinfo = UDF_I(inode); + + ea = iinfo->i_ext.i_data; + + if (iinfo->i_lenEAttr) { + struct extendedAttrHeaderDesc *eahd; + eahd = (struct extendedAttrHeaderDesc *)ea; + + /* check checksum/crc */ + if (eahd->descTag.tagIdent != + cpu_to_le16(TAG_IDENT_EAHD) || + le32_to_cpu(eahd->descTag.tagLocation) != + iinfo->i_location.logicalBlockNum) + return NULL; + + if (type < 2048) + offset = sizeof(struct extendedAttrHeaderDesc); + else if (type < 65536) + offset = le32_to_cpu(eahd->impAttrLocation); + else + offset = le32_to_cpu(eahd->appAttrLocation); + + while (offset < iinfo->i_lenEAttr) { + gaf = (struct genericFormat *)&ea[offset]; + if (le32_to_cpu(gaf->attrType) == type && + gaf->attrSubtype == subtype) + return gaf; + else + offset += le32_to_cpu(gaf->attrLength); + } + } + + return NULL; +} + +/* + * udf_read_tagged + * + * PURPOSE + * Read the first block of a tagged descriptor. + * + * HISTORY + * July 1, 1997 - Andrew E. Mileski + * Written, tested, and released. + */ +struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block, + uint32_t location, uint16_t *ident) +{ + struct tag *tag_p; + struct buffer_head *bh = NULL; + u8 checksum; + + /* Read the block */ + if (block == 0xFFFFFFFF) + return NULL; + + bh = udf_tread(sb, block); + if (!bh) { + udf_err(sb, "read failed, block=%u, location=%d\n", + block, location); + return NULL; + } + + tag_p = (struct tag *)(bh->b_data); + + *ident = le16_to_cpu(tag_p->tagIdent); + + if (location != le32_to_cpu(tag_p->tagLocation)) { + udf_debug("location mismatch block %u, tag %u != %u\n", + block, le32_to_cpu(tag_p->tagLocation), location); + goto error_out; + } + + /* Verify the tag checksum */ + checksum = udf_tag_checksum(tag_p); + if (checksum != tag_p->tagChecksum) { + udf_err(sb, "tag checksum failed, block %u: 0x%02x != 0x%02x\n", + block, checksum, tag_p->tagChecksum); + goto error_out; + } + + /* Verify the tag version */ + if (tag_p->descVersion != cpu_to_le16(0x0002U) && + tag_p->descVersion != cpu_to_le16(0x0003U)) { + udf_err(sb, "tag version 0x%04x != 0x0002 || 0x0003, block %u\n", + le16_to_cpu(tag_p->descVersion), block); + goto error_out; + } + + /* Verify the descriptor CRC */ + if (le16_to_cpu(tag_p->descCRCLength) + sizeof(struct tag) > sb->s_blocksize || + le16_to_cpu(tag_p->descCRC) == crc_itu_t(0, + bh->b_data + sizeof(struct tag), + le16_to_cpu(tag_p->descCRCLength))) + return bh; + + udf_debug("Crc failure block %d: crc = %d, crclen = %d\n", block, + le16_to_cpu(tag_p->descCRC), + le16_to_cpu(tag_p->descCRCLength)); +error_out: + brelse(bh); + return NULL; +} + +struct buffer_head *udf_read_ptagged(struct super_block *sb, + struct kernel_lb_addr *loc, + uint32_t offset, uint16_t *ident) +{ + return udf_read_tagged(sb, udf_get_lb_pblock(sb, loc, offset), + loc->logicalBlockNum + offset, ident); +} + +void udf_update_tag(char *data, int length) +{ + struct tag *tptr = (struct tag *)data; + length -= sizeof(struct tag); + + tptr->descCRCLength = cpu_to_le16(length); + tptr->descCRC = cpu_to_le16(crc_itu_t(0, data + sizeof(struct tag), length)); + tptr->tagChecksum = udf_tag_checksum(tptr); +} + +void udf_new_tag(char *data, uint16_t ident, uint16_t version, uint16_t snum, + uint32_t loc, int length) +{ + struct tag *tptr = (struct tag *)data; + tptr->tagIdent = cpu_to_le16(ident); + tptr->descVersion = cpu_to_le16(version); + tptr->tagSerialNum = cpu_to_le16(snum); + tptr->tagLocation = cpu_to_le32(loc); + udf_update_tag(data, length); +} + +u8 udf_tag_checksum(const struct tag *t) +{ + u8 *data = (u8 *)t; + u8 checksum = 0; + int i; + for (i = 0; i < sizeof(struct tag); ++i) + if (i != 4) /* position of checksum */ + checksum += data[i]; + return checksum; +} diff --git a/vendor/linux/fs/udf/namei.c b/vendor/linux/fs/udf/namei.c new file mode 100644 index 0000000..2d65e28 --- /dev/null +++ b/vendor/linux/fs/udf/namei.c @@ -0,0 +1,1362 @@ +/* + * namei.c + * + * PURPOSE + * Inode name handling routines for the OSTA-UDF(tm) filesystem. + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + * + * (C) 1998-2004 Ben Fennema + * (C) 1999-2000 Stelias Computing Inc + * + * HISTORY + * + * 12/12/98 blf Created. Split out the lookup code from dir.c + * 04/19/99 blf link, mknod, symlink support + */ + +#include "udfdecl.h" + +#include "udf_i.h" +#include "udf_sb.h" +#include +#include +#include +#include +#include +#include +#include + +static inline int udf_match(int len1, const unsigned char *name1, int len2, + const unsigned char *name2) +{ + if (len1 != len2) + return 0; + + return !memcmp(name1, name2, len1); +} + +int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi, + struct fileIdentDesc *sfi, struct udf_fileident_bh *fibh, + uint8_t *impuse, uint8_t *fileident) +{ + uint16_t crclen = fibh->eoffset - fibh->soffset - sizeof(struct tag); + uint16_t crc; + int offset; + uint16_t liu = le16_to_cpu(cfi->lengthOfImpUse); + uint8_t lfi = cfi->lengthFileIdent; + int padlen = fibh->eoffset - fibh->soffset - liu - lfi - + sizeof(struct fileIdentDesc); + int adinicb = 0; + + if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) + adinicb = 1; + + offset = fibh->soffset + sizeof(struct fileIdentDesc); + + if (impuse) { + if (adinicb || (offset + liu < 0)) { + memcpy((uint8_t *)sfi->impUse, impuse, liu); + } else if (offset >= 0) { + memcpy(fibh->ebh->b_data + offset, impuse, liu); + } else { + memcpy((uint8_t *)sfi->impUse, impuse, -offset); + memcpy(fibh->ebh->b_data, impuse - offset, + liu + offset); + } + } + + offset += liu; + + if (fileident) { + if (adinicb || (offset + lfi < 0)) { + memcpy((uint8_t *)sfi->fileIdent + liu, fileident, lfi); + } else if (offset >= 0) { + memcpy(fibh->ebh->b_data + offset, fileident, lfi); + } else { + memcpy((uint8_t *)sfi->fileIdent + liu, fileident, + -offset); + memcpy(fibh->ebh->b_data, fileident - offset, + lfi + offset); + } + } + + offset += lfi; + + if (adinicb || (offset + padlen < 0)) { + memset((uint8_t *)sfi->padding + liu + lfi, 0x00, padlen); + } else if (offset >= 0) { + memset(fibh->ebh->b_data + offset, 0x00, padlen); + } else { + memset((uint8_t *)sfi->padding + liu + lfi, 0x00, -offset); + memset(fibh->ebh->b_data, 0x00, padlen + offset); + } + + crc = crc_itu_t(0, (uint8_t *)cfi + sizeof(struct tag), + sizeof(struct fileIdentDesc) - sizeof(struct tag)); + + if (fibh->sbh == fibh->ebh) { + crc = crc_itu_t(crc, (uint8_t *)sfi->impUse, + crclen + sizeof(struct tag) - + sizeof(struct fileIdentDesc)); + } else if (sizeof(struct fileIdentDesc) >= -fibh->soffset) { + crc = crc_itu_t(crc, fibh->ebh->b_data + + sizeof(struct fileIdentDesc) + + fibh->soffset, + crclen + sizeof(struct tag) - + sizeof(struct fileIdentDesc)); + } else { + crc = crc_itu_t(crc, (uint8_t *)sfi->impUse, + -fibh->soffset - sizeof(struct fileIdentDesc)); + crc = crc_itu_t(crc, fibh->ebh->b_data, fibh->eoffset); + } + + cfi->descTag.descCRC = cpu_to_le16(crc); + cfi->descTag.descCRCLength = cpu_to_le16(crclen); + cfi->descTag.tagChecksum = udf_tag_checksum(&cfi->descTag); + + if (adinicb || (sizeof(struct fileIdentDesc) <= -fibh->soffset)) { + memcpy((uint8_t *)sfi, (uint8_t *)cfi, + sizeof(struct fileIdentDesc)); + } else { + memcpy((uint8_t *)sfi, (uint8_t *)cfi, -fibh->soffset); + memcpy(fibh->ebh->b_data, (uint8_t *)cfi - fibh->soffset, + sizeof(struct fileIdentDesc) + fibh->soffset); + } + + if (adinicb) { + mark_inode_dirty(inode); + } else { + if (fibh->sbh != fibh->ebh) + mark_buffer_dirty_inode(fibh->ebh, inode); + mark_buffer_dirty_inode(fibh->sbh, inode); + } + return 0; +} + +/** + * udf_find_entry - find entry in given directory. + * + * @dir: directory inode to search in + * @child: qstr of the name + * @fibh: buffer head / inode with file identifier descriptor we found + * @cfi: found file identifier descriptor with given name + * + * This function searches in the directory @dir for a file name @child. When + * found, @fibh points to the buffer head(s) (bh is NULL for in ICB + * directories) containing the file identifier descriptor (FID). In that case + * the function returns pointer to the FID in the buffer or inode - but note + * that FID may be split among two buffers (blocks) so accessing it via that + * pointer isn't easily possible. This pointer can be used only as an iterator + * for other directory manipulation functions. For inspection of the FID @cfi + * can be used - the found FID is copied there. + * + * Returns pointer to FID, NULL when nothing found, or error code. + */ +static struct fileIdentDesc *udf_find_entry(struct inode *dir, + const struct qstr *child, + struct udf_fileident_bh *fibh, + struct fileIdentDesc *cfi) +{ + struct fileIdentDesc *fi = NULL; + loff_t f_pos; + int block, flen; + unsigned char *fname = NULL, *copy_name = NULL; + unsigned char *nameptr; + uint8_t lfi; + uint16_t liu; + loff_t size; + struct kernel_lb_addr eloc; + uint32_t elen; + sector_t offset; + struct extent_position epos = {}; + struct udf_inode_info *dinfo = UDF_I(dir); + int isdotdot = child->len == 2 && + child->name[0] == '.' && child->name[1] == '.'; + struct super_block *sb = dir->i_sb; + + size = udf_ext0_offset(dir) + dir->i_size; + f_pos = udf_ext0_offset(dir); + + fibh->sbh = fibh->ebh = NULL; + fibh->soffset = fibh->eoffset = f_pos & (sb->s_blocksize - 1); + if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { + if (inode_bmap(dir, f_pos >> sb->s_blocksize_bits, &epos, + &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) { + fi = ERR_PTR(-EIO); + goto out_err; + } + + block = udf_get_lb_pblock(sb, &eloc, offset); + if ((++offset << sb->s_blocksize_bits) < elen) { + if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + epos.offset -= sizeof(struct short_ad); + else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + epos.offset -= sizeof(struct long_ad); + } else + offset = 0; + + fibh->sbh = fibh->ebh = udf_tread(sb, block); + if (!fibh->sbh) { + fi = ERR_PTR(-EIO); + goto out_err; + } + } + + fname = kmalloc(UDF_NAME_LEN, GFP_NOFS); + if (!fname) { + fi = ERR_PTR(-ENOMEM); + goto out_err; + } + + while (f_pos < size) { + fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc, + &elen, &offset); + if (!fi) { + fi = ERR_PTR(-EIO); + goto out_err; + } + + liu = le16_to_cpu(cfi->lengthOfImpUse); + lfi = cfi->lengthFileIdent; + + if (fibh->sbh == fibh->ebh) { + nameptr = fi->fileIdent + liu; + } else { + int poffset; /* Unpaded ending offset */ + + poffset = fibh->soffset + sizeof(struct fileIdentDesc) + + liu + lfi; + + if (poffset >= lfi) + nameptr = (uint8_t *)(fibh->ebh->b_data + + poffset - lfi); + else { + if (!copy_name) { + copy_name = kmalloc(UDF_NAME_LEN, + GFP_NOFS); + if (!copy_name) { + fi = ERR_PTR(-ENOMEM); + goto out_err; + } + } + nameptr = copy_name; + memcpy(nameptr, fi->fileIdent + liu, + lfi - poffset); + memcpy(nameptr + lfi - poffset, + fibh->ebh->b_data, poffset); + } + } + + if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { + if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE)) + continue; + } + + if ((cfi->fileCharacteristics & FID_FILE_CHAR_HIDDEN) != 0) { + if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE)) + continue; + } + + if ((cfi->fileCharacteristics & FID_FILE_CHAR_PARENT) && + isdotdot) + goto out_ok; + + if (!lfi) + continue; + + flen = udf_get_filename(sb, nameptr, lfi, fname, UDF_NAME_LEN); + if (flen < 0) { + fi = ERR_PTR(flen); + goto out_err; + } + + if (udf_match(flen, fname, child->len, child->name)) + goto out_ok; + } + + fi = NULL; +out_err: + if (fibh->sbh != fibh->ebh) + brelse(fibh->ebh); + brelse(fibh->sbh); +out_ok: + brelse(epos.bh); + kfree(fname); + kfree(copy_name); + + return fi; +} + +static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry, + unsigned int flags) +{ + struct inode *inode = NULL; + struct fileIdentDesc cfi; + struct udf_fileident_bh fibh; + struct fileIdentDesc *fi; + + if (dentry->d_name.len > UDF_NAME_LEN) + return ERR_PTR(-ENAMETOOLONG); + +#ifdef UDF_RECOVERY + /* temporary shorthand for specifying files by inode number */ + if (!strncmp(dentry->d_name.name, ".B=", 3)) { + struct kernel_lb_addr lb = { + .logicalBlockNum = 0, + .partitionReferenceNum = + simple_strtoul(dentry->d_name.name + 3, + NULL, 0), + }; + inode = udf_iget(dir->i_sb, lb); + if (IS_ERR(inode)) + return inode; + } else +#endif /* UDF_RECOVERY */ + + fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi); + if (IS_ERR(fi)) + return ERR_CAST(fi); + + if (fi) { + struct kernel_lb_addr loc; + + if (fibh.sbh != fibh.ebh) + brelse(fibh.ebh); + brelse(fibh.sbh); + + loc = lelb_to_cpu(cfi.icb.extLocation); + inode = udf_iget(dir->i_sb, &loc); + if (IS_ERR(inode)) + return ERR_CAST(inode); + } + + return d_splice_alias(inode, dentry); +} + +static struct fileIdentDesc *udf_add_entry(struct inode *dir, + struct dentry *dentry, + struct udf_fileident_bh *fibh, + struct fileIdentDesc *cfi, int *err) +{ + struct super_block *sb = dir->i_sb; + struct fileIdentDesc *fi = NULL; + unsigned char *name = NULL; + int namelen; + loff_t f_pos; + loff_t size = udf_ext0_offset(dir) + dir->i_size; + int nfidlen; + uint8_t lfi; + uint16_t liu; + int block; + struct kernel_lb_addr eloc; + uint32_t elen = 0; + sector_t offset; + struct extent_position epos = {}; + struct udf_inode_info *dinfo; + + fibh->sbh = fibh->ebh = NULL; + name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS); + if (!name) { + *err = -ENOMEM; + goto out_err; + } + + if (dentry) { + if (!dentry->d_name.len) { + *err = -EINVAL; + goto out_err; + } + namelen = udf_put_filename(sb, dentry->d_name.name, + dentry->d_name.len, + name, UDF_NAME_LEN_CS0); + if (!namelen) { + *err = -ENAMETOOLONG; + goto out_err; + } + } else { + namelen = 0; + } + + nfidlen = (sizeof(struct fileIdentDesc) + namelen + 3) & ~3; + + f_pos = udf_ext0_offset(dir); + + fibh->soffset = fibh->eoffset = f_pos & (dir->i_sb->s_blocksize - 1); + dinfo = UDF_I(dir); + if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { + if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos, + &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) { + block = udf_get_lb_pblock(dir->i_sb, + &dinfo->i_location, 0); + fibh->soffset = fibh->eoffset = sb->s_blocksize; + goto add; + } + block = udf_get_lb_pblock(dir->i_sb, &eloc, offset); + if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { + if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + epos.offset -= sizeof(struct short_ad); + else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + epos.offset -= sizeof(struct long_ad); + } else + offset = 0; + + fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block); + if (!fibh->sbh) { + *err = -EIO; + goto out_err; + } + + block = dinfo->i_location.logicalBlockNum; + } + + while (f_pos < size) { + fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc, + &elen, &offset); + + if (!fi) { + *err = -EIO; + goto out_err; + } + + liu = le16_to_cpu(cfi->lengthOfImpUse); + lfi = cfi->lengthFileIdent; + + if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { + if (((sizeof(struct fileIdentDesc) + + liu + lfi + 3) & ~3) == nfidlen) { + cfi->descTag.tagSerialNum = cpu_to_le16(1); + cfi->fileVersionNum = cpu_to_le16(1); + cfi->fileCharacteristics = 0; + cfi->lengthFileIdent = namelen; + cfi->lengthOfImpUse = cpu_to_le16(0); + if (!udf_write_fi(dir, cfi, fi, fibh, NULL, + name)) + goto out_ok; + else { + *err = -EIO; + goto out_err; + } + } + } + } + +add: + f_pos += nfidlen; + + if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB && + sb->s_blocksize - fibh->eoffset < nfidlen) { + brelse(epos.bh); + epos.bh = NULL; + fibh->soffset -= udf_ext0_offset(dir); + fibh->eoffset -= udf_ext0_offset(dir); + f_pos -= udf_ext0_offset(dir); + if (fibh->sbh != fibh->ebh) + brelse(fibh->ebh); + brelse(fibh->sbh); + fibh->sbh = fibh->ebh = + udf_expand_dir_adinicb(dir, &block, err); + if (!fibh->sbh) + goto out_err; + epos.block = dinfo->i_location; + epos.offset = udf_file_entry_alloc_offset(dir); + /* Load extent udf_expand_dir_adinicb() has created */ + udf_current_aext(dir, &epos, &eloc, &elen, 1); + } + + /* Entry fits into current block? */ + if (sb->s_blocksize - fibh->eoffset >= nfidlen) { + fibh->soffset = fibh->eoffset; + fibh->eoffset += nfidlen; + if (fibh->sbh != fibh->ebh) { + brelse(fibh->sbh); + fibh->sbh = fibh->ebh; + } + + if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { + block = dinfo->i_location.logicalBlockNum; + fi = (struct fileIdentDesc *) + (dinfo->i_ext.i_data + + fibh->soffset - + udf_ext0_offset(dir) + + dinfo->i_lenEAttr); + } else { + block = eloc.logicalBlockNum + + ((elen - 1) >> + dir->i_sb->s_blocksize_bits); + fi = (struct fileIdentDesc *) + (fibh->sbh->b_data + fibh->soffset); + } + } else { + /* Round up last extent in the file */ + elen = (elen + sb->s_blocksize - 1) & ~(sb->s_blocksize - 1); + if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + epos.offset -= sizeof(struct short_ad); + else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + epos.offset -= sizeof(struct long_ad); + udf_write_aext(dir, &epos, &eloc, elen, 1); + dinfo->i_lenExtents = (dinfo->i_lenExtents + sb->s_blocksize + - 1) & ~(sb->s_blocksize - 1); + + fibh->soffset = fibh->eoffset - sb->s_blocksize; + fibh->eoffset += nfidlen - sb->s_blocksize; + if (fibh->sbh != fibh->ebh) { + brelse(fibh->sbh); + fibh->sbh = fibh->ebh; + } + + block = eloc.logicalBlockNum + ((elen - 1) >> + dir->i_sb->s_blocksize_bits); + fibh->ebh = udf_bread(dir, + f_pos >> dir->i_sb->s_blocksize_bits, 1, err); + if (!fibh->ebh) + goto out_err; + /* Extents could have been merged, invalidate our position */ + brelse(epos.bh); + epos.bh = NULL; + epos.block = dinfo->i_location; + epos.offset = udf_file_entry_alloc_offset(dir); + + if (!fibh->soffset) { + /* Find the freshly allocated block */ + while (udf_next_aext(dir, &epos, &eloc, &elen, 1) == + (EXT_RECORDED_ALLOCATED >> 30)) + ; + block = eloc.logicalBlockNum + ((elen - 1) >> + dir->i_sb->s_blocksize_bits); + brelse(fibh->sbh); + fibh->sbh = fibh->ebh; + fi = (struct fileIdentDesc *)(fibh->sbh->b_data); + } else { + fi = (struct fileIdentDesc *) + (fibh->sbh->b_data + sb->s_blocksize + + fibh->soffset); + } + } + + memset(cfi, 0, sizeof(struct fileIdentDesc)); + if (UDF_SB(sb)->s_udfrev >= 0x0200) + udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block, + sizeof(struct tag)); + else + udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block, + sizeof(struct tag)); + cfi->fileVersionNum = cpu_to_le16(1); + cfi->lengthFileIdent = namelen; + cfi->lengthOfImpUse = cpu_to_le16(0); + if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) { + dir->i_size += nfidlen; + if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) + dinfo->i_lenAlloc += nfidlen; + else { + /* Find the last extent and truncate it to proper size */ + while (udf_next_aext(dir, &epos, &eloc, &elen, 1) == + (EXT_RECORDED_ALLOCATED >> 30)) + ; + elen -= dinfo->i_lenExtents - dir->i_size; + if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + epos.offset -= sizeof(struct short_ad); + else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + epos.offset -= sizeof(struct long_ad); + udf_write_aext(dir, &epos, &eloc, elen, 1); + dinfo->i_lenExtents = dir->i_size; + } + + mark_inode_dirty(dir); + goto out_ok; + } else { + *err = -EIO; + goto out_err; + } + +out_err: + fi = NULL; + if (fibh->sbh != fibh->ebh) + brelse(fibh->ebh); + brelse(fibh->sbh); +out_ok: + brelse(epos.bh); + kfree(name); + return fi; +} + +static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi, + struct udf_fileident_bh *fibh, + struct fileIdentDesc *cfi) +{ + cfi->fileCharacteristics |= FID_FILE_CHAR_DELETED; + + if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT)) + memset(&(cfi->icb), 0x00, sizeof(struct long_ad)); + + return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL); +} + +static int udf_add_nondir(struct dentry *dentry, struct inode *inode) +{ + struct udf_inode_info *iinfo = UDF_I(inode); + struct inode *dir = d_inode(dentry->d_parent); + struct udf_fileident_bh fibh; + struct fileIdentDesc cfi, *fi; + int err; + + fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); + if (unlikely(!fi)) { + inode_dec_link_count(inode); + unlock_new_inode(inode); + iput(inode); + return err; + } + cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); + cfi.icb.extLocation = cpu_to_lelb(iinfo->i_location); + *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = + cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL); + udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); + dir->i_ctime = dir->i_mtime = current_time(dir); + mark_inode_dirty(dir); + if (fibh.sbh != fibh.ebh) + brelse(fibh.ebh); + brelse(fibh.sbh); + unlock_new_inode(inode); + d_instantiate(dentry, inode); + + return 0; +} + +static int udf_create(struct inode *dir, struct dentry *dentry, umode_t mode, + bool excl) +{ + struct inode *inode = udf_new_inode(dir, mode); + + if (IS_ERR(inode)) + return PTR_ERR(inode); + + if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) + inode->i_data.a_ops = &udf_adinicb_aops; + else + inode->i_data.a_ops = &udf_aops; + inode->i_op = &udf_file_inode_operations; + inode->i_fop = &udf_file_operations; + mark_inode_dirty(inode); + + return udf_add_nondir(dentry, inode); +} + +static int udf_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) +{ + struct inode *inode = udf_new_inode(dir, mode); + + if (IS_ERR(inode)) + return PTR_ERR(inode); + + if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) + inode->i_data.a_ops = &udf_adinicb_aops; + else + inode->i_data.a_ops = &udf_aops; + inode->i_op = &udf_file_inode_operations; + inode->i_fop = &udf_file_operations; + mark_inode_dirty(inode); + d_tmpfile(dentry, inode); + unlock_new_inode(inode); + return 0; +} + +static int udf_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, + dev_t rdev) +{ + struct inode *inode; + + if (!old_valid_dev(rdev)) + return -EINVAL; + + inode = udf_new_inode(dir, mode); + if (IS_ERR(inode)) + return PTR_ERR(inode); + + init_special_inode(inode, mode, rdev); + return udf_add_nondir(dentry, inode); +} + +static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) +{ + struct inode *inode; + struct udf_fileident_bh fibh; + struct fileIdentDesc cfi, *fi; + int err; + struct udf_inode_info *dinfo = UDF_I(dir); + struct udf_inode_info *iinfo; + + inode = udf_new_inode(dir, S_IFDIR | mode); + if (IS_ERR(inode)) + return PTR_ERR(inode); + + iinfo = UDF_I(inode); + inode->i_op = &udf_dir_inode_operations; + inode->i_fop = &udf_dir_operations; + fi = udf_add_entry(inode, NULL, &fibh, &cfi, &err); + if (!fi) { + inode_dec_link_count(inode); + unlock_new_inode(inode); + iput(inode); + goto out; + } + set_nlink(inode, 2); + cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); + cfi.icb.extLocation = cpu_to_lelb(dinfo->i_location); + *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = + cpu_to_le32(dinfo->i_unique & 0x00000000FFFFFFFFUL); + cfi.fileCharacteristics = + FID_FILE_CHAR_DIRECTORY | FID_FILE_CHAR_PARENT; + udf_write_fi(inode, &cfi, fi, &fibh, NULL, NULL); + brelse(fibh.sbh); + mark_inode_dirty(inode); + + fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); + if (!fi) { + clear_nlink(inode); + mark_inode_dirty(inode); + unlock_new_inode(inode); + iput(inode); + goto out; + } + cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); + cfi.icb.extLocation = cpu_to_lelb(iinfo->i_location); + *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = + cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL); + cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY; + udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); + inc_nlink(dir); + dir->i_ctime = dir->i_mtime = current_time(dir); + mark_inode_dirty(dir); + unlock_new_inode(inode); + d_instantiate(dentry, inode); + if (fibh.sbh != fibh.ebh) + brelse(fibh.ebh); + brelse(fibh.sbh); + err = 0; + +out: + return err; +} + +static int empty_dir(struct inode *dir) +{ + struct fileIdentDesc *fi, cfi; + struct udf_fileident_bh fibh; + loff_t f_pos; + loff_t size = udf_ext0_offset(dir) + dir->i_size; + int block; + struct kernel_lb_addr eloc; + uint32_t elen; + sector_t offset; + struct extent_position epos = {}; + struct udf_inode_info *dinfo = UDF_I(dir); + + f_pos = udf_ext0_offset(dir); + fibh.soffset = fibh.eoffset = f_pos & (dir->i_sb->s_blocksize - 1); + + if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) + fibh.sbh = fibh.ebh = NULL; + else if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, + &epos, &eloc, &elen, &offset) == + (EXT_RECORDED_ALLOCATED >> 30)) { + block = udf_get_lb_pblock(dir->i_sb, &eloc, offset); + if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { + if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + epos.offset -= sizeof(struct short_ad); + else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + epos.offset -= sizeof(struct long_ad); + } else + offset = 0; + + fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block); + if (!fibh.sbh) { + brelse(epos.bh); + return 0; + } + } else { + brelse(epos.bh); + return 0; + } + + while (f_pos < size) { + fi = udf_fileident_read(dir, &f_pos, &fibh, &cfi, &epos, &eloc, + &elen, &offset); + if (!fi) { + if (fibh.sbh != fibh.ebh) + brelse(fibh.ebh); + brelse(fibh.sbh); + brelse(epos.bh); + return 0; + } + + if (cfi.lengthFileIdent && + (cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) == 0) { + if (fibh.sbh != fibh.ebh) + brelse(fibh.ebh); + brelse(fibh.sbh); + brelse(epos.bh); + return 0; + } + } + + if (fibh.sbh != fibh.ebh) + brelse(fibh.ebh); + brelse(fibh.sbh); + brelse(epos.bh); + + return 1; +} + +static int udf_rmdir(struct inode *dir, struct dentry *dentry) +{ + int retval; + struct inode *inode = d_inode(dentry); + struct udf_fileident_bh fibh; + struct fileIdentDesc *fi, cfi; + struct kernel_lb_addr tloc; + + retval = -ENOENT; + fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi); + if (IS_ERR_OR_NULL(fi)) { + if (fi) + retval = PTR_ERR(fi); + goto out; + } + + retval = -EIO; + tloc = lelb_to_cpu(cfi.icb.extLocation); + if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino) + goto end_rmdir; + retval = -ENOTEMPTY; + if (!empty_dir(inode)) + goto end_rmdir; + retval = udf_delete_entry(dir, fi, &fibh, &cfi); + if (retval) + goto end_rmdir; + if (inode->i_nlink != 2) + udf_warn(inode->i_sb, "empty directory has nlink != 2 (%d)\n", + inode->i_nlink); + clear_nlink(inode); + inode->i_size = 0; + inode_dec_link_count(dir); + inode->i_ctime = dir->i_ctime = dir->i_mtime = + current_time(inode); + mark_inode_dirty(dir); + +end_rmdir: + if (fibh.sbh != fibh.ebh) + brelse(fibh.ebh); + brelse(fibh.sbh); + +out: + return retval; +} + +static int udf_unlink(struct inode *dir, struct dentry *dentry) +{ + int retval; + struct inode *inode = d_inode(dentry); + struct udf_fileident_bh fibh; + struct fileIdentDesc *fi; + struct fileIdentDesc cfi; + struct kernel_lb_addr tloc; + + retval = -ENOENT; + fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi); + + if (IS_ERR_OR_NULL(fi)) { + if (fi) + retval = PTR_ERR(fi); + goto out; + } + + retval = -EIO; + tloc = lelb_to_cpu(cfi.icb.extLocation); + if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino) + goto end_unlink; + + if (!inode->i_nlink) { + udf_debug("Deleting nonexistent file (%lu), %d\n", + inode->i_ino, inode->i_nlink); + set_nlink(inode, 1); + } + retval = udf_delete_entry(dir, fi, &fibh, &cfi); + if (retval) + goto end_unlink; + dir->i_ctime = dir->i_mtime = current_time(dir); + mark_inode_dirty(dir); + inode_dec_link_count(inode); + inode->i_ctime = dir->i_ctime; + retval = 0; + +end_unlink: + if (fibh.sbh != fibh.ebh) + brelse(fibh.ebh); + brelse(fibh.sbh); + +out: + return retval; +} + +static int udf_symlink(struct inode *dir, struct dentry *dentry, + const char *symname) +{ + struct inode *inode = udf_new_inode(dir, S_IFLNK | S_IRWXUGO); + struct pathComponent *pc; + const char *compstart; + struct extent_position epos = {}; + int eoffset, elen = 0; + uint8_t *ea; + int err; + int block; + unsigned char *name = NULL; + int namelen; + struct udf_inode_info *iinfo; + struct super_block *sb = dir->i_sb; + + if (IS_ERR(inode)) + return PTR_ERR(inode); + + iinfo = UDF_I(inode); + down_write(&iinfo->i_data_sem); + name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS); + if (!name) { + err = -ENOMEM; + goto out_no_entry; + } + + inode->i_data.a_ops = &udf_symlink_aops; + inode->i_op = &page_symlink_inode_operations; + inode_nohighmem(inode); + + if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { + struct kernel_lb_addr eloc; + uint32_t bsize; + + block = udf_new_block(sb, inode, + iinfo->i_location.partitionReferenceNum, + iinfo->i_location.logicalBlockNum, &err); + if (!block) + goto out_no_entry; + epos.block = iinfo->i_location; + epos.offset = udf_file_entry_alloc_offset(inode); + epos.bh = NULL; + eloc.logicalBlockNum = block; + eloc.partitionReferenceNum = + iinfo->i_location.partitionReferenceNum; + bsize = sb->s_blocksize; + iinfo->i_lenExtents = bsize; + udf_add_aext(inode, &epos, &eloc, bsize, 0); + brelse(epos.bh); + + block = udf_get_pblock(sb, block, + iinfo->i_location.partitionReferenceNum, + 0); + epos.bh = udf_tgetblk(sb, block); + lock_buffer(epos.bh); + memset(epos.bh->b_data, 0x00, bsize); + set_buffer_uptodate(epos.bh); + unlock_buffer(epos.bh); + mark_buffer_dirty_inode(epos.bh, inode); + ea = epos.bh->b_data + udf_ext0_offset(inode); + } else + ea = iinfo->i_ext.i_data + iinfo->i_lenEAttr; + + eoffset = sb->s_blocksize - udf_ext0_offset(inode); + pc = (struct pathComponent *)ea; + + if (*symname == '/') { + do { + symname++; + } while (*symname == '/'); + + pc->componentType = 1; + pc->lengthComponentIdent = 0; + pc->componentFileVersionNum = 0; + elen += sizeof(struct pathComponent); + } + + err = -ENAMETOOLONG; + + while (*symname) { + if (elen + sizeof(struct pathComponent) > eoffset) + goto out_no_entry; + + pc = (struct pathComponent *)(ea + elen); + + compstart = symname; + + do { + symname++; + } while (*symname && *symname != '/'); + + pc->componentType = 5; + pc->lengthComponentIdent = 0; + pc->componentFileVersionNum = 0; + if (compstart[0] == '.') { + if ((symname - compstart) == 1) + pc->componentType = 4; + else if ((symname - compstart) == 2 && + compstart[1] == '.') + pc->componentType = 3; + } + + if (pc->componentType == 5) { + namelen = udf_put_filename(sb, compstart, + symname - compstart, + name, UDF_NAME_LEN_CS0); + if (!namelen) + goto out_no_entry; + + if (elen + sizeof(struct pathComponent) + namelen > + eoffset) + goto out_no_entry; + else + pc->lengthComponentIdent = namelen; + + memcpy(pc->componentIdent, name, namelen); + } + + elen += sizeof(struct pathComponent) + pc->lengthComponentIdent; + + if (*symname) { + do { + symname++; + } while (*symname == '/'); + } + } + + brelse(epos.bh); + inode->i_size = elen; + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) + iinfo->i_lenAlloc = inode->i_size; + else + udf_truncate_tail_extent(inode); + mark_inode_dirty(inode); + up_write(&iinfo->i_data_sem); + + err = udf_add_nondir(dentry, inode); +out: + kfree(name); + return err; + +out_no_entry: + up_write(&iinfo->i_data_sem); + inode_dec_link_count(inode); + unlock_new_inode(inode); + iput(inode); + goto out; +} + +static int udf_link(struct dentry *old_dentry, struct inode *dir, + struct dentry *dentry) +{ + struct inode *inode = d_inode(old_dentry); + struct udf_fileident_bh fibh; + struct fileIdentDesc cfi, *fi; + int err; + + fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); + if (!fi) { + return err; + } + cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); + cfi.icb.extLocation = cpu_to_lelb(UDF_I(inode)->i_location); + if (UDF_SB(inode->i_sb)->s_lvid_bh) { + *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = + cpu_to_le32(lvid_get_unique_id(inode->i_sb)); + } + udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); + if (UDF_I(dir)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) + mark_inode_dirty(dir); + + if (fibh.sbh != fibh.ebh) + brelse(fibh.ebh); + brelse(fibh.sbh); + inc_nlink(inode); + inode->i_ctime = current_time(inode); + mark_inode_dirty(inode); + dir->i_ctime = dir->i_mtime = current_time(dir); + mark_inode_dirty(dir); + ihold(inode); + d_instantiate(dentry, inode); + + return 0; +} + +/* Anybody can rename anything with this: the permission checks are left to the + * higher-level routines. + */ +static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, + struct inode *new_dir, struct dentry *new_dentry, + unsigned int flags) +{ + struct inode *old_inode = d_inode(old_dentry); + struct inode *new_inode = d_inode(new_dentry); + struct udf_fileident_bh ofibh, nfibh; + struct fileIdentDesc *ofi = NULL, *nfi = NULL, *dir_fi = NULL; + struct fileIdentDesc ocfi, ncfi; + struct buffer_head *dir_bh = NULL; + int retval = -ENOENT; + struct kernel_lb_addr tloc; + struct udf_inode_info *old_iinfo = UDF_I(old_inode); + + if (flags & ~RENAME_NOREPLACE) + return -EINVAL; + + ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi); + if (IS_ERR(ofi)) { + retval = PTR_ERR(ofi); + goto end_rename; + } + + if (ofibh.sbh != ofibh.ebh) + brelse(ofibh.ebh); + + brelse(ofibh.sbh); + tloc = lelb_to_cpu(ocfi.icb.extLocation); + if (!ofi || udf_get_lb_pblock(old_dir->i_sb, &tloc, 0) + != old_inode->i_ino) + goto end_rename; + + nfi = udf_find_entry(new_dir, &new_dentry->d_name, &nfibh, &ncfi); + if (IS_ERR(nfi)) { + retval = PTR_ERR(nfi); + goto end_rename; + } + if (nfi && !new_inode) { + if (nfibh.sbh != nfibh.ebh) + brelse(nfibh.ebh); + brelse(nfibh.sbh); + nfi = NULL; + } + if (S_ISDIR(old_inode->i_mode)) { + int offset = udf_ext0_offset(old_inode); + + if (new_inode) { + retval = -ENOTEMPTY; + if (!empty_dir(new_inode)) + goto end_rename; + } + retval = -EIO; + if (old_iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { + dir_fi = udf_get_fileident( + old_iinfo->i_ext.i_data - + (old_iinfo->i_efe ? + sizeof(struct extendedFileEntry) : + sizeof(struct fileEntry)), + old_inode->i_sb->s_blocksize, &offset); + } else { + dir_bh = udf_bread(old_inode, 0, 0, &retval); + if (!dir_bh) + goto end_rename; + dir_fi = udf_get_fileident(dir_bh->b_data, + old_inode->i_sb->s_blocksize, &offset); + } + if (!dir_fi) + goto end_rename; + tloc = lelb_to_cpu(dir_fi->icb.extLocation); + if (udf_get_lb_pblock(old_inode->i_sb, &tloc, 0) != + old_dir->i_ino) + goto end_rename; + } + if (!nfi) { + nfi = udf_add_entry(new_dir, new_dentry, &nfibh, &ncfi, + &retval); + if (!nfi) + goto end_rename; + } + + /* + * Like most other Unix systems, set the ctime for inodes on a + * rename. + */ + old_inode->i_ctime = current_time(old_inode); + mark_inode_dirty(old_inode); + + /* + * ok, that's it + */ + ncfi.fileVersionNum = ocfi.fileVersionNum; + ncfi.fileCharacteristics = ocfi.fileCharacteristics; + memcpy(&(ncfi.icb), &(ocfi.icb), sizeof(struct long_ad)); + udf_write_fi(new_dir, &ncfi, nfi, &nfibh, NULL, NULL); + + /* The old fid may have moved - find it again */ + ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi); + udf_delete_entry(old_dir, ofi, &ofibh, &ocfi); + + if (new_inode) { + new_inode->i_ctime = current_time(new_inode); + inode_dec_link_count(new_inode); + } + old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir); + new_dir->i_ctime = new_dir->i_mtime = current_time(new_dir); + mark_inode_dirty(old_dir); + mark_inode_dirty(new_dir); + + if (dir_fi) { + dir_fi->icb.extLocation = cpu_to_lelb(UDF_I(new_dir)->i_location); + udf_update_tag((char *)dir_fi, + (sizeof(struct fileIdentDesc) + + le16_to_cpu(dir_fi->lengthOfImpUse) + 3) & ~3); + if (old_iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) + mark_inode_dirty(old_inode); + else + mark_buffer_dirty_inode(dir_bh, old_inode); + + inode_dec_link_count(old_dir); + if (new_inode) + inode_dec_link_count(new_inode); + else { + inc_nlink(new_dir); + mark_inode_dirty(new_dir); + } + } + + if (ofi) { + if (ofibh.sbh != ofibh.ebh) + brelse(ofibh.ebh); + brelse(ofibh.sbh); + } + + retval = 0; + +end_rename: + brelse(dir_bh); + if (nfi) { + if (nfibh.sbh != nfibh.ebh) + brelse(nfibh.ebh); + brelse(nfibh.sbh); + } + + return retval; +} + +static struct dentry *udf_get_parent(struct dentry *child) +{ + struct kernel_lb_addr tloc; + struct inode *inode = NULL; + struct qstr dotdot = QSTR_INIT("..", 2); + struct fileIdentDesc cfi; + struct udf_fileident_bh fibh; + + if (!udf_find_entry(d_inode(child), &dotdot, &fibh, &cfi)) + return ERR_PTR(-EACCES); + + if (fibh.sbh != fibh.ebh) + brelse(fibh.ebh); + brelse(fibh.sbh); + + tloc = lelb_to_cpu(cfi.icb.extLocation); + inode = udf_iget(child->d_sb, &tloc); + if (IS_ERR(inode)) + return ERR_CAST(inode); + + return d_obtain_alias(inode); +} + + +static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block, + u16 partref, __u32 generation) +{ + struct inode *inode; + struct kernel_lb_addr loc; + + if (block == 0) + return ERR_PTR(-ESTALE); + + loc.logicalBlockNum = block; + loc.partitionReferenceNum = partref; + inode = udf_iget(sb, &loc); + + if (IS_ERR(inode)) + return ERR_CAST(inode); + + if (generation && inode->i_generation != generation) { + iput(inode); + return ERR_PTR(-ESTALE); + } + return d_obtain_alias(inode); +} + +static struct dentry *udf_fh_to_dentry(struct super_block *sb, + struct fid *fid, int fh_len, int fh_type) +{ + if (fh_len < 3 || + (fh_type != FILEID_UDF_WITH_PARENT && + fh_type != FILEID_UDF_WITHOUT_PARENT)) + return NULL; + + return udf_nfs_get_inode(sb, fid->udf.block, fid->udf.partref, + fid->udf.generation); +} + +static struct dentry *udf_fh_to_parent(struct super_block *sb, + struct fid *fid, int fh_len, int fh_type) +{ + if (fh_len < 5 || fh_type != FILEID_UDF_WITH_PARENT) + return NULL; + + return udf_nfs_get_inode(sb, fid->udf.parent_block, + fid->udf.parent_partref, + fid->udf.parent_generation); +} +static int udf_encode_fh(struct inode *inode, __u32 *fh, int *lenp, + struct inode *parent) +{ + int len = *lenp; + struct kernel_lb_addr location = UDF_I(inode)->i_location; + struct fid *fid = (struct fid *)fh; + int type = FILEID_UDF_WITHOUT_PARENT; + + if (parent && (len < 5)) { + *lenp = 5; + return FILEID_INVALID; + } else if (len < 3) { + *lenp = 3; + return FILEID_INVALID; + } + + *lenp = 3; + fid->udf.block = location.logicalBlockNum; + fid->udf.partref = location.partitionReferenceNum; + fid->udf.parent_partref = 0; + fid->udf.generation = inode->i_generation; + + if (parent) { + location = UDF_I(parent)->i_location; + fid->udf.parent_block = location.logicalBlockNum; + fid->udf.parent_partref = location.partitionReferenceNum; + fid->udf.parent_generation = inode->i_generation; + *lenp = 5; + type = FILEID_UDF_WITH_PARENT; + } + + return type; +} + +const struct export_operations udf_export_ops = { + .encode_fh = udf_encode_fh, + .fh_to_dentry = udf_fh_to_dentry, + .fh_to_parent = udf_fh_to_parent, + .get_parent = udf_get_parent, +}; + +const struct inode_operations udf_dir_inode_operations = { + .lookup = udf_lookup, + .create = udf_create, + .link = udf_link, + .unlink = udf_unlink, + .symlink = udf_symlink, + .mkdir = udf_mkdir, + .rmdir = udf_rmdir, + .mknod = udf_mknod, + .rename = udf_rename, + .tmpfile = udf_tmpfile, +}; diff --git a/vendor/linux/fs/udf/osta_udf.h b/vendor/linux/fs/udf/osta_udf.h new file mode 100644 index 0000000..fbff746 --- /dev/null +++ b/vendor/linux/fs/udf/osta_udf.h @@ -0,0 +1,279 @@ +/* + * osta_udf.h + * + * This file is based on OSTA UDF(tm) 2.50 (April 30, 2003) + * http://www.osta.org + * + * Copyright (c) 2001-2004 Ben Fennema + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU Public License ("GPL"). + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "ecma_167.h" + +#ifndef _OSTA_UDF_H +#define _OSTA_UDF_H 1 + +/* OSTA CS0 Charspec (UDF 2.50 2.1.2) */ +#define UDF_CHAR_SET_TYPE 0 +#define UDF_CHAR_SET_INFO "OSTA Compressed Unicode" + +/* Entity Identifier (UDF 2.50 2.1.5) */ +/* Identifiers (UDF 2.50 2.1.5.2) */ +#define UDF_ID_DEVELOPER "*Linux UDFFS" +#define UDF_ID_COMPLIANT "*OSTA UDF Compliant" +#define UDF_ID_LV_INFO "*UDF LV Info" +#define UDF_ID_FREE_EA "*UDF FreeEASpace" +#define UDF_ID_FREE_APP_EA "*UDF FreeAppEASpace" +#define UDF_ID_DVD_CGMS "*UDF DVD CGMS Info" +#define UDF_ID_OS2_EA "*UDF OS/2 EA" +#define UDF_ID_OS2_EA_LENGTH "*UDF OS/2 EALength" +#define UDF_ID_MAC_VOLUME "*UDF Mac VolumeInfo" +#define UDF_ID_MAC_FINDER "*UDF Mac FinderInfo" +#define UDF_ID_MAC_UNIQUE "*UDF Mac UniqueIDTable" +#define UDF_ID_MAC_RESOURCE "*UDF Mac ResourceFork" +#define UDF_ID_VIRTUAL "*UDF Virtual Partition" +#define UDF_ID_SPARABLE "*UDF Sparable Partition" +#define UDF_ID_ALLOC "*UDF Virtual Alloc Tbl" +#define UDF_ID_SPARING "*UDF Sparing Table" +#define UDF_ID_METADATA "*UDF Metadata Partition" + +/* Identifier Suffix (UDF 2.50 2.1.5.3) */ +#define IS_DF_HARD_WRITE_PROTECT 0x01 +#define IS_DF_SOFT_WRITE_PROTECT 0x02 + +struct UDFIdentSuffix { + __le16 UDFRevision; + uint8_t OSClass; + uint8_t OSIdentifier; + uint8_t reserved[4]; +} __attribute__ ((packed)); + +struct impIdentSuffix { + uint8_t OSClass; + uint8_t OSIdentifier; + uint8_t reserved[6]; +} __attribute__ ((packed)); + +struct appIdentSuffix { + uint8_t impUse[8]; +} __attribute__ ((packed)); + +/* Logical Volume Integrity Descriptor (UDF 2.50 2.2.6) */ +/* Implementation Use (UDF 2.50 2.2.6.4) */ +struct logicalVolIntegrityDescImpUse { + struct regid impIdent; + __le32 numFiles; + __le32 numDirs; + __le16 minUDFReadRev; + __le16 minUDFWriteRev; + __le16 maxUDFWriteRev; + uint8_t impUse[0]; +} __attribute__ ((packed)); + +/* Implementation Use Volume Descriptor (UDF 2.50 2.2.7) */ +/* Implementation Use (UDF 2.50 2.2.7.2) */ +struct impUseVolDescImpUse { + struct charspec LVICharset; + dstring logicalVolIdent[128]; + dstring LVInfo1[36]; + dstring LVInfo2[36]; + dstring LVInfo3[36]; + struct regid impIdent; + uint8_t impUse[128]; +} __attribute__ ((packed)); + +struct udfPartitionMap2 { + uint8_t partitionMapType; + uint8_t partitionMapLength; + uint8_t reserved1[2]; + struct regid partIdent; + __le16 volSeqNum; + __le16 partitionNum; +} __attribute__ ((packed)); + +/* Virtual Partition Map (UDF 2.50 2.2.8) */ +struct virtualPartitionMap { + uint8_t partitionMapType; + uint8_t partitionMapLength; + uint8_t reserved1[2]; + struct regid partIdent; + __le16 volSeqNum; + __le16 partitionNum; + uint8_t reserved2[24]; +} __attribute__ ((packed)); + +/* Sparable Partition Map (UDF 2.50 2.2.9) */ +struct sparablePartitionMap { + uint8_t partitionMapType; + uint8_t partitionMapLength; + uint8_t reserved1[2]; + struct regid partIdent; + __le16 volSeqNum; + __le16 partitionNum; + __le16 packetLength; + uint8_t numSparingTables; + uint8_t reserved2[1]; + __le32 sizeSparingTable; + __le32 locSparingTable[4]; +} __attribute__ ((packed)); + +/* Metadata Partition Map (UDF 2.4.0 2.2.10) */ +struct metadataPartitionMap { + uint8_t partitionMapType; + uint8_t partitionMapLength; + uint8_t reserved1[2]; + struct regid partIdent; + __le16 volSeqNum; + __le16 partitionNum; + __le32 metadataFileLoc; + __le32 metadataMirrorFileLoc; + __le32 metadataBitmapFileLoc; + __le32 allocUnitSize; + __le16 alignUnitSize; + uint8_t flags; + uint8_t reserved2[5]; +} __attribute__ ((packed)); + +/* Virtual Allocation Table (UDF 1.5 2.2.10) */ +struct virtualAllocationTable15 { + __le32 VirtualSector[0]; + struct regid vatIdent; + __le32 previousVATICBLoc; +} __attribute__ ((packed)); + +#define ICBTAG_FILE_TYPE_VAT15 0x00U + +/* Virtual Allocation Table (UDF 2.50 2.2.11) */ +struct virtualAllocationTable20 { + __le16 lengthHeader; + __le16 lengthImpUse; + dstring logicalVolIdent[128]; + __le32 previousVATICBLoc; + __le32 numFiles; + __le32 numDirs; + __le16 minReadRevision; + __le16 minWriteRevision; + __le16 maxWriteRevision; + __le16 reserved; + uint8_t impUse[0]; + __le32 vatEntry[0]; +} __attribute__ ((packed)); + +#define ICBTAG_FILE_TYPE_VAT20 0xF8U + +/* Sparing Table (UDF 2.50 2.2.12) */ +struct sparingEntry { + __le32 origLocation; + __le32 mappedLocation; +} __attribute__ ((packed)); + +struct sparingTable { + struct tag descTag; + struct regid sparingIdent; + __le16 reallocationTableLen; + __le16 reserved; + __le32 sequenceNum; + struct sparingEntry + mapEntry[0]; +} __attribute__ ((packed)); + +/* Metadata File (and Metadata Mirror File) (UDF 2.50 2.2.13.1) */ +#define ICBTAG_FILE_TYPE_MAIN 0xFA +#define ICBTAG_FILE_TYPE_MIRROR 0xFB +#define ICBTAG_FILE_TYPE_BITMAP 0xFC + +/* struct struct long_ad ICB - ADImpUse (UDF 2.50 2.2.4.3) */ +struct allocDescImpUse { + __le16 flags; + uint8_t impUse[4]; +} __attribute__ ((packed)); + +#define AD_IU_EXT_ERASED 0x0001 + +/* Real-Time Files (UDF 2.50 6.11) */ +#define ICBTAG_FILE_TYPE_REALTIME 0xF9U + +/* Implementation Use Extended Attribute (UDF 2.50 3.3.4.5) */ +/* FreeEASpace (UDF 2.50 3.3.4.5.1.1) */ +struct freeEaSpace { + __le16 headerChecksum; + uint8_t freeEASpace[0]; +} __attribute__ ((packed)); + +/* DVD Copyright Management Information (UDF 2.50 3.3.4.5.1.2) */ +struct DVDCopyrightImpUse { + __le16 headerChecksum; + uint8_t CGMSInfo; + uint8_t dataType; + uint8_t protectionSystemInfo[4]; +} __attribute__ ((packed)); + +/* Application Use Extended Attribute (UDF 2.50 3.3.4.6) */ +/* FreeAppEASpace (UDF 2.50 3.3.4.6.1) */ +struct freeAppEASpace { + __le16 headerChecksum; + uint8_t freeEASpace[0]; +} __attribute__ ((packed)); + +/* UDF Defined System Stream (UDF 2.50 3.3.7) */ +#define UDF_ID_UNIQUE_ID "*UDF Unique ID Mapping Data" +#define UDF_ID_NON_ALLOC "*UDF Non-Allocatable Space" +#define UDF_ID_POWER_CAL "*UDF Power Cal Table" +#define UDF_ID_BACKUP "*UDF Backup" + +/* Operating System Identifiers (UDF 2.50 6.3) */ +#define UDF_OS_CLASS_UNDEF 0x00U +#define UDF_OS_CLASS_DOS 0x01U +#define UDF_OS_CLASS_OS2 0x02U +#define UDF_OS_CLASS_MAC 0x03U +#define UDF_OS_CLASS_UNIX 0x04U +#define UDF_OS_CLASS_WIN9X 0x05U +#define UDF_OS_CLASS_WINNT 0x06U +#define UDF_OS_CLASS_OS400 0x07U +#define UDF_OS_CLASS_BEOS 0x08U +#define UDF_OS_CLASS_WINCE 0x09U + +#define UDF_OS_ID_UNDEF 0x00U +#define UDF_OS_ID_DOS 0x00U +#define UDF_OS_ID_OS2 0x00U +#define UDF_OS_ID_MAC 0x00U +#define UDF_OS_ID_MAX_OSX 0x01U +#define UDF_OS_ID_UNIX 0x00U +#define UDF_OS_ID_AIX 0x01U +#define UDF_OS_ID_SOLARIS 0x02U +#define UDF_OS_ID_HPUX 0x03U +#define UDF_OS_ID_IRIX 0x04U +#define UDF_OS_ID_LINUX 0x05U +#define UDF_OS_ID_MKLINUX 0x06U +#define UDF_OS_ID_FREEBSD 0x07U +#define UDF_OS_ID_WIN9X 0x00U +#define UDF_OS_ID_WINNT 0x00U +#define UDF_OS_ID_OS400 0x00U +#define UDF_OS_ID_BEOS 0x00U +#define UDF_OS_ID_WINCE 0x00U + +#endif /* _OSTA_UDF_H */ diff --git a/vendor/linux/fs/udf/partition.c b/vendor/linux/fs/udf/partition.c new file mode 100644 index 0000000..888c364 --- /dev/null +++ b/vendor/linux/fs/udf/partition.c @@ -0,0 +1,343 @@ +/* + * partition.c + * + * PURPOSE + * Partition handling routines for the OSTA-UDF(tm) filesystem. + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + * + * (C) 1998-2001 Ben Fennema + * + * HISTORY + * + * 12/06/98 blf Created file. + * + */ + +#include "udfdecl.h" +#include "udf_sb.h" +#include "udf_i.h" + +#include +#include +#include + +uint32_t udf_get_pblock(struct super_block *sb, uint32_t block, + uint16_t partition, uint32_t offset) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + struct udf_part_map *map; + if (partition >= sbi->s_partitions) { + udf_debug("block=%d, partition=%d, offset=%d: invalid partition\n", + block, partition, offset); + return 0xFFFFFFFF; + } + map = &sbi->s_partmaps[partition]; + if (map->s_partition_func) + return map->s_partition_func(sb, block, partition, offset); + else + return map->s_partition_root + block + offset; +} + +uint32_t udf_get_pblock_virt15(struct super_block *sb, uint32_t block, + uint16_t partition, uint32_t offset) +{ + struct buffer_head *bh = NULL; + uint32_t newblock; + uint32_t index; + uint32_t loc; + struct udf_sb_info *sbi = UDF_SB(sb); + struct udf_part_map *map; + struct udf_virtual_data *vdata; + struct udf_inode_info *iinfo = UDF_I(sbi->s_vat_inode); + + map = &sbi->s_partmaps[partition]; + vdata = &map->s_type_specific.s_virtual; + + if (block > vdata->s_num_entries) { + udf_debug("Trying to access block beyond end of VAT (%d max %d)\n", + block, vdata->s_num_entries); + return 0xFFFFFFFF; + } + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { + loc = le32_to_cpu(((__le32 *)(iinfo->i_ext.i_data + + vdata->s_start_offset))[block]); + goto translate; + } + index = (sb->s_blocksize - vdata->s_start_offset) / sizeof(uint32_t); + if (block >= index) { + block -= index; + newblock = 1 + (block / (sb->s_blocksize / sizeof(uint32_t))); + index = block % (sb->s_blocksize / sizeof(uint32_t)); + } else { + newblock = 0; + index = vdata->s_start_offset / sizeof(uint32_t) + block; + } + + loc = udf_block_map(sbi->s_vat_inode, newblock); + + bh = sb_bread(sb, loc); + if (!bh) { + udf_debug("get_pblock(UDF_VIRTUAL_MAP:%p,%d,%d) VAT: %d[%d]\n", + sb, block, partition, loc, index); + return 0xFFFFFFFF; + } + + loc = le32_to_cpu(((__le32 *)bh->b_data)[index]); + + brelse(bh); + +translate: + if (iinfo->i_location.partitionReferenceNum == partition) { + udf_debug("recursive call to udf_get_pblock!\n"); + return 0xFFFFFFFF; + } + + return udf_get_pblock(sb, loc, + iinfo->i_location.partitionReferenceNum, + offset); +} + +inline uint32_t udf_get_pblock_virt20(struct super_block *sb, uint32_t block, + uint16_t partition, uint32_t offset) +{ + return udf_get_pblock_virt15(sb, block, partition, offset); +} + +uint32_t udf_get_pblock_spar15(struct super_block *sb, uint32_t block, + uint16_t partition, uint32_t offset) +{ + int i; + struct sparingTable *st = NULL; + struct udf_sb_info *sbi = UDF_SB(sb); + struct udf_part_map *map; + uint32_t packet; + struct udf_sparing_data *sdata; + + map = &sbi->s_partmaps[partition]; + sdata = &map->s_type_specific.s_sparing; + packet = (block + offset) & ~(sdata->s_packet_len - 1); + + for (i = 0; i < 4; i++) { + if (sdata->s_spar_map[i] != NULL) { + st = (struct sparingTable *) + sdata->s_spar_map[i]->b_data; + break; + } + } + + if (st) { + for (i = 0; i < le16_to_cpu(st->reallocationTableLen); i++) { + struct sparingEntry *entry = &st->mapEntry[i]; + u32 origLoc = le32_to_cpu(entry->origLocation); + if (origLoc >= 0xFFFFFFF0) + break; + else if (origLoc == packet) + return le32_to_cpu(entry->mappedLocation) + + ((block + offset) & + (sdata->s_packet_len - 1)); + else if (origLoc > packet) + break; + } + } + + return map->s_partition_root + block + offset; +} + +int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block) +{ + struct udf_sparing_data *sdata; + struct sparingTable *st = NULL; + struct sparingEntry mapEntry; + uint32_t packet; + int i, j, k, l; + struct udf_sb_info *sbi = UDF_SB(sb); + u16 reallocationTableLen; + struct buffer_head *bh; + int ret = 0; + + mutex_lock(&sbi->s_alloc_mutex); + for (i = 0; i < sbi->s_partitions; i++) { + struct udf_part_map *map = &sbi->s_partmaps[i]; + if (old_block > map->s_partition_root && + old_block < map->s_partition_root + map->s_partition_len) { + sdata = &map->s_type_specific.s_sparing; + packet = (old_block - map->s_partition_root) & + ~(sdata->s_packet_len - 1); + + for (j = 0; j < 4; j++) + if (sdata->s_spar_map[j] != NULL) { + st = (struct sparingTable *) + sdata->s_spar_map[j]->b_data; + break; + } + + if (!st) { + ret = 1; + goto out; + } + + reallocationTableLen = + le16_to_cpu(st->reallocationTableLen); + for (k = 0; k < reallocationTableLen; k++) { + struct sparingEntry *entry = &st->mapEntry[k]; + u32 origLoc = le32_to_cpu(entry->origLocation); + + if (origLoc == 0xFFFFFFFF) { + for (; j < 4; j++) { + int len; + bh = sdata->s_spar_map[j]; + if (!bh) + continue; + + st = (struct sparingTable *) + bh->b_data; + entry->origLocation = + cpu_to_le32(packet); + len = + sizeof(struct sparingTable) + + reallocationTableLen * + sizeof(struct sparingEntry); + udf_update_tag((char *)st, len); + mark_buffer_dirty(bh); + } + *new_block = le32_to_cpu( + entry->mappedLocation) + + ((old_block - + map->s_partition_root) & + (sdata->s_packet_len - 1)); + ret = 0; + goto out; + } else if (origLoc == packet) { + *new_block = le32_to_cpu( + entry->mappedLocation) + + ((old_block - + map->s_partition_root) & + (sdata->s_packet_len - 1)); + ret = 0; + goto out; + } else if (origLoc > packet) + break; + } + + for (l = k; l < reallocationTableLen; l++) { + struct sparingEntry *entry = &st->mapEntry[l]; + u32 origLoc = le32_to_cpu(entry->origLocation); + + if (origLoc != 0xFFFFFFFF) + continue; + + for (; j < 4; j++) { + bh = sdata->s_spar_map[j]; + if (!bh) + continue; + + st = (struct sparingTable *)bh->b_data; + mapEntry = st->mapEntry[l]; + mapEntry.origLocation = + cpu_to_le32(packet); + memmove(&st->mapEntry[k + 1], + &st->mapEntry[k], + (l - k) * + sizeof(struct sparingEntry)); + st->mapEntry[k] = mapEntry; + udf_update_tag((char *)st, + sizeof(struct sparingTable) + + reallocationTableLen * + sizeof(struct sparingEntry)); + mark_buffer_dirty(bh); + } + *new_block = + le32_to_cpu( + st->mapEntry[k].mappedLocation) + + ((old_block - map->s_partition_root) & + (sdata->s_packet_len - 1)); + ret = 0; + goto out; + } + + ret = 1; + goto out; + } /* if old_block */ + } + + if (i == sbi->s_partitions) { + /* outside of partitions */ + /* for now, fail =) */ + ret = 1; + } + +out: + mutex_unlock(&sbi->s_alloc_mutex); + return ret; +} + +static uint32_t udf_try_read_meta(struct inode *inode, uint32_t block, + uint16_t partition, uint32_t offset) +{ + struct super_block *sb = inode->i_sb; + struct udf_part_map *map; + struct kernel_lb_addr eloc; + uint32_t elen; + sector_t ext_offset; + struct extent_position epos = {}; + uint32_t phyblock; + + if (inode_bmap(inode, block, &epos, &eloc, &elen, &ext_offset) != + (EXT_RECORDED_ALLOCATED >> 30)) + phyblock = 0xFFFFFFFF; + else { + map = &UDF_SB(sb)->s_partmaps[partition]; + /* map to sparable/physical partition desc */ + phyblock = udf_get_pblock(sb, eloc.logicalBlockNum, + map->s_type_specific.s_metadata.s_phys_partition_ref, + ext_offset + offset); + } + + brelse(epos.bh); + return phyblock; +} + +uint32_t udf_get_pblock_meta25(struct super_block *sb, uint32_t block, + uint16_t partition, uint32_t offset) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + struct udf_part_map *map; + struct udf_meta_data *mdata; + uint32_t retblk; + struct inode *inode; + + udf_debug("READING from METADATA\n"); + + map = &sbi->s_partmaps[partition]; + mdata = &map->s_type_specific.s_metadata; + inode = mdata->s_metadata_fe ? : mdata->s_mirror_fe; + + if (!inode) + return 0xFFFFFFFF; + + retblk = udf_try_read_meta(inode, block, partition, offset); + if (retblk == 0xFFFFFFFF && mdata->s_metadata_fe) { + udf_warn(sb, "error reading from METADATA, trying to read from MIRROR\n"); + if (!(mdata->s_flags & MF_MIRROR_FE_LOADED)) { + mdata->s_mirror_fe = udf_find_metadata_inode_efe(sb, + mdata->s_mirror_file_loc, + mdata->s_phys_partition_ref); + if (IS_ERR(mdata->s_mirror_fe)) + mdata->s_mirror_fe = NULL; + mdata->s_flags |= MF_MIRROR_FE_LOADED; + } + + inode = mdata->s_mirror_fe; + if (!inode) + return 0xFFFFFFFF; + retblk = udf_try_read_meta(inode, block, partition, offset); + } + + return retblk; +} diff --git a/vendor/linux/fs/udf/super.c b/vendor/linux/fs/udf/super.c new file mode 100644 index 0000000..4942549 --- /dev/null +++ b/vendor/linux/fs/udf/super.c @@ -0,0 +1,2499 @@ +/* + * super.c + * + * PURPOSE + * Super block routines for the OSTA-UDF(tm) filesystem. + * + * DESCRIPTION + * OSTA-UDF(tm) = Optical Storage Technology Association + * Universal Disk Format. + * + * This code is based on version 2.00 of the UDF specification, + * and revision 3 of the ECMA 167 standard [equivalent to ISO 13346]. + * http://www.osta.org/ + * http://www.ecma.ch/ + * http://www.iso.org/ + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + * + * (C) 1998 Dave Boynton + * (C) 1998-2004 Ben Fennema + * (C) 2000 Stelias Computing Inc + * + * HISTORY + * + * 09/24/98 dgb changed to allow compiling outside of kernel, and + * added some debugging. + * 10/01/98 dgb updated to allow (some) possibility of compiling w/2.0.34 + * 10/16/98 attempting some multi-session support + * 10/17/98 added freespace count for "df" + * 11/11/98 gr added novrs option + * 11/26/98 dgb added fileset,anchor mount options + * 12/06/98 blf really hosed things royally. vat/sparing support. sequenced + * vol descs. rewrote option handling based on isofs + * 12/20/98 find the free space bitmap (if it exists) + */ + +#include "udfdecl.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "udf_sb.h" +#include "udf_i.h" + +#include +#include + +#define VDS_POS_PRIMARY_VOL_DESC 0 +#define VDS_POS_UNALLOC_SPACE_DESC 1 +#define VDS_POS_LOGICAL_VOL_DESC 2 +#define VDS_POS_PARTITION_DESC 3 +#define VDS_POS_IMP_USE_VOL_DESC 4 +#define VDS_POS_VOL_DESC_PTR 5 +#define VDS_POS_TERMINATING_DESC 6 +#define VDS_POS_LENGTH 7 + +#define UDF_DEFAULT_BLOCKSIZE 2048 + +#define VSD_FIRST_SECTOR_OFFSET 32768 +#define VSD_MAX_SECTOR_OFFSET 0x800000 + +/* + * Maximum number of Terminating Descriptor / Logical Volume Integrity + * Descriptor redirections. The chosen numbers are arbitrary - just that we + * hopefully don't limit any real use of rewritten inode on write-once media + * but avoid looping for too long on corrupted media. + */ +#define UDF_MAX_TD_NESTING 64 +#define UDF_MAX_LVID_NESTING 1000 + +enum { UDF_MAX_LINKS = 0xffff }; + +/* These are the "meat" - everything else is stuffing */ +static int udf_fill_super(struct super_block *, void *, int); +static void udf_put_super(struct super_block *); +static int udf_sync_fs(struct super_block *, int); +static int udf_remount_fs(struct super_block *, int *, char *); +static void udf_load_logicalvolint(struct super_block *, struct kernel_extent_ad); +static int udf_find_fileset(struct super_block *, struct kernel_lb_addr *, + struct kernel_lb_addr *); +static void udf_load_fileset(struct super_block *, struct buffer_head *, + struct kernel_lb_addr *); +static void udf_open_lvid(struct super_block *); +static void udf_close_lvid(struct super_block *); +static unsigned int udf_count_free(struct super_block *); +static int udf_statfs(struct dentry *, struct kstatfs *); +static int udf_show_options(struct seq_file *, struct dentry *); + +struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct super_block *sb) +{ + struct logicalVolIntegrityDesc *lvid; + unsigned int partnum; + unsigned int offset; + + if (!UDF_SB(sb)->s_lvid_bh) + return NULL; + lvid = (struct logicalVolIntegrityDesc *)UDF_SB(sb)->s_lvid_bh->b_data; + partnum = le32_to_cpu(lvid->numOfPartitions); + if ((sb->s_blocksize - sizeof(struct logicalVolIntegrityDescImpUse) - + offsetof(struct logicalVolIntegrityDesc, impUse)) / + (2 * sizeof(uint32_t)) < partnum) { + udf_err(sb, "Logical volume integrity descriptor corrupted " + "(numOfPartitions = %u)!\n", partnum); + return NULL; + } + /* The offset is to skip freeSpaceTable and sizeTable arrays */ + offset = partnum * 2 * sizeof(uint32_t); + return (struct logicalVolIntegrityDescImpUse *)&(lvid->impUse[offset]); +} + +/* UDF filesystem type */ +static struct dentry *udf_mount(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data) +{ + return mount_bdev(fs_type, flags, dev_name, data, udf_fill_super); +} + +static struct file_system_type udf_fstype = { + .owner = THIS_MODULE, + .name = "udf", + .mount = udf_mount, + .kill_sb = kill_block_super, + .fs_flags = FS_REQUIRES_DEV, +}; +MODULE_ALIAS_FS("udf"); + +static struct kmem_cache *udf_inode_cachep; + +static struct inode *udf_alloc_inode(struct super_block *sb) +{ + struct udf_inode_info *ei; + ei = kmem_cache_alloc(udf_inode_cachep, GFP_KERNEL); + if (!ei) + return NULL; + + ei->i_unique = 0; + ei->i_lenExtents = 0; + ei->i_next_alloc_block = 0; + ei->i_next_alloc_goal = 0; + ei->i_strat4096 = 0; + init_rwsem(&ei->i_data_sem); + ei->cached_extent.lstart = -1; + spin_lock_init(&ei->i_extent_cache_lock); + + return &ei->vfs_inode; +} + +static void udf_i_callback(struct rcu_head *head) +{ + struct inode *inode = container_of(head, struct inode, i_rcu); + kmem_cache_free(udf_inode_cachep, UDF_I(inode)); +} + +static void udf_destroy_inode(struct inode *inode) +{ + call_rcu(&inode->i_rcu, udf_i_callback); +} + +static void init_once(void *foo) +{ + struct udf_inode_info *ei = (struct udf_inode_info *)foo; + + ei->i_ext.i_data = NULL; + inode_init_once(&ei->vfs_inode); +} + +static int __init init_inodecache(void) +{ + udf_inode_cachep = kmem_cache_create("udf_inode_cache", + sizeof(struct udf_inode_info), + 0, (SLAB_RECLAIM_ACCOUNT | + SLAB_MEM_SPREAD | + SLAB_ACCOUNT), + init_once); + if (!udf_inode_cachep) + return -ENOMEM; + return 0; +} + +static void destroy_inodecache(void) +{ + /* + * Make sure all delayed rcu free inodes are flushed before we + * destroy cache. + */ + rcu_barrier(); + kmem_cache_destroy(udf_inode_cachep); +} + +/* Superblock operations */ +static const struct super_operations udf_sb_ops = { + .alloc_inode = udf_alloc_inode, + .destroy_inode = udf_destroy_inode, + .write_inode = udf_write_inode, + .evict_inode = udf_evict_inode, + .put_super = udf_put_super, + .sync_fs = udf_sync_fs, + .statfs = udf_statfs, + .remount_fs = udf_remount_fs, + .show_options = udf_show_options, +}; + +struct udf_options { + unsigned char novrs; + unsigned int blocksize; + unsigned int session; + unsigned int lastblock; + unsigned int anchor; + unsigned int volume; + unsigned short partition; + unsigned int fileset; + unsigned int rootdir; + unsigned int flags; + umode_t umask; + kgid_t gid; + kuid_t uid; + umode_t fmode; + umode_t dmode; + struct nls_table *nls_map; +}; + +static int __init init_udf_fs(void) +{ + int err; + + err = init_inodecache(); + if (err) + goto out1; + err = register_filesystem(&udf_fstype); + if (err) + goto out; + + return 0; + +out: + destroy_inodecache(); + +out1: + return err; +} + +static void __exit exit_udf_fs(void) +{ + unregister_filesystem(&udf_fstype); + destroy_inodecache(); +} + +module_init(init_udf_fs) +module_exit(exit_udf_fs) + +static int udf_sb_alloc_partition_maps(struct super_block *sb, u32 count) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + + sbi->s_partmaps = kcalloc(count, sizeof(struct udf_part_map), + GFP_KERNEL); + if (!sbi->s_partmaps) { + udf_err(sb, "Unable to allocate space for %d partition maps\n", + count); + sbi->s_partitions = 0; + return -ENOMEM; + } + + sbi->s_partitions = count; + return 0; +} + +static void udf_sb_free_bitmap(struct udf_bitmap *bitmap) +{ + int i; + int nr_groups = bitmap->s_nr_groups; + + for (i = 0; i < nr_groups; i++) + if (bitmap->s_block_bitmap[i]) + brelse(bitmap->s_block_bitmap[i]); + + kvfree(bitmap); +} + +static void udf_free_partition(struct udf_part_map *map) +{ + int i; + struct udf_meta_data *mdata; + + if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) + iput(map->s_uspace.s_table); + if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) + iput(map->s_fspace.s_table); + if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) + udf_sb_free_bitmap(map->s_uspace.s_bitmap); + if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) + udf_sb_free_bitmap(map->s_fspace.s_bitmap); + if (map->s_partition_type == UDF_SPARABLE_MAP15) + for (i = 0; i < 4; i++) + brelse(map->s_type_specific.s_sparing.s_spar_map[i]); + else if (map->s_partition_type == UDF_METADATA_MAP25) { + mdata = &map->s_type_specific.s_metadata; + iput(mdata->s_metadata_fe); + mdata->s_metadata_fe = NULL; + + iput(mdata->s_mirror_fe); + mdata->s_mirror_fe = NULL; + + iput(mdata->s_bitmap_fe); + mdata->s_bitmap_fe = NULL; + } +} + +static void udf_sb_free_partitions(struct super_block *sb) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + int i; + if (sbi->s_partmaps == NULL) + return; + for (i = 0; i < sbi->s_partitions; i++) + udf_free_partition(&sbi->s_partmaps[i]); + kfree(sbi->s_partmaps); + sbi->s_partmaps = NULL; +} + +static int udf_show_options(struct seq_file *seq, struct dentry *root) +{ + struct super_block *sb = root->d_sb; + struct udf_sb_info *sbi = UDF_SB(sb); + + if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT)) + seq_puts(seq, ",nostrict"); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_BLOCKSIZE_SET)) + seq_printf(seq, ",bs=%lu", sb->s_blocksize); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE)) + seq_puts(seq, ",unhide"); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE)) + seq_puts(seq, ",undelete"); + if (!UDF_QUERY_FLAG(sb, UDF_FLAG_USE_AD_IN_ICB)) + seq_puts(seq, ",noadinicb"); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_USE_SHORT_AD)) + seq_puts(seq, ",shortad"); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_FORGET)) + seq_puts(seq, ",uid=forget"); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_IGNORE)) + seq_puts(seq, ",uid=ignore"); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_FORGET)) + seq_puts(seq, ",gid=forget"); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_IGNORE)) + seq_puts(seq, ",gid=ignore"); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_SET)) + seq_printf(seq, ",uid=%u", from_kuid(&init_user_ns, sbi->s_uid)); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_SET)) + seq_printf(seq, ",gid=%u", from_kgid(&init_user_ns, sbi->s_gid)); + if (sbi->s_umask != 0) + seq_printf(seq, ",umask=%ho", sbi->s_umask); + if (sbi->s_fmode != UDF_INVALID_MODE) + seq_printf(seq, ",mode=%ho", sbi->s_fmode); + if (sbi->s_dmode != UDF_INVALID_MODE) + seq_printf(seq, ",dmode=%ho", sbi->s_dmode); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_SESSION_SET)) + seq_printf(seq, ",session=%u", sbi->s_session); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_LASTBLOCK_SET)) + seq_printf(seq, ",lastblock=%u", sbi->s_last_block); + if (sbi->s_anchor != 0) + seq_printf(seq, ",anchor=%u", sbi->s_anchor); + /* + * volume, partition, fileset and rootdir seem to be ignored + * currently + */ + if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) + seq_puts(seq, ",utf8"); + if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP) && sbi->s_nls_map) + seq_printf(seq, ",iocharset=%s", sbi->s_nls_map->charset); + + return 0; +} + +/* + * udf_parse_options + * + * PURPOSE + * Parse mount options. + * + * DESCRIPTION + * The following mount options are supported: + * + * gid= Set the default group. + * umask= Set the default umask. + * mode= Set the default file permissions. + * dmode= Set the default directory permissions. + * uid= Set the default user. + * bs= Set the block size. + * unhide Show otherwise hidden files. + * undelete Show deleted files in lists. + * adinicb Embed data in the inode (default) + * noadinicb Don't embed data in the inode + * shortad Use short ad's + * longad Use long ad's (default) + * nostrict Unset strict conformance + * iocharset= Set the NLS character set + * + * The remaining are for debugging and disaster recovery: + * + * novrs Skip volume sequence recognition + * + * The following expect a offset from 0. + * + * session= Set the CDROM session (default= last session) + * anchor= Override standard anchor location. (default= 256) + * volume= Override the VolumeDesc location. (unused) + * partition= Override the PartitionDesc location. (unused) + * lastblock= Set the last block of the filesystem/ + * + * The following expect a offset from the partition root. + * + * fileset= Override the fileset block location. (unused) + * rootdir= Override the root directory location. (unused) + * WARNING: overriding the rootdir to a non-directory may + * yield highly unpredictable results. + * + * PRE-CONDITIONS + * options Pointer to mount options string. + * uopts Pointer to mount options variable. + * + * POST-CONDITIONS + * 1 Mount options parsed okay. + * 0 Error parsing mount options. + * + * HISTORY + * July 1, 1997 - Andrew E. Mileski + * Written, tested, and released. + */ + +enum { + Opt_novrs, Opt_nostrict, Opt_bs, Opt_unhide, Opt_undelete, + Opt_noadinicb, Opt_adinicb, Opt_shortad, Opt_longad, + Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock, + Opt_anchor, Opt_volume, Opt_partition, Opt_fileset, + Opt_rootdir, Opt_utf8, Opt_iocharset, + Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore, + Opt_fmode, Opt_dmode +}; + +static const match_table_t tokens = { + {Opt_novrs, "novrs"}, + {Opt_nostrict, "nostrict"}, + {Opt_bs, "bs=%u"}, + {Opt_unhide, "unhide"}, + {Opt_undelete, "undelete"}, + {Opt_noadinicb, "noadinicb"}, + {Opt_adinicb, "adinicb"}, + {Opt_shortad, "shortad"}, + {Opt_longad, "longad"}, + {Opt_uforget, "uid=forget"}, + {Opt_uignore, "uid=ignore"}, + {Opt_gforget, "gid=forget"}, + {Opt_gignore, "gid=ignore"}, + {Opt_gid, "gid=%u"}, + {Opt_uid, "uid=%u"}, + {Opt_umask, "umask=%o"}, + {Opt_session, "session=%u"}, + {Opt_lastblock, "lastblock=%u"}, + {Opt_anchor, "anchor=%u"}, + {Opt_volume, "volume=%u"}, + {Opt_partition, "partition=%u"}, + {Opt_fileset, "fileset=%u"}, + {Opt_rootdir, "rootdir=%u"}, + {Opt_utf8, "utf8"}, + {Opt_iocharset, "iocharset=%s"}, + {Opt_fmode, "mode=%o"}, + {Opt_dmode, "dmode=%o"}, + {Opt_err, NULL} +}; + +static int udf_parse_options(char *options, struct udf_options *uopt, + bool remount) +{ + char *p; + int option; + + uopt->novrs = 0; + uopt->partition = 0xFFFF; + uopt->session = 0xFFFFFFFF; + uopt->lastblock = 0; + uopt->anchor = 0; + uopt->volume = 0xFFFFFFFF; + uopt->rootdir = 0xFFFFFFFF; + uopt->fileset = 0xFFFFFFFF; + uopt->nls_map = NULL; + + if (!options) + return 1; + + while ((p = strsep(&options, ",")) != NULL) { + substring_t args[MAX_OPT_ARGS]; + int token; + unsigned n; + if (!*p) + continue; + + token = match_token(p, tokens, args); + switch (token) { + case Opt_novrs: + uopt->novrs = 1; + break; + case Opt_bs: + if (match_int(&args[0], &option)) + return 0; + n = option; + if (n != 512 && n != 1024 && n != 2048 && n != 4096) + return 0; + uopt->blocksize = n; + uopt->flags |= (1 << UDF_FLAG_BLOCKSIZE_SET); + break; + case Opt_unhide: + uopt->flags |= (1 << UDF_FLAG_UNHIDE); + break; + case Opt_undelete: + uopt->flags |= (1 << UDF_FLAG_UNDELETE); + break; + case Opt_noadinicb: + uopt->flags &= ~(1 << UDF_FLAG_USE_AD_IN_ICB); + break; + case Opt_adinicb: + uopt->flags |= (1 << UDF_FLAG_USE_AD_IN_ICB); + break; + case Opt_shortad: + uopt->flags |= (1 << UDF_FLAG_USE_SHORT_AD); + break; + case Opt_longad: + uopt->flags &= ~(1 << UDF_FLAG_USE_SHORT_AD); + break; + case Opt_gid: + if (match_int(args, &option)) + return 0; + uopt->gid = make_kgid(current_user_ns(), option); + if (!gid_valid(uopt->gid)) + return 0; + uopt->flags |= (1 << UDF_FLAG_GID_SET); + break; + case Opt_uid: + if (match_int(args, &option)) + return 0; + uopt->uid = make_kuid(current_user_ns(), option); + if (!uid_valid(uopt->uid)) + return 0; + uopt->flags |= (1 << UDF_FLAG_UID_SET); + break; + case Opt_umask: + if (match_octal(args, &option)) + return 0; + uopt->umask = option; + break; + case Opt_nostrict: + uopt->flags &= ~(1 << UDF_FLAG_STRICT); + break; + case Opt_session: + if (match_int(args, &option)) + return 0; + uopt->session = option; + if (!remount) + uopt->flags |= (1 << UDF_FLAG_SESSION_SET); + break; + case Opt_lastblock: + if (match_int(args, &option)) + return 0; + uopt->lastblock = option; + if (!remount) + uopt->flags |= (1 << UDF_FLAG_LASTBLOCK_SET); + break; + case Opt_anchor: + if (match_int(args, &option)) + return 0; + uopt->anchor = option; + break; + case Opt_volume: + if (match_int(args, &option)) + return 0; + uopt->volume = option; + break; + case Opt_partition: + if (match_int(args, &option)) + return 0; + uopt->partition = option; + break; + case Opt_fileset: + if (match_int(args, &option)) + return 0; + uopt->fileset = option; + break; + case Opt_rootdir: + if (match_int(args, &option)) + return 0; + uopt->rootdir = option; + break; + case Opt_utf8: + uopt->flags |= (1 << UDF_FLAG_UTF8); + break; +#ifdef CONFIG_UDF_NLS + case Opt_iocharset: + uopt->nls_map = load_nls(args[0].from); + uopt->flags |= (1 << UDF_FLAG_NLS_MAP); + break; +#endif + case Opt_uignore: + uopt->flags |= (1 << UDF_FLAG_UID_IGNORE); + break; + case Opt_uforget: + uopt->flags |= (1 << UDF_FLAG_UID_FORGET); + break; + case Opt_gignore: + uopt->flags |= (1 << UDF_FLAG_GID_IGNORE); + break; + case Opt_gforget: + uopt->flags |= (1 << UDF_FLAG_GID_FORGET); + break; + case Opt_fmode: + if (match_octal(args, &option)) + return 0; + uopt->fmode = option & 0777; + break; + case Opt_dmode: + if (match_octal(args, &option)) + return 0; + uopt->dmode = option & 0777; + break; + default: + pr_err("bad mount option \"%s\" or missing value\n", p); + return 0; + } + } + return 1; +} + +static int udf_remount_fs(struct super_block *sb, int *flags, char *options) +{ + struct udf_options uopt; + struct udf_sb_info *sbi = UDF_SB(sb); + int error = 0; + struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sb); + + sync_filesystem(sb); + if (lvidiu) { + int write_rev = le16_to_cpu(lvidiu->minUDFWriteRev); + if (write_rev > UDF_MAX_WRITE_VERSION && !(*flags & MS_RDONLY)) + return -EACCES; + } + + uopt.flags = sbi->s_flags; + uopt.uid = sbi->s_uid; + uopt.gid = sbi->s_gid; + uopt.umask = sbi->s_umask; + uopt.fmode = sbi->s_fmode; + uopt.dmode = sbi->s_dmode; + + if (!udf_parse_options(options, &uopt, true)) + return -EINVAL; + + write_lock(&sbi->s_cred_lock); + sbi->s_flags = uopt.flags; + sbi->s_uid = uopt.uid; + sbi->s_gid = uopt.gid; + sbi->s_umask = uopt.umask; + sbi->s_fmode = uopt.fmode; + sbi->s_dmode = uopt.dmode; + write_unlock(&sbi->s_cred_lock); + + if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) + goto out_unlock; + + if (*flags & MS_RDONLY) + udf_close_lvid(sb); + else + udf_open_lvid(sb); + +out_unlock: + return error; +} + +/* Check Volume Structure Descriptors (ECMA 167 2/9.1) */ +/* We also check any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */ +static loff_t udf_check_vsd(struct super_block *sb) +{ + struct volStructDesc *vsd = NULL; + loff_t sector = VSD_FIRST_SECTOR_OFFSET; + int sectorsize; + struct buffer_head *bh = NULL; + int nsr02 = 0; + int nsr03 = 0; + struct udf_sb_info *sbi; + + sbi = UDF_SB(sb); + if (sb->s_blocksize < sizeof(struct volStructDesc)) + sectorsize = sizeof(struct volStructDesc); + else + sectorsize = sb->s_blocksize; + + sector += (sbi->s_session << sb->s_blocksize_bits); + + udf_debug("Starting at sector %u (%ld byte sectors)\n", + (unsigned int)(sector >> sb->s_blocksize_bits), + sb->s_blocksize); + /* Process the sequence (if applicable). The hard limit on the sector + * offset is arbitrary, hopefully large enough so that all valid UDF + * filesystems will be recognised. There is no mention of an upper + * bound to the size of the volume recognition area in the standard. + * The limit will prevent the code to read all the sectors of a + * specially crafted image (like a bluray disc full of CD001 sectors), + * potentially causing minutes or even hours of uninterruptible I/O + * activity. This actually happened with uninitialised SSD partitions + * (all 0xFF) before the check for the limit and all valid IDs were + * added */ + for (; !nsr02 && !nsr03 && sector < VSD_MAX_SECTOR_OFFSET; + sector += sectorsize) { + /* Read a block */ + bh = udf_tread(sb, sector >> sb->s_blocksize_bits); + if (!bh) + break; + + /* Look for ISO descriptors */ + vsd = (struct volStructDesc *)(bh->b_data + + (sector & (sb->s_blocksize - 1))); + + if (!strncmp(vsd->stdIdent, VSD_STD_ID_CD001, + VSD_STD_ID_LEN)) { + switch (vsd->structType) { + case 0: + udf_debug("ISO9660 Boot Record found\n"); + break; + case 1: + udf_debug("ISO9660 Primary Volume Descriptor found\n"); + break; + case 2: + udf_debug("ISO9660 Supplementary Volume Descriptor found\n"); + break; + case 3: + udf_debug("ISO9660 Volume Partition Descriptor found\n"); + break; + case 255: + udf_debug("ISO9660 Volume Descriptor Set Terminator found\n"); + break; + default: + udf_debug("ISO9660 VRS (%u) found\n", + vsd->structType); + break; + } + } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_BEA01, + VSD_STD_ID_LEN)) + ; /* nothing */ + else if (!strncmp(vsd->stdIdent, VSD_STD_ID_TEA01, + VSD_STD_ID_LEN)) { + brelse(bh); + break; + } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR02, + VSD_STD_ID_LEN)) + nsr02 = sector; + else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR03, + VSD_STD_ID_LEN)) + nsr03 = sector; + else if (!strncmp(vsd->stdIdent, VSD_STD_ID_BOOT2, + VSD_STD_ID_LEN)) + ; /* nothing */ + else if (!strncmp(vsd->stdIdent, VSD_STD_ID_CDW02, + VSD_STD_ID_LEN)) + ; /* nothing */ + else { + /* invalid id : end of volume recognition area */ + brelse(bh); + break; + } + brelse(bh); + } + + if (nsr03) + return nsr03; + else if (nsr02) + return nsr02; + else if (!bh && sector - (sbi->s_session << sb->s_blocksize_bits) == + VSD_FIRST_SECTOR_OFFSET) + return -1; + else + return 0; +} + +static int udf_find_fileset(struct super_block *sb, + struct kernel_lb_addr *fileset, + struct kernel_lb_addr *root) +{ + struct buffer_head *bh = NULL; + long lastblock; + uint16_t ident; + struct udf_sb_info *sbi; + + if (fileset->logicalBlockNum != 0xFFFFFFFF || + fileset->partitionReferenceNum != 0xFFFF) { + bh = udf_read_ptagged(sb, fileset, 0, &ident); + + if (!bh) { + return 1; + } else if (ident != TAG_IDENT_FSD) { + brelse(bh); + return 1; + } + + } + + sbi = UDF_SB(sb); + if (!bh) { + /* Search backwards through the partitions */ + struct kernel_lb_addr newfileset; + +/* --> cvg: FIXME - is it reasonable? */ + return 1; + + for (newfileset.partitionReferenceNum = sbi->s_partitions - 1; + (newfileset.partitionReferenceNum != 0xFFFF && + fileset->logicalBlockNum == 0xFFFFFFFF && + fileset->partitionReferenceNum == 0xFFFF); + newfileset.partitionReferenceNum--) { + lastblock = sbi->s_partmaps + [newfileset.partitionReferenceNum] + .s_partition_len; + newfileset.logicalBlockNum = 0; + + do { + bh = udf_read_ptagged(sb, &newfileset, 0, + &ident); + if (!bh) { + newfileset.logicalBlockNum++; + continue; + } + + switch (ident) { + case TAG_IDENT_SBD: + { + struct spaceBitmapDesc *sp; + sp = (struct spaceBitmapDesc *) + bh->b_data; + newfileset.logicalBlockNum += 1 + + ((le32_to_cpu(sp->numOfBytes) + + sizeof(struct spaceBitmapDesc) + - 1) >> sb->s_blocksize_bits); + brelse(bh); + break; + } + case TAG_IDENT_FSD: + *fileset = newfileset; + break; + default: + newfileset.logicalBlockNum++; + brelse(bh); + bh = NULL; + break; + } + } while (newfileset.logicalBlockNum < lastblock && + fileset->logicalBlockNum == 0xFFFFFFFF && + fileset->partitionReferenceNum == 0xFFFF); + } + } + + if ((fileset->logicalBlockNum != 0xFFFFFFFF || + fileset->partitionReferenceNum != 0xFFFF) && bh) { + udf_debug("Fileset at block=%d, partition=%d\n", + fileset->logicalBlockNum, + fileset->partitionReferenceNum); + + sbi->s_partition = fileset->partitionReferenceNum; + udf_load_fileset(sb, bh, root); + brelse(bh); + return 0; + } + return 1; +} + +/* + * Load primary Volume Descriptor Sequence + * + * Return <0 on error, 0 on success. -EAGAIN is special meaning next sequence + * should be tried. + */ +static int udf_load_pvoldesc(struct super_block *sb, sector_t block) +{ + struct primaryVolDesc *pvoldesc; + uint8_t *outstr; + struct buffer_head *bh; + uint16_t ident; + int ret = -ENOMEM; + + outstr = kmalloc(128, GFP_NOFS); + if (!outstr) + return -ENOMEM; + + bh = udf_read_tagged(sb, block, block, &ident); + if (!bh) { + ret = -EAGAIN; + goto out2; + } + + if (ident != TAG_IDENT_PVD) { + ret = -EIO; + goto out_bh; + } + + pvoldesc = (struct primaryVolDesc *)bh->b_data; + + if (udf_disk_stamp_to_time(&UDF_SB(sb)->s_record_time, + pvoldesc->recordingDateAndTime)) { +#ifdef UDFFS_DEBUG + struct timestamp *ts = &pvoldesc->recordingDateAndTime; + udf_debug("recording time %04u/%02u/%02u %02u:%02u (%x)\n", + le16_to_cpu(ts->year), ts->month, ts->day, ts->hour, + ts->minute, le16_to_cpu(ts->typeAndTimezone)); +#endif + } + + ret = udf_dstrCS0toUTF8(outstr, 31, pvoldesc->volIdent, 32); + if (ret < 0) + goto out_bh; + + strncpy(UDF_SB(sb)->s_volume_ident, outstr, ret); + udf_debug("volIdent[] = '%s'\n", UDF_SB(sb)->s_volume_ident); + + ret = udf_dstrCS0toUTF8(outstr, 127, pvoldesc->volSetIdent, 128); + if (ret < 0) + goto out_bh; + + outstr[ret] = 0; + udf_debug("volSetIdent[] = '%s'\n", outstr); + + ret = 0; +out_bh: + brelse(bh); +out2: + kfree(outstr); + return ret; +} + +struct inode *udf_find_metadata_inode_efe(struct super_block *sb, + u32 meta_file_loc, u32 partition_ref) +{ + struct kernel_lb_addr addr; + struct inode *metadata_fe; + + addr.logicalBlockNum = meta_file_loc; + addr.partitionReferenceNum = partition_ref; + + metadata_fe = udf_iget_special(sb, &addr); + + if (IS_ERR(metadata_fe)) { + udf_warn(sb, "metadata inode efe not found\n"); + return metadata_fe; + } + if (UDF_I(metadata_fe)->i_alloc_type != ICBTAG_FLAG_AD_SHORT) { + udf_warn(sb, "metadata inode efe does not have short allocation descriptors!\n"); + iput(metadata_fe); + return ERR_PTR(-EIO); + } + + return metadata_fe; +} + +static int udf_load_metadata_files(struct super_block *sb, int partition, + int type1_index) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + struct udf_part_map *map; + struct udf_meta_data *mdata; + struct kernel_lb_addr addr; + struct inode *fe; + + map = &sbi->s_partmaps[partition]; + mdata = &map->s_type_specific.s_metadata; + mdata->s_phys_partition_ref = type1_index; + + /* metadata address */ + udf_debug("Metadata file location: block = %d part = %d\n", + mdata->s_meta_file_loc, mdata->s_phys_partition_ref); + + fe = udf_find_metadata_inode_efe(sb, mdata->s_meta_file_loc, + mdata->s_phys_partition_ref); + if (IS_ERR(fe)) { + /* mirror file entry */ + udf_debug("Mirror metadata file location: block = %d part = %d\n", + mdata->s_mirror_file_loc, mdata->s_phys_partition_ref); + + fe = udf_find_metadata_inode_efe(sb, mdata->s_mirror_file_loc, + mdata->s_phys_partition_ref); + + if (IS_ERR(fe)) { + udf_err(sb, "Both metadata and mirror metadata inode efe can not found\n"); + return PTR_ERR(fe); + } + mdata->s_mirror_fe = fe; + } else + mdata->s_metadata_fe = fe; + + + /* + * bitmap file entry + * Note: + * Load only if bitmap file location differs from 0xFFFFFFFF (DCN-5102) + */ + if (mdata->s_bitmap_file_loc != 0xFFFFFFFF) { + addr.logicalBlockNum = mdata->s_bitmap_file_loc; + addr.partitionReferenceNum = mdata->s_phys_partition_ref; + + udf_debug("Bitmap file location: block = %d part = %d\n", + addr.logicalBlockNum, addr.partitionReferenceNum); + + fe = udf_iget_special(sb, &addr); + if (IS_ERR(fe)) { + if (sb->s_flags & MS_RDONLY) + udf_warn(sb, "bitmap inode efe not found but it's ok since the disc is mounted read-only\n"); + else { + udf_err(sb, "bitmap inode efe not found and attempted read-write mount\n"); + return PTR_ERR(fe); + } + } else + mdata->s_bitmap_fe = fe; + } + + udf_debug("udf_load_metadata_files Ok\n"); + return 0; +} + +static void udf_load_fileset(struct super_block *sb, struct buffer_head *bh, + struct kernel_lb_addr *root) +{ + struct fileSetDesc *fset; + + fset = (struct fileSetDesc *)bh->b_data; + + *root = lelb_to_cpu(fset->rootDirectoryICB.extLocation); + + UDF_SB(sb)->s_serial_number = le16_to_cpu(fset->descTag.tagSerialNum); + + udf_debug("Rootdir at block=%d, partition=%d\n", + root->logicalBlockNum, root->partitionReferenceNum); +} + +int udf_compute_nr_groups(struct super_block *sb, u32 partition) +{ + struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition]; + return DIV_ROUND_UP(map->s_partition_len + + (sizeof(struct spaceBitmapDesc) << 3), + sb->s_blocksize * 8); +} + +static struct udf_bitmap *udf_sb_alloc_bitmap(struct super_block *sb, u32 index) +{ + struct udf_bitmap *bitmap; + int nr_groups; + int size; + + nr_groups = udf_compute_nr_groups(sb, index); + size = sizeof(struct udf_bitmap) + + (sizeof(struct buffer_head *) * nr_groups); + + if (size <= PAGE_SIZE) + bitmap = kzalloc(size, GFP_KERNEL); + else + bitmap = vzalloc(size); /* TODO: get rid of vzalloc */ + + if (bitmap == NULL) + return NULL; + + bitmap->s_nr_groups = nr_groups; + return bitmap; +} + +static int udf_fill_partdesc_info(struct super_block *sb, + struct partitionDesc *p, int p_index) +{ + struct udf_part_map *map; + struct udf_sb_info *sbi = UDF_SB(sb); + struct partitionHeaderDesc *phd; + + map = &sbi->s_partmaps[p_index]; + + map->s_partition_len = le32_to_cpu(p->partitionLength); /* blocks */ + map->s_partition_root = le32_to_cpu(p->partitionStartingLocation); + + if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_READ_ONLY)) + map->s_partition_flags |= UDF_PART_FLAG_READ_ONLY; + if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_WRITE_ONCE)) + map->s_partition_flags |= UDF_PART_FLAG_WRITE_ONCE; + if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_REWRITABLE)) + map->s_partition_flags |= UDF_PART_FLAG_REWRITABLE; + if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_OVERWRITABLE)) + map->s_partition_flags |= UDF_PART_FLAG_OVERWRITABLE; + + udf_debug("Partition (%d type %x) starts at physical %d, block length %d\n", + p_index, map->s_partition_type, + map->s_partition_root, map->s_partition_len); + + if (strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR02) && + strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR03)) + return 0; + + phd = (struct partitionHeaderDesc *)p->partitionContentsUse; + if (phd->unallocSpaceTable.extLength) { + struct kernel_lb_addr loc = { + .logicalBlockNum = le32_to_cpu( + phd->unallocSpaceTable.extPosition), + .partitionReferenceNum = p_index, + }; + struct inode *inode; + + inode = udf_iget_special(sb, &loc); + if (IS_ERR(inode)) { + udf_debug("cannot load unallocSpaceTable (part %d)\n", + p_index); + return PTR_ERR(inode); + } + map->s_uspace.s_table = inode; + map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE; + udf_debug("unallocSpaceTable (part %d) @ %ld\n", + p_index, map->s_uspace.s_table->i_ino); + } + + if (phd->unallocSpaceBitmap.extLength) { + struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index); + if (!bitmap) + return -ENOMEM; + map->s_uspace.s_bitmap = bitmap; + bitmap->s_extPosition = le32_to_cpu( + phd->unallocSpaceBitmap.extPosition); + map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_BITMAP; + udf_debug("unallocSpaceBitmap (part %d) @ %d\n", + p_index, bitmap->s_extPosition); + } + + if (phd->partitionIntegrityTable.extLength) + udf_debug("partitionIntegrityTable (part %d)\n", p_index); + + if (phd->freedSpaceTable.extLength) { + struct kernel_lb_addr loc = { + .logicalBlockNum = le32_to_cpu( + phd->freedSpaceTable.extPosition), + .partitionReferenceNum = p_index, + }; + struct inode *inode; + + inode = udf_iget_special(sb, &loc); + if (IS_ERR(inode)) { + udf_debug("cannot load freedSpaceTable (part %d)\n", + p_index); + return PTR_ERR(inode); + } + map->s_fspace.s_table = inode; + map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE; + udf_debug("freedSpaceTable (part %d) @ %ld\n", + p_index, map->s_fspace.s_table->i_ino); + } + + if (phd->freedSpaceBitmap.extLength) { + struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index); + if (!bitmap) + return -ENOMEM; + map->s_fspace.s_bitmap = bitmap; + bitmap->s_extPosition = le32_to_cpu( + phd->freedSpaceBitmap.extPosition); + map->s_partition_flags |= UDF_PART_FLAG_FREED_BITMAP; + udf_debug("freedSpaceBitmap (part %d) @ %d\n", + p_index, bitmap->s_extPosition); + } + return 0; +} + +static void udf_find_vat_block(struct super_block *sb, int p_index, + int type1_index, sector_t start_block) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + struct udf_part_map *map = &sbi->s_partmaps[p_index]; + sector_t vat_block; + struct kernel_lb_addr ino; + struct inode *inode; + + /* + * VAT file entry is in the last recorded block. Some broken disks have + * it a few blocks before so try a bit harder... + */ + ino.partitionReferenceNum = type1_index; + for (vat_block = start_block; + vat_block >= map->s_partition_root && + vat_block >= start_block - 3; vat_block--) { + ino.logicalBlockNum = vat_block - map->s_partition_root; + inode = udf_iget_special(sb, &ino); + if (!IS_ERR(inode)) { + sbi->s_vat_inode = inode; + break; + } + } +} + +static int udf_load_vat(struct super_block *sb, int p_index, int type1_index) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + struct udf_part_map *map = &sbi->s_partmaps[p_index]; + struct buffer_head *bh = NULL; + struct udf_inode_info *vati; + uint32_t pos; + struct virtualAllocationTable20 *vat20; + sector_t blocks = sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits; + + udf_find_vat_block(sb, p_index, type1_index, sbi->s_last_block); + if (!sbi->s_vat_inode && + sbi->s_last_block != blocks - 1) { + pr_notice("Failed to read VAT inode from the last recorded block (%lu), retrying with the last block of the device (%lu).\n", + (unsigned long)sbi->s_last_block, + (unsigned long)blocks - 1); + udf_find_vat_block(sb, p_index, type1_index, blocks - 1); + } + if (!sbi->s_vat_inode) + return -EIO; + + if (map->s_partition_type == UDF_VIRTUAL_MAP15) { + map->s_type_specific.s_virtual.s_start_offset = 0; + map->s_type_specific.s_virtual.s_num_entries = + (sbi->s_vat_inode->i_size - 36) >> 2; + } else if (map->s_partition_type == UDF_VIRTUAL_MAP20) { + vati = UDF_I(sbi->s_vat_inode); + if (vati->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { + pos = udf_block_map(sbi->s_vat_inode, 0); + bh = sb_bread(sb, pos); + if (!bh) + return -EIO; + vat20 = (struct virtualAllocationTable20 *)bh->b_data; + } else { + vat20 = (struct virtualAllocationTable20 *) + vati->i_ext.i_data; + } + + map->s_type_specific.s_virtual.s_start_offset = + le16_to_cpu(vat20->lengthHeader); + map->s_type_specific.s_virtual.s_num_entries = + (sbi->s_vat_inode->i_size - + map->s_type_specific.s_virtual. + s_start_offset) >> 2; + brelse(bh); + } + return 0; +} + +/* + * Load partition descriptor block + * + * Returns <0 on error, 0 on success, -EAGAIN is special - try next descriptor + * sequence. + */ +static int udf_load_partdesc(struct super_block *sb, sector_t block) +{ + struct buffer_head *bh; + struct partitionDesc *p; + struct udf_part_map *map; + struct udf_sb_info *sbi = UDF_SB(sb); + int i, type1_idx; + uint16_t partitionNumber; + uint16_t ident; + int ret; + + bh = udf_read_tagged(sb, block, block, &ident); + if (!bh) + return -EAGAIN; + if (ident != TAG_IDENT_PD) { + ret = 0; + goto out_bh; + } + + p = (struct partitionDesc *)bh->b_data; + partitionNumber = le16_to_cpu(p->partitionNumber); + + /* First scan for TYPE1 and SPARABLE partitions */ + for (i = 0; i < sbi->s_partitions; i++) { + map = &sbi->s_partmaps[i]; + udf_debug("Searching map: (%d == %d)\n", + map->s_partition_num, partitionNumber); + if (map->s_partition_num == partitionNumber && + (map->s_partition_type == UDF_TYPE1_MAP15 || + map->s_partition_type == UDF_SPARABLE_MAP15)) + break; + } + + if (i >= sbi->s_partitions) { + udf_debug("Partition (%d) not found in partition map\n", + partitionNumber); + ret = 0; + goto out_bh; + } + + ret = udf_fill_partdesc_info(sb, p, i); + if (ret < 0) + goto out_bh; + + /* + * Now rescan for VIRTUAL or METADATA partitions when SPARABLE and + * PHYSICAL partitions are already set up + */ + type1_idx = i; +#ifdef UDFFS_DEBUG + map = NULL; /* supress 'maybe used uninitialized' warning */ +#endif + for (i = 0; i < sbi->s_partitions; i++) { + map = &sbi->s_partmaps[i]; + + if (map->s_partition_num == partitionNumber && + (map->s_partition_type == UDF_VIRTUAL_MAP15 || + map->s_partition_type == UDF_VIRTUAL_MAP20 || + map->s_partition_type == UDF_METADATA_MAP25)) + break; + } + + if (i >= sbi->s_partitions) { + ret = 0; + goto out_bh; + } + + ret = udf_fill_partdesc_info(sb, p, i); + if (ret < 0) + goto out_bh; + + if (map->s_partition_type == UDF_METADATA_MAP25) { + ret = udf_load_metadata_files(sb, i, type1_idx); + if (ret < 0) { + udf_err(sb, "error loading MetaData partition map %d\n", + i); + goto out_bh; + } + } else { + /* + * If we have a partition with virtual map, we don't handle + * writing to it (we overwrite blocks instead of relocating + * them). + */ + if (!(sb->s_flags & MS_RDONLY)) { + ret = -EACCES; + goto out_bh; + } + ret = udf_load_vat(sb, i, type1_idx); + if (ret < 0) + goto out_bh; + } + ret = 0; +out_bh: + /* In case loading failed, we handle cleanup in udf_fill_super */ + brelse(bh); + return ret; +} + +static int udf_load_sparable_map(struct super_block *sb, + struct udf_part_map *map, + struct sparablePartitionMap *spm) +{ + uint32_t loc; + uint16_t ident; + struct sparingTable *st; + struct udf_sparing_data *sdata = &map->s_type_specific.s_sparing; + int i; + struct buffer_head *bh; + + map->s_partition_type = UDF_SPARABLE_MAP15; + sdata->s_packet_len = le16_to_cpu(spm->packetLength); + if (!is_power_of_2(sdata->s_packet_len)) { + udf_err(sb, "error loading logical volume descriptor: " + "Invalid packet length %u\n", + (unsigned)sdata->s_packet_len); + return -EIO; + } + if (spm->numSparingTables > 4) { + udf_err(sb, "error loading logical volume descriptor: " + "Too many sparing tables (%d)\n", + (int)spm->numSparingTables); + return -EIO; + } + + for (i = 0; i < spm->numSparingTables; i++) { + loc = le32_to_cpu(spm->locSparingTable[i]); + bh = udf_read_tagged(sb, loc, loc, &ident); + if (!bh) + continue; + + st = (struct sparingTable *)bh->b_data; + if (ident != 0 || + strncmp(st->sparingIdent.ident, UDF_ID_SPARING, + strlen(UDF_ID_SPARING)) || + sizeof(*st) + le16_to_cpu(st->reallocationTableLen) > + sb->s_blocksize) { + brelse(bh); + continue; + } + + sdata->s_spar_map[i] = bh; + } + map->s_partition_func = udf_get_pblock_spar15; + return 0; +} + +static int udf_load_logicalvol(struct super_block *sb, sector_t block, + struct kernel_lb_addr *fileset) +{ + struct logicalVolDesc *lvd; + int i, offset; + uint8_t type; + struct udf_sb_info *sbi = UDF_SB(sb); + struct genericPartitionMap *gpm; + uint16_t ident; + struct buffer_head *bh; + unsigned int table_len; + int ret; + + bh = udf_read_tagged(sb, block, block, &ident); + if (!bh) + return -EAGAIN; + BUG_ON(ident != TAG_IDENT_LVD); + lvd = (struct logicalVolDesc *)bh->b_data; + table_len = le32_to_cpu(lvd->mapTableLength); + if (table_len > sb->s_blocksize - sizeof(*lvd)) { + udf_err(sb, "error loading logical volume descriptor: " + "Partition table too long (%u > %lu)\n", table_len, + sb->s_blocksize - sizeof(*lvd)); + ret = -EIO; + goto out_bh; + } + + ret = udf_sb_alloc_partition_maps(sb, le32_to_cpu(lvd->numPartitionMaps)); + if (ret) + goto out_bh; + + for (i = 0, offset = 0; + i < sbi->s_partitions && offset < table_len; + i++, offset += gpm->partitionMapLength) { + struct udf_part_map *map = &sbi->s_partmaps[i]; + gpm = (struct genericPartitionMap *) + &(lvd->partitionMaps[offset]); + type = gpm->partitionMapType; + if (type == 1) { + struct genericPartitionMap1 *gpm1 = + (struct genericPartitionMap1 *)gpm; + map->s_partition_type = UDF_TYPE1_MAP15; + map->s_volumeseqnum = le16_to_cpu(gpm1->volSeqNum); + map->s_partition_num = le16_to_cpu(gpm1->partitionNum); + map->s_partition_func = NULL; + } else if (type == 2) { + struct udfPartitionMap2 *upm2 = + (struct udfPartitionMap2 *)gpm; + if (!strncmp(upm2->partIdent.ident, UDF_ID_VIRTUAL, + strlen(UDF_ID_VIRTUAL))) { + u16 suf = + le16_to_cpu(((__le16 *)upm2->partIdent. + identSuffix)[0]); + if (suf < 0x0200) { + map->s_partition_type = + UDF_VIRTUAL_MAP15; + map->s_partition_func = + udf_get_pblock_virt15; + } else { + map->s_partition_type = + UDF_VIRTUAL_MAP20; + map->s_partition_func = + udf_get_pblock_virt20; + } + } else if (!strncmp(upm2->partIdent.ident, + UDF_ID_SPARABLE, + strlen(UDF_ID_SPARABLE))) { + ret = udf_load_sparable_map(sb, map, + (struct sparablePartitionMap *)gpm); + if (ret < 0) + goto out_bh; + } else if (!strncmp(upm2->partIdent.ident, + UDF_ID_METADATA, + strlen(UDF_ID_METADATA))) { + struct udf_meta_data *mdata = + &map->s_type_specific.s_metadata; + struct metadataPartitionMap *mdm = + (struct metadataPartitionMap *) + &(lvd->partitionMaps[offset]); + udf_debug("Parsing Logical vol part %d type %d id=%s\n", + i, type, UDF_ID_METADATA); + + map->s_partition_type = UDF_METADATA_MAP25; + map->s_partition_func = udf_get_pblock_meta25; + + mdata->s_meta_file_loc = + le32_to_cpu(mdm->metadataFileLoc); + mdata->s_mirror_file_loc = + le32_to_cpu(mdm->metadataMirrorFileLoc); + mdata->s_bitmap_file_loc = + le32_to_cpu(mdm->metadataBitmapFileLoc); + mdata->s_alloc_unit_size = + le32_to_cpu(mdm->allocUnitSize); + mdata->s_align_unit_size = + le16_to_cpu(mdm->alignUnitSize); + if (mdm->flags & 0x01) + mdata->s_flags |= MF_DUPLICATE_MD; + + udf_debug("Metadata Ident suffix=0x%x\n", + le16_to_cpu(*(__le16 *) + mdm->partIdent.identSuffix)); + udf_debug("Metadata part num=%d\n", + le16_to_cpu(mdm->partitionNum)); + udf_debug("Metadata part alloc unit size=%d\n", + le32_to_cpu(mdm->allocUnitSize)); + udf_debug("Metadata file loc=%d\n", + le32_to_cpu(mdm->metadataFileLoc)); + udf_debug("Mirror file loc=%d\n", + le32_to_cpu(mdm->metadataMirrorFileLoc)); + udf_debug("Bitmap file loc=%d\n", + le32_to_cpu(mdm->metadataBitmapFileLoc)); + udf_debug("Flags: %d %d\n", + mdata->s_flags, mdm->flags); + } else { + udf_debug("Unknown ident: %s\n", + upm2->partIdent.ident); + continue; + } + map->s_volumeseqnum = le16_to_cpu(upm2->volSeqNum); + map->s_partition_num = le16_to_cpu(upm2->partitionNum); + } + udf_debug("Partition (%d:%d) type %d on volume %d\n", + i, map->s_partition_num, type, map->s_volumeseqnum); + } + + if (fileset) { + struct long_ad *la = (struct long_ad *)&(lvd->logicalVolContentsUse[0]); + + *fileset = lelb_to_cpu(la->extLocation); + udf_debug("FileSet found in LogicalVolDesc at block=%d, partition=%d\n", + fileset->logicalBlockNum, + fileset->partitionReferenceNum); + } + if (lvd->integritySeqExt.extLength) + udf_load_logicalvolint(sb, leea_to_cpu(lvd->integritySeqExt)); + ret = 0; +out_bh: + brelse(bh); + return ret; +} + +/* + * Find the prevailing Logical Volume Integrity Descriptor. + */ +static void udf_load_logicalvolint(struct super_block *sb, struct kernel_extent_ad loc) +{ + struct buffer_head *bh, *final_bh; + uint16_t ident; + struct udf_sb_info *sbi = UDF_SB(sb); + struct logicalVolIntegrityDesc *lvid; + int indirections = 0; + + while (++indirections <= UDF_MAX_LVID_NESTING) { + final_bh = NULL; + while (loc.extLength > 0 && + (bh = udf_read_tagged(sb, loc.extLocation, + loc.extLocation, &ident))) { + if (ident != TAG_IDENT_LVID) { + brelse(bh); + break; + } + + brelse(final_bh); + final_bh = bh; + + loc.extLength -= sb->s_blocksize; + loc.extLocation++; + } + + if (!final_bh) + return; + + brelse(sbi->s_lvid_bh); + sbi->s_lvid_bh = final_bh; + + lvid = (struct logicalVolIntegrityDesc *)final_bh->b_data; + if (lvid->nextIntegrityExt.extLength == 0) + return; + + loc = leea_to_cpu(lvid->nextIntegrityExt); + } + + udf_warn(sb, "Too many LVID indirections (max %u), ignoring.\n", + UDF_MAX_LVID_NESTING); + brelse(sbi->s_lvid_bh); + sbi->s_lvid_bh = NULL; +} + + +/* + * Process a main/reserve volume descriptor sequence. + * @block First block of first extent of the sequence. + * @lastblock Lastblock of first extent of the sequence. + * @fileset There we store extent containing root fileset + * + * Returns <0 on error, 0 on success. -EAGAIN is special - try next descriptor + * sequence + */ +static noinline int udf_process_sequence( + struct super_block *sb, + sector_t block, sector_t lastblock, + struct kernel_lb_addr *fileset) +{ + struct buffer_head *bh = NULL; + struct udf_vds_record vds[VDS_POS_LENGTH]; + struct udf_vds_record *curr; + struct generic_desc *gd; + struct volDescPtr *vdp; + bool done = false; + uint32_t vdsn; + uint16_t ident; + long next_s = 0, next_e = 0; + int ret; + unsigned int indirections = 0; + + memset(vds, 0, sizeof(struct udf_vds_record) * VDS_POS_LENGTH); + + /* + * Read the main descriptor sequence and find which descriptors + * are in it. + */ + for (; (!done && block <= lastblock); block++) { + + bh = udf_read_tagged(sb, block, block, &ident); + if (!bh) { + udf_err(sb, + "Block %llu of volume descriptor sequence is corrupted or we could not read it\n", + (unsigned long long)block); + return -EAGAIN; + } + + /* Process each descriptor (ISO 13346 3/8.3-8.4) */ + gd = (struct generic_desc *)bh->b_data; + vdsn = le32_to_cpu(gd->volDescSeqNum); + switch (ident) { + case TAG_IDENT_PVD: /* ISO 13346 3/10.1 */ + curr = &vds[VDS_POS_PRIMARY_VOL_DESC]; + if (vdsn >= curr->volDescSeqNum) { + curr->volDescSeqNum = vdsn; + curr->block = block; + } + break; + case TAG_IDENT_VDP: /* ISO 13346 3/10.3 */ + curr = &vds[VDS_POS_VOL_DESC_PTR]; + if (vdsn >= curr->volDescSeqNum) { + curr->volDescSeqNum = vdsn; + curr->block = block; + + vdp = (struct volDescPtr *)bh->b_data; + next_s = le32_to_cpu( + vdp->nextVolDescSeqExt.extLocation); + next_e = le32_to_cpu( + vdp->nextVolDescSeqExt.extLength); + next_e = next_e >> sb->s_blocksize_bits; + next_e += next_s; + } + break; + case TAG_IDENT_IUVD: /* ISO 13346 3/10.4 */ + curr = &vds[VDS_POS_IMP_USE_VOL_DESC]; + if (vdsn >= curr->volDescSeqNum) { + curr->volDescSeqNum = vdsn; + curr->block = block; + } + break; + case TAG_IDENT_PD: /* ISO 13346 3/10.5 */ + curr = &vds[VDS_POS_PARTITION_DESC]; + if (!curr->block) + curr->block = block; + break; + case TAG_IDENT_LVD: /* ISO 13346 3/10.6 */ + curr = &vds[VDS_POS_LOGICAL_VOL_DESC]; + if (vdsn >= curr->volDescSeqNum) { + curr->volDescSeqNum = vdsn; + curr->block = block; + } + break; + case TAG_IDENT_USD: /* ISO 13346 3/10.8 */ + curr = &vds[VDS_POS_UNALLOC_SPACE_DESC]; + if (vdsn >= curr->volDescSeqNum) { + curr->volDescSeqNum = vdsn; + curr->block = block; + } + break; + case TAG_IDENT_TD: /* ISO 13346 3/10.9 */ + if (++indirections > UDF_MAX_TD_NESTING) { + udf_err(sb, "too many TDs (max %u supported)\n", UDF_MAX_TD_NESTING); + brelse(bh); + return -EIO; + } + + vds[VDS_POS_TERMINATING_DESC].block = block; + if (next_e) { + block = next_s; + lastblock = next_e; + next_s = next_e = 0; + } else + done = true; + break; + } + brelse(bh); + } + /* + * Now read interesting descriptors again and process them + * in a suitable order + */ + if (!vds[VDS_POS_PRIMARY_VOL_DESC].block) { + udf_err(sb, "Primary Volume Descriptor not found!\n"); + return -EAGAIN; + } + ret = udf_load_pvoldesc(sb, vds[VDS_POS_PRIMARY_VOL_DESC].block); + if (ret < 0) + return ret; + + if (vds[VDS_POS_LOGICAL_VOL_DESC].block) { + ret = udf_load_logicalvol(sb, + vds[VDS_POS_LOGICAL_VOL_DESC].block, + fileset); + if (ret < 0) + return ret; + } + + if (vds[VDS_POS_PARTITION_DESC].block) { + /* + * We rescan the whole descriptor sequence to find + * partition descriptor blocks and process them. + */ + for (block = vds[VDS_POS_PARTITION_DESC].block; + block < vds[VDS_POS_TERMINATING_DESC].block; + block++) { + ret = udf_load_partdesc(sb, block); + if (ret < 0) + return ret; + } + } + + return 0; +} + +/* + * Load Volume Descriptor Sequence described by anchor in bh + * + * Returns <0 on error, 0 on success + */ +static int udf_load_sequence(struct super_block *sb, struct buffer_head *bh, + struct kernel_lb_addr *fileset) +{ + struct anchorVolDescPtr *anchor; + sector_t main_s, main_e, reserve_s, reserve_e; + int ret; + + anchor = (struct anchorVolDescPtr *)bh->b_data; + + /* Locate the main sequence */ + main_s = le32_to_cpu(anchor->mainVolDescSeqExt.extLocation); + main_e = le32_to_cpu(anchor->mainVolDescSeqExt.extLength); + main_e = main_e >> sb->s_blocksize_bits; + main_e += main_s; + + /* Locate the reserve sequence */ + reserve_s = le32_to_cpu(anchor->reserveVolDescSeqExt.extLocation); + reserve_e = le32_to_cpu(anchor->reserveVolDescSeqExt.extLength); + reserve_e = reserve_e >> sb->s_blocksize_bits; + reserve_e += reserve_s; + + /* Process the main & reserve sequences */ + /* responsible for finding the PartitionDesc(s) */ + ret = udf_process_sequence(sb, main_s, main_e, fileset); + if (ret != -EAGAIN) + return ret; + udf_sb_free_partitions(sb); + ret = udf_process_sequence(sb, reserve_s, reserve_e, fileset); + if (ret < 0) { + udf_sb_free_partitions(sb); + /* No sequence was OK, return -EIO */ + if (ret == -EAGAIN) + ret = -EIO; + } + return ret; +} + +/* + * Check whether there is an anchor block in the given block and + * load Volume Descriptor Sequence if so. + * + * Returns <0 on error, 0 on success, -EAGAIN is special - try next anchor + * block + */ +static int udf_check_anchor_block(struct super_block *sb, sector_t block, + struct kernel_lb_addr *fileset) +{ + struct buffer_head *bh; + uint16_t ident; + int ret; + + if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV) && + udf_fixed_to_variable(block) >= + sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits) + return -EAGAIN; + + bh = udf_read_tagged(sb, block, block, &ident); + if (!bh) + return -EAGAIN; + if (ident != TAG_IDENT_AVDP) { + brelse(bh); + return -EAGAIN; + } + ret = udf_load_sequence(sb, bh, fileset); + brelse(bh); + return ret; +} + +/* + * Search for an anchor volume descriptor pointer. + * + * Returns < 0 on error, 0 on success. -EAGAIN is special - try next set + * of anchors. + */ +static int udf_scan_anchors(struct super_block *sb, sector_t *lastblock, + struct kernel_lb_addr *fileset) +{ + sector_t last[6]; + int i; + struct udf_sb_info *sbi = UDF_SB(sb); + int last_count = 0; + int ret; + + /* First try user provided anchor */ + if (sbi->s_anchor) { + ret = udf_check_anchor_block(sb, sbi->s_anchor, fileset); + if (ret != -EAGAIN) + return ret; + } + /* + * according to spec, anchor is in either: + * block 256 + * lastblock-256 + * lastblock + * however, if the disc isn't closed, it could be 512. + */ + ret = udf_check_anchor_block(sb, sbi->s_session + 256, fileset); + if (ret != -EAGAIN) + return ret; + /* + * The trouble is which block is the last one. Drives often misreport + * this so we try various possibilities. + */ + last[last_count++] = *lastblock; + if (*lastblock >= 1) + last[last_count++] = *lastblock - 1; + last[last_count++] = *lastblock + 1; + if (*lastblock >= 2) + last[last_count++] = *lastblock - 2; + if (*lastblock >= 150) + last[last_count++] = *lastblock - 150; + if (*lastblock >= 152) + last[last_count++] = *lastblock - 152; + + for (i = 0; i < last_count; i++) { + if (last[i] >= sb->s_bdev->bd_inode->i_size >> + sb->s_blocksize_bits) + continue; + ret = udf_check_anchor_block(sb, last[i], fileset); + if (ret != -EAGAIN) { + if (!ret) + *lastblock = last[i]; + return ret; + } + if (last[i] < 256) + continue; + ret = udf_check_anchor_block(sb, last[i] - 256, fileset); + if (ret != -EAGAIN) { + if (!ret) + *lastblock = last[i]; + return ret; + } + } + + /* Finally try block 512 in case media is open */ + return udf_check_anchor_block(sb, sbi->s_session + 512, fileset); +} + +/* + * Find an anchor volume descriptor and load Volume Descriptor Sequence from + * area specified by it. The function expects sbi->s_lastblock to be the last + * block on the media. + * + * Return <0 on error, 0 if anchor found. -EAGAIN is special meaning anchor + * was not found. + */ +static int udf_find_anchor(struct super_block *sb, + struct kernel_lb_addr *fileset) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + sector_t lastblock = sbi->s_last_block; + int ret; + + ret = udf_scan_anchors(sb, &lastblock, fileset); + if (ret != -EAGAIN) + goto out; + + /* No anchor found? Try VARCONV conversion of block numbers */ + UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); + lastblock = udf_variable_to_fixed(sbi->s_last_block); + /* Firstly, we try to not convert number of the last block */ + ret = udf_scan_anchors(sb, &lastblock, fileset); + if (ret != -EAGAIN) + goto out; + + lastblock = sbi->s_last_block; + /* Secondly, we try with converted number of the last block */ + ret = udf_scan_anchors(sb, &lastblock, fileset); + if (ret < 0) { + /* VARCONV didn't help. Clear it. */ + UDF_CLEAR_FLAG(sb, UDF_FLAG_VARCONV); + } +out: + if (ret == 0) + sbi->s_last_block = lastblock; + return ret; +} + +/* + * Check Volume Structure Descriptor, find Anchor block and load Volume + * Descriptor Sequence. + * + * Returns < 0 on error, 0 on success. -EAGAIN is special meaning anchor + * block was not found. + */ +static int udf_load_vrs(struct super_block *sb, struct udf_options *uopt, + int silent, struct kernel_lb_addr *fileset) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + loff_t nsr_off; + int ret; + + if (!sb_set_blocksize(sb, uopt->blocksize)) { + if (!silent) + udf_warn(sb, "Bad block size\n"); + return -EINVAL; + } + sbi->s_last_block = uopt->lastblock; + if (!uopt->novrs) { + /* Check that it is NSR02 compliant */ + nsr_off = udf_check_vsd(sb); + if (!nsr_off) { + if (!silent) + udf_warn(sb, "No VRS found\n"); + return 0; + } + if (nsr_off == -1) + udf_debug("Failed to read sector at offset %d. " + "Assuming open disc. Skipping validity " + "check\n", VSD_FIRST_SECTOR_OFFSET); + if (!sbi->s_last_block) + sbi->s_last_block = udf_get_last_block(sb); + } else { + udf_debug("Validity check skipped because of novrs option\n"); + } + + /* Look for anchor block and load Volume Descriptor Sequence */ + sbi->s_anchor = uopt->anchor; + ret = udf_find_anchor(sb, fileset); + if (ret < 0) { + if (!silent && ret == -EAGAIN) + udf_warn(sb, "No anchor found\n"); + return ret; + } + return 0; +} + +static void udf_open_lvid(struct super_block *sb) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + struct buffer_head *bh = sbi->s_lvid_bh; + struct logicalVolIntegrityDesc *lvid; + struct logicalVolIntegrityDescImpUse *lvidiu; + + if (!bh) + return; + lvid = (struct logicalVolIntegrityDesc *)bh->b_data; + lvidiu = udf_sb_lvidiu(sb); + if (!lvidiu) + return; + + mutex_lock(&sbi->s_alloc_mutex); + lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; + lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; + udf_time_to_disk_stamp(&lvid->recordingDateAndTime, + CURRENT_TIME); + lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_OPEN); + + lvid->descTag.descCRC = cpu_to_le16( + crc_itu_t(0, (char *)lvid + sizeof(struct tag), + le16_to_cpu(lvid->descTag.descCRCLength))); + + lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag); + mark_buffer_dirty(bh); + sbi->s_lvid_dirty = 0; + mutex_unlock(&sbi->s_alloc_mutex); + /* Make opening of filesystem visible on the media immediately */ + sync_dirty_buffer(bh); +} + +static void udf_close_lvid(struct super_block *sb) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + struct buffer_head *bh = sbi->s_lvid_bh; + struct logicalVolIntegrityDesc *lvid; + struct logicalVolIntegrityDescImpUse *lvidiu; + + if (!bh) + return; + lvid = (struct logicalVolIntegrityDesc *)bh->b_data; + lvidiu = udf_sb_lvidiu(sb); + if (!lvidiu) + return; + + mutex_lock(&sbi->s_alloc_mutex); + lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; + lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; + udf_time_to_disk_stamp(&lvid->recordingDateAndTime, CURRENT_TIME); + if (UDF_MAX_WRITE_VERSION > le16_to_cpu(lvidiu->maxUDFWriteRev)) + lvidiu->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION); + if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFReadRev)) + lvidiu->minUDFReadRev = cpu_to_le16(sbi->s_udfrev); + if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFWriteRev)) + lvidiu->minUDFWriteRev = cpu_to_le16(sbi->s_udfrev); + lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE); + + lvid->descTag.descCRC = cpu_to_le16( + crc_itu_t(0, (char *)lvid + sizeof(struct tag), + le16_to_cpu(lvid->descTag.descCRCLength))); + + lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag); + /* + * We set buffer uptodate unconditionally here to avoid spurious + * warnings from mark_buffer_dirty() when previous EIO has marked + * the buffer as !uptodate + */ + set_buffer_uptodate(bh); + mark_buffer_dirty(bh); + sbi->s_lvid_dirty = 0; + mutex_unlock(&sbi->s_alloc_mutex); + /* Make closing of filesystem visible on the media immediately */ + sync_dirty_buffer(bh); +} + +u64 lvid_get_unique_id(struct super_block *sb) +{ + struct buffer_head *bh; + struct udf_sb_info *sbi = UDF_SB(sb); + struct logicalVolIntegrityDesc *lvid; + struct logicalVolHeaderDesc *lvhd; + u64 uniqueID; + u64 ret; + + bh = sbi->s_lvid_bh; + if (!bh) + return 0; + + lvid = (struct logicalVolIntegrityDesc *)bh->b_data; + lvhd = (struct logicalVolHeaderDesc *)lvid->logicalVolContentsUse; + + mutex_lock(&sbi->s_alloc_mutex); + ret = uniqueID = le64_to_cpu(lvhd->uniqueID); + if (!(++uniqueID & 0xFFFFFFFF)) + uniqueID += 16; + lvhd->uniqueID = cpu_to_le64(uniqueID); + mutex_unlock(&sbi->s_alloc_mutex); + mark_buffer_dirty(bh); + + return ret; +} + +static int udf_fill_super(struct super_block *sb, void *options, int silent) +{ + int ret = -EINVAL; + struct inode *inode = NULL; + struct udf_options uopt; + struct kernel_lb_addr rootdir, fileset; + struct udf_sb_info *sbi; + bool lvid_open = false; + + uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT); + uopt.uid = INVALID_UID; + uopt.gid = INVALID_GID; + uopt.umask = 0; + uopt.fmode = UDF_INVALID_MODE; + uopt.dmode = UDF_INVALID_MODE; + + sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL); + if (!sbi) + return -ENOMEM; + + sb->s_fs_info = sbi; + + mutex_init(&sbi->s_alloc_mutex); + + if (!udf_parse_options((char *)options, &uopt, false)) + goto parse_options_failure; + + if (uopt.flags & (1 << UDF_FLAG_UTF8) && + uopt.flags & (1 << UDF_FLAG_NLS_MAP)) { + udf_err(sb, "utf8 cannot be combined with iocharset\n"); + goto parse_options_failure; + } +#ifdef CONFIG_UDF_NLS + if ((uopt.flags & (1 << UDF_FLAG_NLS_MAP)) && !uopt.nls_map) { + uopt.nls_map = load_nls_default(); + if (!uopt.nls_map) + uopt.flags &= ~(1 << UDF_FLAG_NLS_MAP); + else + udf_debug("Using default NLS map\n"); + } +#endif + if (!(uopt.flags & (1 << UDF_FLAG_NLS_MAP))) + uopt.flags |= (1 << UDF_FLAG_UTF8); + + fileset.logicalBlockNum = 0xFFFFFFFF; + fileset.partitionReferenceNum = 0xFFFF; + + sbi->s_flags = uopt.flags; + sbi->s_uid = uopt.uid; + sbi->s_gid = uopt.gid; + sbi->s_umask = uopt.umask; + sbi->s_fmode = uopt.fmode; + sbi->s_dmode = uopt.dmode; + sbi->s_nls_map = uopt.nls_map; + rwlock_init(&sbi->s_cred_lock); + + if (uopt.session == 0xFFFFFFFF) + sbi->s_session = udf_get_last_session(sb); + else + sbi->s_session = uopt.session; + + udf_debug("Multi-session=%d\n", sbi->s_session); + + /* Fill in the rest of the superblock */ + sb->s_op = &udf_sb_ops; + sb->s_export_op = &udf_export_ops; + + sb->s_magic = UDF_SUPER_MAGIC; + sb->s_time_gran = 1000; + + if (uopt.flags & (1 << UDF_FLAG_BLOCKSIZE_SET)) { + ret = udf_load_vrs(sb, &uopt, silent, &fileset); + } else { + uopt.blocksize = bdev_logical_block_size(sb->s_bdev); + ret = udf_load_vrs(sb, &uopt, silent, &fileset); + if (ret == -EAGAIN && uopt.blocksize != UDF_DEFAULT_BLOCKSIZE) { + if (!silent) + pr_notice("Rescanning with blocksize %d\n", + UDF_DEFAULT_BLOCKSIZE); + brelse(sbi->s_lvid_bh); + sbi->s_lvid_bh = NULL; + uopt.blocksize = UDF_DEFAULT_BLOCKSIZE; + ret = udf_load_vrs(sb, &uopt, silent, &fileset); + } + } + if (ret < 0) { + if (ret == -EAGAIN) { + udf_warn(sb, "No partition found (1)\n"); + ret = -EINVAL; + } + goto error_out; + } + + udf_debug("Lastblock=%d\n", sbi->s_last_block); + + if (sbi->s_lvid_bh) { + struct logicalVolIntegrityDescImpUse *lvidiu = + udf_sb_lvidiu(sb); + uint16_t minUDFReadRev; + uint16_t minUDFWriteRev; + + if (!lvidiu) { + ret = -EINVAL; + goto error_out; + } + minUDFReadRev = le16_to_cpu(lvidiu->minUDFReadRev); + minUDFWriteRev = le16_to_cpu(lvidiu->minUDFWriteRev); + if (minUDFReadRev > UDF_MAX_READ_VERSION) { + udf_err(sb, "minUDFReadRev=%x (max is %x)\n", + minUDFReadRev, + UDF_MAX_READ_VERSION); + ret = -EINVAL; + goto error_out; + } else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION && + !(sb->s_flags & MS_RDONLY)) { + ret = -EACCES; + goto error_out; + } + + sbi->s_udfrev = minUDFWriteRev; + + if (minUDFReadRev >= UDF_VERS_USE_EXTENDED_FE) + UDF_SET_FLAG(sb, UDF_FLAG_USE_EXTENDED_FE); + if (minUDFReadRev >= UDF_VERS_USE_STREAMS) + UDF_SET_FLAG(sb, UDF_FLAG_USE_STREAMS); + } + + if (!sbi->s_partitions) { + udf_warn(sb, "No partition found (2)\n"); + ret = -EINVAL; + goto error_out; + } + + if (sbi->s_partmaps[sbi->s_partition].s_partition_flags & + UDF_PART_FLAG_READ_ONLY && + !(sb->s_flags & MS_RDONLY)) { + ret = -EACCES; + goto error_out; + } + + if (udf_find_fileset(sb, &fileset, &rootdir)) { + udf_warn(sb, "No fileset found\n"); + ret = -EINVAL; + goto error_out; + } + + if (!silent) { + struct timestamp ts; + udf_time_to_disk_stamp(&ts, sbi->s_record_time); + udf_info("Mounting volume '%s', timestamp %04u/%02u/%02u %02u:%02u (%x)\n", + sbi->s_volume_ident, + le16_to_cpu(ts.year), ts.month, ts.day, + ts.hour, ts.minute, le16_to_cpu(ts.typeAndTimezone)); + } + if (!(sb->s_flags & MS_RDONLY)) { + udf_open_lvid(sb); + lvid_open = true; + } + + /* Assign the root inode */ + /* assign inodes by physical block number */ + /* perhaps it's not extensible enough, but for now ... */ + inode = udf_iget(sb, &rootdir); + if (IS_ERR(inode)) { + udf_err(sb, "Error in udf_iget, block=%d, partition=%d\n", + rootdir.logicalBlockNum, rootdir.partitionReferenceNum); + ret = PTR_ERR(inode); + goto error_out; + } + + /* Allocate a dentry for the root inode */ + sb->s_root = d_make_root(inode); + if (!sb->s_root) { + udf_err(sb, "Couldn't allocate root dentry\n"); + ret = -ENOMEM; + goto error_out; + } + sb->s_maxbytes = MAX_LFS_FILESIZE; + sb->s_max_links = UDF_MAX_LINKS; + return 0; + +error_out: + iput(sbi->s_vat_inode); +parse_options_failure: +#ifdef CONFIG_UDF_NLS + if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) + unload_nls(sbi->s_nls_map); +#endif + if (lvid_open) + udf_close_lvid(sb); + brelse(sbi->s_lvid_bh); + udf_sb_free_partitions(sb); + kfree(sbi); + sb->s_fs_info = NULL; + + return ret; +} + +void _udf_err(struct super_block *sb, const char *function, + const char *fmt, ...) +{ + struct va_format vaf; + va_list args; + + va_start(args, fmt); + + vaf.fmt = fmt; + vaf.va = &args; + + pr_err("error (device %s): %s: %pV", sb->s_id, function, &vaf); + + va_end(args); +} + +void _udf_warn(struct super_block *sb, const char *function, + const char *fmt, ...) +{ + struct va_format vaf; + va_list args; + + va_start(args, fmt); + + vaf.fmt = fmt; + vaf.va = &args; + + pr_warn("warning (device %s): %s: %pV", sb->s_id, function, &vaf); + + va_end(args); +} + +static void udf_put_super(struct super_block *sb) +{ + struct udf_sb_info *sbi; + + sbi = UDF_SB(sb); + + iput(sbi->s_vat_inode); +#ifdef CONFIG_UDF_NLS + if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) + unload_nls(sbi->s_nls_map); +#endif + if (!(sb->s_flags & MS_RDONLY)) + udf_close_lvid(sb); + brelse(sbi->s_lvid_bh); + udf_sb_free_partitions(sb); + mutex_destroy(&sbi->s_alloc_mutex); + kfree(sb->s_fs_info); + sb->s_fs_info = NULL; +} + +static int udf_sync_fs(struct super_block *sb, int wait) +{ + struct udf_sb_info *sbi = UDF_SB(sb); + + mutex_lock(&sbi->s_alloc_mutex); + if (sbi->s_lvid_dirty) { + /* + * Blockdevice will be synced later so we don't have to submit + * the buffer for IO + */ + mark_buffer_dirty(sbi->s_lvid_bh); + sbi->s_lvid_dirty = 0; + } + mutex_unlock(&sbi->s_alloc_mutex); + + return 0; +} + +static int udf_statfs(struct dentry *dentry, struct kstatfs *buf) +{ + struct super_block *sb = dentry->d_sb; + struct udf_sb_info *sbi = UDF_SB(sb); + struct logicalVolIntegrityDescImpUse *lvidiu; + u64 id = huge_encode_dev(sb->s_bdev->bd_dev); + + lvidiu = udf_sb_lvidiu(sb); + buf->f_type = UDF_SUPER_MAGIC; + buf->f_bsize = sb->s_blocksize; + buf->f_blocks = sbi->s_partmaps[sbi->s_partition].s_partition_len; + buf->f_bfree = udf_count_free(sb); + buf->f_bavail = buf->f_bfree; + buf->f_files = (lvidiu != NULL ? (le32_to_cpu(lvidiu->numFiles) + + le32_to_cpu(lvidiu->numDirs)) : 0) + + buf->f_bfree; + buf->f_ffree = buf->f_bfree; + buf->f_namelen = UDF_NAME_LEN; + buf->f_fsid.val[0] = (u32)id; + buf->f_fsid.val[1] = (u32)(id >> 32); + + return 0; +} + +static unsigned int udf_count_free_bitmap(struct super_block *sb, + struct udf_bitmap *bitmap) +{ + struct buffer_head *bh = NULL; + unsigned int accum = 0; + int index; + int block = 0, newblock; + struct kernel_lb_addr loc; + uint32_t bytes; + uint8_t *ptr; + uint16_t ident; + struct spaceBitmapDesc *bm; + + loc.logicalBlockNum = bitmap->s_extPosition; + loc.partitionReferenceNum = UDF_SB(sb)->s_partition; + bh = udf_read_ptagged(sb, &loc, 0, &ident); + + if (!bh) { + udf_err(sb, "udf_count_free failed\n"); + goto out; + } else if (ident != TAG_IDENT_SBD) { + brelse(bh); + udf_err(sb, "udf_count_free failed\n"); + goto out; + } + + bm = (struct spaceBitmapDesc *)bh->b_data; + bytes = le32_to_cpu(bm->numOfBytes); + index = sizeof(struct spaceBitmapDesc); /* offset in first block only */ + ptr = (uint8_t *)bh->b_data; + + while (bytes > 0) { + u32 cur_bytes = min_t(u32, bytes, sb->s_blocksize - index); + accum += bitmap_weight((const unsigned long *)(ptr + index), + cur_bytes * 8); + bytes -= cur_bytes; + if (bytes) { + brelse(bh); + newblock = udf_get_lb_pblock(sb, &loc, ++block); + bh = udf_tread(sb, newblock); + if (!bh) { + udf_debug("read failed\n"); + goto out; + } + index = 0; + ptr = (uint8_t *)bh->b_data; + } + } + brelse(bh); +out: + return accum; +} + +static unsigned int udf_count_free_table(struct super_block *sb, + struct inode *table) +{ + unsigned int accum = 0; + uint32_t elen; + struct kernel_lb_addr eloc; + int8_t etype; + struct extent_position epos; + + mutex_lock(&UDF_SB(sb)->s_alloc_mutex); + epos.block = UDF_I(table)->i_location; + epos.offset = sizeof(struct unallocSpaceEntry); + epos.bh = NULL; + + while ((etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) + accum += (elen >> table->i_sb->s_blocksize_bits); + + brelse(epos.bh); + mutex_unlock(&UDF_SB(sb)->s_alloc_mutex); + + return accum; +} + +static unsigned int udf_count_free(struct super_block *sb) +{ + unsigned int accum = 0; + struct udf_sb_info *sbi; + struct udf_part_map *map; + + sbi = UDF_SB(sb); + if (sbi->s_lvid_bh) { + struct logicalVolIntegrityDesc *lvid = + (struct logicalVolIntegrityDesc *) + sbi->s_lvid_bh->b_data; + if (le32_to_cpu(lvid->numOfPartitions) > sbi->s_partition) { + accum = le32_to_cpu( + lvid->freeSpaceTable[sbi->s_partition]); + if (accum == 0xFFFFFFFF) + accum = 0; + } + } + + if (accum) + return accum; + + map = &sbi->s_partmaps[sbi->s_partition]; + if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) { + accum += udf_count_free_bitmap(sb, + map->s_uspace.s_bitmap); + } + if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) { + accum += udf_count_free_bitmap(sb, + map->s_fspace.s_bitmap); + } + if (accum) + return accum; + + if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) { + accum += udf_count_free_table(sb, + map->s_uspace.s_table); + } + if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) { + accum += udf_count_free_table(sb, + map->s_fspace.s_table); + } + + return accum; +} diff --git a/vendor/linux/fs/udf/symlink.c b/vendor/linux/fs/udf/symlink.c new file mode 100644 index 0000000..8d61977 --- /dev/null +++ b/vendor/linux/fs/udf/symlink.c @@ -0,0 +1,160 @@ +/* + * symlink.c + * + * PURPOSE + * Symlink handling routines for the OSTA-UDF(tm) filesystem. + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + * + * (C) 1998-2001 Ben Fennema + * (C) 1999 Stelias Computing Inc + * + * HISTORY + * + * 04/16/99 blf Created. + * + */ + +#include "udfdecl.h" +#include +#include +#include +#include +#include +#include +#include +#include "udf_i.h" + +static int udf_pc_to_char(struct super_block *sb, unsigned char *from, + int fromlen, unsigned char *to, int tolen) +{ + struct pathComponent *pc; + int elen = 0; + int comp_len; + unsigned char *p = to; + + /* Reserve one byte for terminating \0 */ + tolen--; + while (elen < fromlen) { + pc = (struct pathComponent *)(from + elen); + elen += sizeof(struct pathComponent); + switch (pc->componentType) { + case 1: + /* + * Symlink points to some place which should be agreed + * upon between originator and receiver of the media. Ignore. + */ + if (pc->lengthComponentIdent > 0) { + elen += pc->lengthComponentIdent; + break; + } + /* Fall through */ + case 2: + if (tolen == 0) + return -ENAMETOOLONG; + p = to; + *p++ = '/'; + tolen--; + break; + case 3: + if (tolen < 3) + return -ENAMETOOLONG; + memcpy(p, "../", 3); + p += 3; + tolen -= 3; + break; + case 4: + if (tolen < 2) + return -ENAMETOOLONG; + memcpy(p, "./", 2); + p += 2; + tolen -= 2; + /* that would be . - just ignore */ + break; + case 5: + elen += pc->lengthComponentIdent; + if (elen > fromlen) + return -EIO; + comp_len = udf_get_filename(sb, pc->componentIdent, + pc->lengthComponentIdent, + p, tolen); + if (comp_len < 0) + return comp_len; + + p += comp_len; + tolen -= comp_len; + if (tolen == 0) + return -ENAMETOOLONG; + *p++ = '/'; + tolen--; + break; + } + } + if (p > to + 1) + p[-1] = '\0'; + else + p[0] = '\0'; + return 0; +} + +static int udf_symlink_filler(struct file *file, struct page *page) +{ + struct inode *inode = page->mapping->host; + struct buffer_head *bh = NULL; + unsigned char *symlink; + int err; + unsigned char *p = page_address(page); + struct udf_inode_info *iinfo; + uint32_t pos; + + /* We don't support symlinks longer than one block */ + if (inode->i_size > inode->i_sb->s_blocksize) { + err = -ENAMETOOLONG; + goto out_unmap; + } + + iinfo = UDF_I(inode); + pos = udf_block_map(inode, 0); + + down_read(&iinfo->i_data_sem); + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { + symlink = iinfo->i_ext.i_data + iinfo->i_lenEAttr; + } else { + bh = sb_bread(inode->i_sb, pos); + + if (!bh) { + err = -EIO; + goto out_unlock_inode; + } + + symlink = bh->b_data; + } + + err = udf_pc_to_char(inode->i_sb, symlink, inode->i_size, p, PAGE_SIZE); + brelse(bh); + if (err) + goto out_unlock_inode; + + up_read(&iinfo->i_data_sem); + SetPageUptodate(page); + unlock_page(page); + return 0; + +out_unlock_inode: + up_read(&iinfo->i_data_sem); + SetPageError(page); +out_unmap: + unlock_page(page); + return err; +} + +/* + * symlinks can't do much... + */ +const struct address_space_operations udf_symlink_aops = { + .readpage = udf_symlink_filler, +}; diff --git a/vendor/linux/fs/udf/truncate.c b/vendor/linux/fs/udf/truncate.c new file mode 100644 index 0000000..42b8c57 --- /dev/null +++ b/vendor/linux/fs/udf/truncate.c @@ -0,0 +1,286 @@ +/* + * truncate.c + * + * PURPOSE + * Truncate handling routines for the OSTA-UDF(tm) filesystem. + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + * + * (C) 1999-2004 Ben Fennema + * (C) 1999 Stelias Computing Inc + * + * HISTORY + * + * 02/24/99 blf Created. + * + */ + +#include "udfdecl.h" +#include +#include + +#include "udf_i.h" +#include "udf_sb.h" + +static void extent_trunc(struct inode *inode, struct extent_position *epos, + struct kernel_lb_addr *eloc, int8_t etype, uint32_t elen, + uint32_t nelen) +{ + struct kernel_lb_addr neloc = {}; + int last_block = (elen + inode->i_sb->s_blocksize - 1) >> + inode->i_sb->s_blocksize_bits; + int first_block = (nelen + inode->i_sb->s_blocksize - 1) >> + inode->i_sb->s_blocksize_bits; + + if (nelen) { + if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { + udf_free_blocks(inode->i_sb, inode, eloc, 0, + last_block); + etype = (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30); + } else + neloc = *eloc; + nelen = (etype << 30) | nelen; + } + + if (elen != nelen) { + udf_write_aext(inode, epos, &neloc, nelen, 0); + if (last_block - first_block > 0) { + if (etype == (EXT_RECORDED_ALLOCATED >> 30)) + mark_inode_dirty(inode); + + if (etype != (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) + udf_free_blocks(inode->i_sb, inode, eloc, + first_block, + last_block - first_block); + } + } +} + +/* + * Truncate the last extent to match i_size. This function assumes + * that preallocation extent is already truncated. + */ +void udf_truncate_tail_extent(struct inode *inode) +{ + struct extent_position epos = {}; + struct kernel_lb_addr eloc; + uint32_t elen, nelen; + uint64_t lbcount = 0; + int8_t etype = -1, netype; + int adsize; + struct udf_inode_info *iinfo = UDF_I(inode); + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB || + inode->i_size == iinfo->i_lenExtents) + return; + /* Are we going to delete the file anyway? */ + if (inode->i_nlink == 0) + return; + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + adsize = sizeof(struct short_ad); + else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + adsize = sizeof(struct long_ad); + else + BUG(); + + /* Find the last extent in the file */ + while ((netype = udf_next_aext(inode, &epos, &eloc, &elen, 1)) != -1) { + etype = netype; + lbcount += elen; + if (lbcount > inode->i_size) { + if (lbcount - inode->i_size >= inode->i_sb->s_blocksize) + udf_warn(inode->i_sb, + "Too long extent after EOF in inode %u: i_size: %lld lbcount: %lld extent %u+%u\n", + (unsigned)inode->i_ino, + (long long)inode->i_size, + (long long)lbcount, + (unsigned)eloc.logicalBlockNum, + (unsigned)elen); + nelen = elen - (lbcount - inode->i_size); + epos.offset -= adsize; + extent_trunc(inode, &epos, &eloc, etype, elen, nelen); + epos.offset += adsize; + if (udf_next_aext(inode, &epos, &eloc, &elen, 1) != -1) + udf_err(inode->i_sb, + "Extent after EOF in inode %u\n", + (unsigned)inode->i_ino); + break; + } + } + /* This inode entry is in-memory only and thus we don't have to mark + * the inode dirty */ + iinfo->i_lenExtents = inode->i_size; + brelse(epos.bh); +} + +void udf_discard_prealloc(struct inode *inode) +{ + struct extent_position epos = { NULL, 0, {0, 0} }; + struct kernel_lb_addr eloc; + uint32_t elen; + uint64_t lbcount = 0; + int8_t etype = -1, netype; + int adsize; + struct udf_inode_info *iinfo = UDF_I(inode); + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB || + inode->i_size == iinfo->i_lenExtents) + return; + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + adsize = sizeof(struct short_ad); + else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + adsize = sizeof(struct long_ad); + else + adsize = 0; + + epos.block = iinfo->i_location; + + /* Find the last extent in the file */ + while ((netype = udf_next_aext(inode, &epos, &eloc, &elen, 1)) != -1) { + etype = netype; + lbcount += elen; + } + if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { + epos.offset -= adsize; + lbcount -= elen; + extent_trunc(inode, &epos, &eloc, etype, elen, 0); + if (!epos.bh) { + iinfo->i_lenAlloc = + epos.offset - + udf_file_entry_alloc_offset(inode); + mark_inode_dirty(inode); + } else { + struct allocExtDesc *aed = + (struct allocExtDesc *)(epos.bh->b_data); + aed->lengthAllocDescs = + cpu_to_le32(epos.offset - + sizeof(struct allocExtDesc)); + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || + UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) + udf_update_tag(epos.bh->b_data, epos.offset); + else + udf_update_tag(epos.bh->b_data, + sizeof(struct allocExtDesc)); + mark_buffer_dirty_inode(epos.bh, inode); + } + } + /* This inode entry is in-memory only and thus we don't have to mark + * the inode dirty */ + iinfo->i_lenExtents = lbcount; + brelse(epos.bh); +} + +static void udf_update_alloc_ext_desc(struct inode *inode, + struct extent_position *epos, + u32 lenalloc) +{ + struct super_block *sb = inode->i_sb; + struct udf_sb_info *sbi = UDF_SB(sb); + + struct allocExtDesc *aed = (struct allocExtDesc *) (epos->bh->b_data); + int len = sizeof(struct allocExtDesc); + + aed->lengthAllocDescs = cpu_to_le32(lenalloc); + if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || sbi->s_udfrev >= 0x0201) + len += lenalloc; + + udf_update_tag(epos->bh->b_data, len); + mark_buffer_dirty_inode(epos->bh, inode); +} + +/* + * Truncate extents of inode to inode->i_size. This function can be used only + * for making file shorter. For making file longer, udf_extend_file() has to + * be used. + */ +void udf_truncate_extents(struct inode *inode) +{ + struct extent_position epos; + struct kernel_lb_addr eloc, neloc = {}; + uint32_t elen, nelen = 0, indirect_ext_len = 0, lenalloc; + int8_t etype; + struct super_block *sb = inode->i_sb; + sector_t first_block = inode->i_size >> sb->s_blocksize_bits, offset; + loff_t byte_offset; + int adsize; + struct udf_inode_info *iinfo = UDF_I(inode); + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + adsize = sizeof(struct short_ad); + else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) + adsize = sizeof(struct long_ad); + else + BUG(); + + etype = inode_bmap(inode, first_block, &epos, &eloc, &elen, &offset); + byte_offset = (offset << sb->s_blocksize_bits) + + (inode->i_size & (sb->s_blocksize - 1)); + if (etype == -1) { + /* We should extend the file? */ + WARN_ON(byte_offset); + return; + } + epos.offset -= adsize; + extent_trunc(inode, &epos, &eloc, etype, elen, byte_offset); + epos.offset += adsize; + if (byte_offset) + lenalloc = epos.offset; + else + lenalloc = epos.offset - adsize; + + if (!epos.bh) + lenalloc -= udf_file_entry_alloc_offset(inode); + else + lenalloc -= sizeof(struct allocExtDesc); + + while ((etype = udf_current_aext(inode, &epos, &eloc, + &elen, 0)) != -1) { + if (etype == (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) { + udf_write_aext(inode, &epos, &neloc, nelen, 0); + if (indirect_ext_len) { + /* We managed to free all extents in the + * indirect extent - free it too */ + BUG_ON(!epos.bh); + udf_free_blocks(sb, NULL, &epos.block, + 0, indirect_ext_len); + } else if (!epos.bh) { + iinfo->i_lenAlloc = lenalloc; + mark_inode_dirty(inode); + } else + udf_update_alloc_ext_desc(inode, + &epos, lenalloc); + brelse(epos.bh); + epos.offset = sizeof(struct allocExtDesc); + epos.block = eloc; + epos.bh = udf_tread(sb, + udf_get_lb_pblock(sb, &eloc, 0)); + if (elen) + indirect_ext_len = + (elen + sb->s_blocksize - 1) >> + sb->s_blocksize_bits; + else + indirect_ext_len = 1; + } else { + extent_trunc(inode, &epos, &eloc, etype, elen, 0); + epos.offset += adsize; + } + } + + if (indirect_ext_len) { + BUG_ON(!epos.bh); + udf_free_blocks(sb, NULL, &epos.block, 0, indirect_ext_len); + } else if (!epos.bh) { + iinfo->i_lenAlloc = lenalloc; + mark_inode_dirty(inode); + } else + udf_update_alloc_ext_desc(inode, &epos, lenalloc); + iinfo->i_lenExtents = inode->i_size; + + brelse(epos.bh); +} diff --git a/vendor/linux/fs/udf/udf_i.h b/vendor/linux/fs/udf/udf_i.h new file mode 100644 index 0000000..b1b9a63 --- /dev/null +++ b/vendor/linux/fs/udf/udf_i.h @@ -0,0 +1,62 @@ +#ifndef _UDF_I_H +#define _UDF_I_H + +struct extent_position { + struct buffer_head *bh; + uint32_t offset; + struct kernel_lb_addr block; +}; + +struct udf_ext_cache { + /* Extent position */ + struct extent_position epos; + /* Start logical offset in bytes */ + loff_t lstart; +}; + +/* + * The i_data_sem and i_mutex serve for protection of allocation information + * of a regular files and symlinks. This includes all extents belonging to + * the file/symlink, a fact whether data are in-inode or in external data + * blocks, preallocation, goal block information... When extents are read, + * i_mutex or i_data_sem must be held (for reading is enough in case of + * i_data_sem). When extents are changed, i_data_sem must be held for writing + * and also i_mutex must be held. + * + * For directories i_mutex is used for all the necessary protection. + */ + +struct udf_inode_info { + struct timespec i_crtime; + /* Physical address of inode */ + struct kernel_lb_addr i_location; + __u64 i_unique; + __u32 i_lenEAttr; + __u32 i_lenAlloc; + __u64 i_lenExtents; + __u32 i_next_alloc_block; + __u32 i_next_alloc_goal; + __u32 i_checkpoint; + unsigned i_alloc_type : 3; + unsigned i_efe : 1; /* extendedFileEntry */ + unsigned i_use : 1; /* unallocSpaceEntry */ + unsigned i_strat4096 : 1; + unsigned reserved : 26; + union { + struct short_ad *i_sad; + struct long_ad *i_lad; + __u8 *i_data; + } i_ext; + struct rw_semaphore i_data_sem; + struct udf_ext_cache cached_extent; + /* Spinlock for protecting extent cache */ + spinlock_t i_extent_cache_lock; + struct inode vfs_inode; +}; + +static inline struct udf_inode_info *UDF_I(struct inode *inode) +{ + return container_of(inode, struct udf_inode_info, vfs_inode); +} + +#endif /* _UDF_I_H) */ diff --git a/vendor/linux/fs/udf/udf_sb.h b/vendor/linux/fs/udf/udf_sb.h new file mode 100644 index 0000000..c13875d --- /dev/null +++ b/vendor/linux/fs/udf/udf_sb.h @@ -0,0 +1,187 @@ +#ifndef __LINUX_UDF_SB_H +#define __LINUX_UDF_SB_H + +#include +#include +#include + +#define UDF_MAX_READ_VERSION 0x0250 +#define UDF_MAX_WRITE_VERSION 0x0201 + +#define UDF_FLAG_USE_EXTENDED_FE 0 +#define UDF_VERS_USE_EXTENDED_FE 0x0200 +#define UDF_FLAG_USE_STREAMS 1 +#define UDF_VERS_USE_STREAMS 0x0200 +#define UDF_FLAG_USE_SHORT_AD 2 +#define UDF_FLAG_USE_AD_IN_ICB 3 +#define UDF_FLAG_USE_FILE_CTIME_EA 4 +#define UDF_FLAG_STRICT 5 +#define UDF_FLAG_UNDELETE 6 +#define UDF_FLAG_UNHIDE 7 +#define UDF_FLAG_VARCONV 8 +#define UDF_FLAG_NLS_MAP 9 +#define UDF_FLAG_UTF8 10 +#define UDF_FLAG_UID_FORGET 11 /* save -1 for uid to disk */ +#define UDF_FLAG_UID_IGNORE 12 /* use sb uid instead of on disk uid */ +#define UDF_FLAG_GID_FORGET 13 +#define UDF_FLAG_GID_IGNORE 14 +#define UDF_FLAG_UID_SET 15 +#define UDF_FLAG_GID_SET 16 +#define UDF_FLAG_SESSION_SET 17 +#define UDF_FLAG_LASTBLOCK_SET 18 +#define UDF_FLAG_BLOCKSIZE_SET 19 + +#define UDF_PART_FLAG_UNALLOC_BITMAP 0x0001 +#define UDF_PART_FLAG_UNALLOC_TABLE 0x0002 +#define UDF_PART_FLAG_FREED_BITMAP 0x0004 +#define UDF_PART_FLAG_FREED_TABLE 0x0008 +#define UDF_PART_FLAG_READ_ONLY 0x0010 +#define UDF_PART_FLAG_WRITE_ONCE 0x0020 +#define UDF_PART_FLAG_REWRITABLE 0x0040 +#define UDF_PART_FLAG_OVERWRITABLE 0x0080 + +#define UDF_MAX_BLOCK_LOADED 8 + +#define UDF_TYPE1_MAP15 0x1511U +#define UDF_VIRTUAL_MAP15 0x1512U +#define UDF_VIRTUAL_MAP20 0x2012U +#define UDF_SPARABLE_MAP15 0x1522U +#define UDF_METADATA_MAP25 0x2511U + +#define UDF_INVALID_MODE ((umode_t)-1) + +#pragma pack(1) /* XXX(hch): Why? This file just defines in-core structures */ + +#define MF_DUPLICATE_MD 0x01 +#define MF_MIRROR_FE_LOADED 0x02 + +struct udf_meta_data { + __u32 s_meta_file_loc; + __u32 s_mirror_file_loc; + __u32 s_bitmap_file_loc; + __u32 s_alloc_unit_size; + __u16 s_align_unit_size; + /* + * Partition Reference Number of the associated physical / sparable + * partition + */ + __u16 s_phys_partition_ref; + int s_flags; + struct inode *s_metadata_fe; + struct inode *s_mirror_fe; + struct inode *s_bitmap_fe; +}; + +struct udf_sparing_data { + __u16 s_packet_len; + struct buffer_head *s_spar_map[4]; +}; + +struct udf_virtual_data { + __u32 s_num_entries; + __u16 s_start_offset; +}; + +struct udf_bitmap { + __u32 s_extPosition; + int s_nr_groups; + struct buffer_head *s_block_bitmap[0]; +}; + +struct udf_part_map { + union { + struct udf_bitmap *s_bitmap; + struct inode *s_table; + } s_uspace; + union { + struct udf_bitmap *s_bitmap; + struct inode *s_table; + } s_fspace; + __u32 s_partition_root; + __u32 s_partition_len; + __u16 s_partition_type; + __u16 s_partition_num; + union { + struct udf_sparing_data s_sparing; + struct udf_virtual_data s_virtual; + struct udf_meta_data s_metadata; + } s_type_specific; + __u32 (*s_partition_func)(struct super_block *, __u32, __u16, __u32); + __u16 s_volumeseqnum; + __u16 s_partition_flags; +}; + +#pragma pack() + +struct udf_sb_info { + struct udf_part_map *s_partmaps; + __u8 s_volume_ident[32]; + + /* Overall info */ + __u16 s_partitions; + __u16 s_partition; + + /* Sector headers */ + __s32 s_session; + __u32 s_anchor; + __u32 s_last_block; + + struct buffer_head *s_lvid_bh; + + /* Default permissions */ + umode_t s_umask; + kgid_t s_gid; + kuid_t s_uid; + umode_t s_fmode; + umode_t s_dmode; + /* Lock protecting consistency of above permission settings */ + rwlock_t s_cred_lock; + + /* Root Info */ + struct timespec s_record_time; + + /* Fileset Info */ + __u16 s_serial_number; + + /* highest UDF revision we have recorded to this media */ + __u16 s_udfrev; + + /* Miscellaneous flags */ + unsigned long s_flags; + + /* Encoding info */ + struct nls_table *s_nls_map; + + /* VAT inode */ + struct inode *s_vat_inode; + + struct mutex s_alloc_mutex; + /* Protected by s_alloc_mutex */ + unsigned int s_lvid_dirty; +}; + +static inline struct udf_sb_info *UDF_SB(struct super_block *sb) +{ + return sb->s_fs_info; +} + +struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct super_block *sb); + +int udf_compute_nr_groups(struct super_block *sb, u32 partition); + +static inline int UDF_QUERY_FLAG(struct super_block *sb, int flag) +{ + return test_bit(flag, &UDF_SB(sb)->s_flags); +} + +static inline void UDF_SET_FLAG(struct super_block *sb, int flag) +{ + set_bit(flag, &UDF_SB(sb)->s_flags); +} + +static inline void UDF_CLEAR_FLAG(struct super_block *sb, int flag) +{ + clear_bit(flag, &UDF_SB(sb)->s_flags); +} + +#endif /* __LINUX_UDF_SB_H */ diff --git a/vendor/linux/fs/udf/udfdecl.h b/vendor/linux/fs/udf/udfdecl.h new file mode 100644 index 0000000..263829e --- /dev/null +++ b/vendor/linux/fs/udf/udfdecl.h @@ -0,0 +1,251 @@ +#ifndef __UDF_DECL_H +#define __UDF_DECL_H + +#define pr_fmt(fmt) "UDF-fs: " fmt + +#include "ecma_167.h" +#include "osta_udf.h" + +#include +#include +#include +#include + +#include "udf_sb.h" +#include "udfend.h" +#include "udf_i.h" + +#define UDF_PREALLOCATE +#define UDF_DEFAULT_PREALLOC_BLOCKS 8 + +extern __printf(3, 4) void _udf_err(struct super_block *sb, + const char *function, const char *fmt, ...); +#define udf_err(sb, fmt, ...) \ + _udf_err(sb, __func__, fmt, ##__VA_ARGS__) + +extern __printf(3, 4) void _udf_warn(struct super_block *sb, + const char *function, const char *fmt, ...); +#define udf_warn(sb, fmt, ...) \ + _udf_warn(sb, __func__, fmt, ##__VA_ARGS__) + +#define udf_info(fmt, ...) \ + pr_info("INFO " fmt, ##__VA_ARGS__) + +#undef UDFFS_DEBUG + +#ifdef UDFFS_DEBUG +#define udf_debug(fmt, ...) \ + printk(KERN_DEBUG pr_fmt("%s:%d:%s: " fmt), \ + __FILE__, __LINE__, __func__, ##__VA_ARGS__) +#else +#define udf_debug(fmt, ...) \ + no_printk(fmt, ##__VA_ARGS__) +#endif + +#define udf_fixed_to_variable(x) ( ( ( (x) >> 5 ) * 39 ) + ( (x) & 0x0000001F ) ) +#define udf_variable_to_fixed(x) ( ( ( (x) / 39 ) << 5 ) + ( (x) % 39 ) ) + +#define UDF_EXTENT_LENGTH_MASK 0x3FFFFFFF +#define UDF_EXTENT_FLAG_MASK 0xC0000000 + +#define UDF_NAME_PAD 4 +#define UDF_NAME_LEN 254 +#define UDF_NAME_LEN_CS0 255 + +static inline size_t udf_file_entry_alloc_offset(struct inode *inode) +{ + struct udf_inode_info *iinfo = UDF_I(inode); + if (iinfo->i_use) + return sizeof(struct unallocSpaceEntry); + else if (iinfo->i_efe) + return sizeof(struct extendedFileEntry) + iinfo->i_lenEAttr; + else + return sizeof(struct fileEntry) + iinfo->i_lenEAttr; +} + +static inline size_t udf_ext0_offset(struct inode *inode) +{ + if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) + return udf_file_entry_alloc_offset(inode); + else + return 0; +} + +/* computes tag checksum */ +u8 udf_tag_checksum(const struct tag *t); + +struct dentry; +struct inode; +struct task_struct; +struct buffer_head; +struct super_block; + +extern const struct export_operations udf_export_ops; +extern const struct inode_operations udf_dir_inode_operations; +extern const struct file_operations udf_dir_operations; +extern const struct inode_operations udf_file_inode_operations; +extern const struct file_operations udf_file_operations; +extern const struct address_space_operations udf_aops; +extern const struct address_space_operations udf_adinicb_aops; +extern const struct address_space_operations udf_symlink_aops; + +struct udf_fileident_bh { + struct buffer_head *sbh; + struct buffer_head *ebh; + int soffset; + int eoffset; +}; + +struct udf_vds_record { + uint32_t block; + uint32_t volDescSeqNum; +}; + +struct generic_desc { + struct tag descTag; + __le32 volDescSeqNum; +}; + + +/* super.c */ + +static inline void udf_updated_lvid(struct super_block *sb) +{ + struct buffer_head *bh = UDF_SB(sb)->s_lvid_bh; + + BUG_ON(!bh); + WARN_ON_ONCE(((struct logicalVolIntegrityDesc *) + bh->b_data)->integrityType != + cpu_to_le32(LVID_INTEGRITY_TYPE_OPEN)); + UDF_SB(sb)->s_lvid_dirty = 1; +} +extern u64 lvid_get_unique_id(struct super_block *sb); +struct inode *udf_find_metadata_inode_efe(struct super_block *sb, + u32 meta_file_loc, u32 partition_num); + +/* namei.c */ +extern int udf_write_fi(struct inode *inode, struct fileIdentDesc *, + struct fileIdentDesc *, struct udf_fileident_bh *, + uint8_t *, uint8_t *); + +/* file.c */ +extern long udf_ioctl(struct file *, unsigned int, unsigned long); +/* inode.c */ +extern struct inode *__udf_iget(struct super_block *, struct kernel_lb_addr *, + bool hidden_inode); +static inline struct inode *udf_iget_special(struct super_block *sb, + struct kernel_lb_addr *ino) +{ + return __udf_iget(sb, ino, true); +} +static inline struct inode *udf_iget(struct super_block *sb, + struct kernel_lb_addr *ino) +{ + return __udf_iget(sb, ino, false); +} +extern int udf_expand_file_adinicb(struct inode *); +extern struct buffer_head *udf_expand_dir_adinicb(struct inode *, int *, int *); +extern struct buffer_head *udf_bread(struct inode *, int, int, int *); +extern int udf_setsize(struct inode *, loff_t); +extern void udf_evict_inode(struct inode *); +extern int udf_write_inode(struct inode *, struct writeback_control *wbc); +extern long udf_block_map(struct inode *, sector_t); +extern int8_t inode_bmap(struct inode *, sector_t, struct extent_position *, + struct kernel_lb_addr *, uint32_t *, sector_t *); +extern int udf_setup_indirect_aext(struct inode *inode, int block, + struct extent_position *epos); +extern int __udf_add_aext(struct inode *inode, struct extent_position *epos, + struct kernel_lb_addr *eloc, uint32_t elen, int inc); +extern int udf_add_aext(struct inode *, struct extent_position *, + struct kernel_lb_addr *, uint32_t, int); +extern void udf_write_aext(struct inode *, struct extent_position *, + struct kernel_lb_addr *, uint32_t, int); +extern int8_t udf_delete_aext(struct inode *, struct extent_position, + struct kernel_lb_addr, uint32_t); +extern int8_t udf_next_aext(struct inode *, struct extent_position *, + struct kernel_lb_addr *, uint32_t *, int); +extern int8_t udf_current_aext(struct inode *, struct extent_position *, + struct kernel_lb_addr *, uint32_t *, int); + +/* misc.c */ +extern struct buffer_head *udf_tgetblk(struct super_block *, int); +extern struct buffer_head *udf_tread(struct super_block *, int); +extern struct genericFormat *udf_add_extendedattr(struct inode *, uint32_t, + uint32_t, uint8_t); +extern struct genericFormat *udf_get_extendedattr(struct inode *, uint32_t, + uint8_t); +extern struct buffer_head *udf_read_tagged(struct super_block *, uint32_t, + uint32_t, uint16_t *); +extern struct buffer_head *udf_read_ptagged(struct super_block *, + struct kernel_lb_addr *, uint32_t, + uint16_t *); +extern void udf_update_tag(char *, int); +extern void udf_new_tag(char *, uint16_t, uint16_t, uint16_t, uint32_t, int); + +/* lowlevel.c */ +extern unsigned int udf_get_last_session(struct super_block *); +extern unsigned long udf_get_last_block(struct super_block *); + +/* partition.c */ +extern uint32_t udf_get_pblock(struct super_block *, uint32_t, uint16_t, + uint32_t); +extern uint32_t udf_get_pblock_virt15(struct super_block *, uint32_t, uint16_t, + uint32_t); +extern uint32_t udf_get_pblock_virt20(struct super_block *, uint32_t, uint16_t, + uint32_t); +extern uint32_t udf_get_pblock_spar15(struct super_block *, uint32_t, uint16_t, + uint32_t); +extern uint32_t udf_get_pblock_meta25(struct super_block *, uint32_t, uint16_t, + uint32_t); +extern int udf_relocate_blocks(struct super_block *, long, long *); + +static inline uint32_t +udf_get_lb_pblock(struct super_block *sb, struct kernel_lb_addr *loc, + uint32_t offset) +{ + return udf_get_pblock(sb, loc->logicalBlockNum, + loc->partitionReferenceNum, offset); +} + +/* unicode.c */ +extern int udf_get_filename(struct super_block *, const uint8_t *, int, + uint8_t *, int); +extern int udf_put_filename(struct super_block *, const uint8_t *, int, + uint8_t *, int); +extern int udf_dstrCS0toUTF8(uint8_t *, int, const uint8_t *, int); + +/* ialloc.c */ +extern void udf_free_inode(struct inode *); +extern struct inode *udf_new_inode(struct inode *, umode_t); + +/* truncate.c */ +extern void udf_truncate_tail_extent(struct inode *); +extern void udf_discard_prealloc(struct inode *); +extern void udf_truncate_extents(struct inode *); + +/* balloc.c */ +extern void udf_free_blocks(struct super_block *, struct inode *, + struct kernel_lb_addr *, uint32_t, uint32_t); +extern int udf_prealloc_blocks(struct super_block *, struct inode *, uint16_t, + uint32_t, uint32_t); +extern int udf_new_block(struct super_block *, struct inode *, uint16_t, + uint32_t, int *); + +/* directory.c */ +extern struct fileIdentDesc *udf_fileident_read(struct inode *, loff_t *, + struct udf_fileident_bh *, + struct fileIdentDesc *, + struct extent_position *, + struct kernel_lb_addr *, uint32_t *, + sector_t *); +extern struct fileIdentDesc *udf_get_fileident(void *buffer, int bufsize, + int *offset); +extern struct long_ad *udf_get_filelongad(uint8_t *, int, uint32_t *, int); +extern struct short_ad *udf_get_fileshortad(uint8_t *, int, uint32_t *, int); + +/* udftime.c */ +extern struct timespec *udf_disk_stamp_to_time(struct timespec *dest, + struct timestamp src); +extern struct timestamp *udf_time_to_disk_stamp(struct timestamp *dest, struct timespec src); + +#endif /* __UDF_DECL_H */ diff --git a/vendor/linux/fs/udf/udfend.h b/vendor/linux/fs/udf/udfend.h new file mode 100644 index 0000000..6a9f3a9 --- /dev/null +++ b/vendor/linux/fs/udf/udfend.h @@ -0,0 +1,77 @@ +#ifndef __UDF_ENDIAN_H +#define __UDF_ENDIAN_H + +#include +#include + +static inline struct kernel_lb_addr lelb_to_cpu(struct lb_addr in) +{ + struct kernel_lb_addr out; + + out.logicalBlockNum = le32_to_cpu(in.logicalBlockNum); + out.partitionReferenceNum = le16_to_cpu(in.partitionReferenceNum); + + return out; +} + +static inline struct lb_addr cpu_to_lelb(struct kernel_lb_addr in) +{ + struct lb_addr out; + + out.logicalBlockNum = cpu_to_le32(in.logicalBlockNum); + out.partitionReferenceNum = cpu_to_le16(in.partitionReferenceNum); + + return out; +} + +static inline struct short_ad lesa_to_cpu(struct short_ad in) +{ + struct short_ad out; + + out.extLength = le32_to_cpu(in.extLength); + out.extPosition = le32_to_cpu(in.extPosition); + + return out; +} + +static inline struct short_ad cpu_to_lesa(struct short_ad in) +{ + struct short_ad out; + + out.extLength = cpu_to_le32(in.extLength); + out.extPosition = cpu_to_le32(in.extPosition); + + return out; +} + +static inline struct kernel_long_ad lela_to_cpu(struct long_ad in) +{ + struct kernel_long_ad out; + + out.extLength = le32_to_cpu(in.extLength); + out.extLocation = lelb_to_cpu(in.extLocation); + + return out; +} + +static inline struct long_ad cpu_to_lela(struct kernel_long_ad in) +{ + struct long_ad out; + + out.extLength = cpu_to_le32(in.extLength); + out.extLocation = cpu_to_lelb(in.extLocation); + + return out; +} + +static inline struct kernel_extent_ad leea_to_cpu(struct extent_ad in) +{ + struct kernel_extent_ad out; + + out.extLength = le32_to_cpu(in.extLength); + out.extLocation = le32_to_cpu(in.extLocation); + + return out; +} + +#endif /* __UDF_ENDIAN_H */ diff --git a/vendor/linux/fs/udf/udftime.c b/vendor/linux/fs/udf/udftime.c new file mode 100644 index 0000000..77c331f --- /dev/null +++ b/vendor/linux/fs/udf/udftime.c @@ -0,0 +1,170 @@ +/* Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Paul Eggert (eggert@twinsun.com). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* + * dgb 10/02/98: ripped this from glibc source to help convert timestamps + * to unix time + * 10/04/98: added new table-based lookup after seeing how ugly + * the gnu code is + * blf 09/27/99: ripped out all the old code and inserted new table from + * John Brockmeyer (without leap second corrections) + * rewrote udf_stamp_to_time and fixed timezone accounting in + * udf_time_to_stamp. + */ + +/* + * We don't take into account leap seconds. This may be correct or incorrect. + * For more NIST information (especially dealing with leap seconds), see: + * http://www.boulder.nist.gov/timefreq/pubs/bulletin/leapsecond.htm + */ + +#include "udfdecl.h" + +#include +#include + +#define EPOCH_YEAR 1970 + +#ifndef __isleap +/* Nonzero if YEAR is a leap year (every 4 years, + except every 100th isn't, and every 400th is). */ +#define __isleap(year) \ + ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) +#endif + +/* How many days come before each month (0-12). */ +static const unsigned short int __mon_yday[2][13] = { + /* Normal years. */ + {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}, + /* Leap years. */ + {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366} +}; + +#define MAX_YEAR_SECONDS 69 +#define SPD 0x15180 /*3600*24 */ +#define SPY(y, l, s) (SPD * (365 * y + l) + s) + +static time_t year_seconds[MAX_YEAR_SECONDS] = { +/*1970*/ SPY(0, 0, 0), SPY(1, 0, 0), SPY(2, 0, 0), SPY(3, 1, 0), +/*1974*/ SPY(4, 1, 0), SPY(5, 1, 0), SPY(6, 1, 0), SPY(7, 2, 0), +/*1978*/ SPY(8, 2, 0), SPY(9, 2, 0), SPY(10, 2, 0), SPY(11, 3, 0), +/*1982*/ SPY(12, 3, 0), SPY(13, 3, 0), SPY(14, 3, 0), SPY(15, 4, 0), +/*1986*/ SPY(16, 4, 0), SPY(17, 4, 0), SPY(18, 4, 0), SPY(19, 5, 0), +/*1990*/ SPY(20, 5, 0), SPY(21, 5, 0), SPY(22, 5, 0), SPY(23, 6, 0), +/*1994*/ SPY(24, 6, 0), SPY(25, 6, 0), SPY(26, 6, 0), SPY(27, 7, 0), +/*1998*/ SPY(28, 7, 0), SPY(29, 7, 0), SPY(30, 7, 0), SPY(31, 8, 0), +/*2002*/ SPY(32, 8, 0), SPY(33, 8, 0), SPY(34, 8, 0), SPY(35, 9, 0), +/*2006*/ SPY(36, 9, 0), SPY(37, 9, 0), SPY(38, 9, 0), SPY(39, 10, 0), +/*2010*/ SPY(40, 10, 0), SPY(41, 10, 0), SPY(42, 10, 0), SPY(43, 11, 0), +/*2014*/ SPY(44, 11, 0), SPY(45, 11, 0), SPY(46, 11, 0), SPY(47, 12, 0), +/*2018*/ SPY(48, 12, 0), SPY(49, 12, 0), SPY(50, 12, 0), SPY(51, 13, 0), +/*2022*/ SPY(52, 13, 0), SPY(53, 13, 0), SPY(54, 13, 0), SPY(55, 14, 0), +/*2026*/ SPY(56, 14, 0), SPY(57, 14, 0), SPY(58, 14, 0), SPY(59, 15, 0), +/*2030*/ SPY(60, 15, 0), SPY(61, 15, 0), SPY(62, 15, 0), SPY(63, 16, 0), +/*2034*/ SPY(64, 16, 0), SPY(65, 16, 0), SPY(66, 16, 0), SPY(67, 17, 0), +/*2038*/ SPY(68, 17, 0) +}; + +#define SECS_PER_HOUR (60 * 60) +#define SECS_PER_DAY (SECS_PER_HOUR * 24) + +struct timespec * +udf_disk_stamp_to_time(struct timespec *dest, struct timestamp src) +{ + int yday; + u16 typeAndTimezone = le16_to_cpu(src.typeAndTimezone); + u16 year = le16_to_cpu(src.year); + uint8_t type = typeAndTimezone >> 12; + int16_t offset; + + if (type == 1) { + offset = typeAndTimezone << 4; + /* sign extent offset */ + offset = (offset >> 4); + if (offset == -2047) /* unspecified offset */ + offset = 0; + } else + offset = 0; + + if ((year < EPOCH_YEAR) || + (year >= EPOCH_YEAR + MAX_YEAR_SECONDS)) { + return NULL; + } + dest->tv_sec = year_seconds[year - EPOCH_YEAR]; + dest->tv_sec -= offset * 60; + + yday = ((__mon_yday[__isleap(year)][src.month - 1]) + src.day - 1); + dest->tv_sec += (((yday * 24) + src.hour) * 60 + src.minute) * 60 + src.second; + dest->tv_nsec = 1000 * (src.centiseconds * 10000 + + src.hundredsOfMicroseconds * 100 + src.microseconds); + return dest; +} + +struct timestamp * +udf_time_to_disk_stamp(struct timestamp *dest, struct timespec ts) +{ + long int days, rem, y; + const unsigned short int *ip; + int16_t offset; + + offset = -sys_tz.tz_minuteswest; + + if (!dest) + return NULL; + + dest->typeAndTimezone = cpu_to_le16(0x1000 | (offset & 0x0FFF)); + + ts.tv_sec += offset * 60; + days = ts.tv_sec / SECS_PER_DAY; + rem = ts.tv_sec % SECS_PER_DAY; + dest->hour = rem / SECS_PER_HOUR; + rem %= SECS_PER_HOUR; + dest->minute = rem / 60; + dest->second = rem % 60; + y = 1970; + +#define DIV(a, b) ((a) / (b) - ((a) % (b) < 0)) +#define LEAPS_THRU_END_OF(y) (DIV (y, 4) - DIV (y, 100) + DIV (y, 400)) + + while (days < 0 || days >= (__isleap(y) ? 366 : 365)) { + long int yg = y + days / 365 - (days % 365 < 0); + + /* Adjust DAYS and Y to match the guessed year. */ + days -= ((yg - y) * 365 + + LEAPS_THRU_END_OF(yg - 1) + - LEAPS_THRU_END_OF(y - 1)); + y = yg; + } + dest->year = cpu_to_le16(y); + ip = __mon_yday[__isleap(y)]; + for (y = 11; days < (long int)ip[y]; --y) + continue; + days -= ip[y]; + dest->month = y + 1; + dest->day = days + 1; + + dest->centiseconds = ts.tv_nsec / 10000000; + dest->hundredsOfMicroseconds = (ts.tv_nsec / 1000 - + dest->centiseconds * 10000) / 100; + dest->microseconds = (ts.tv_nsec / 1000 - dest->centiseconds * 10000 - + dest->hundredsOfMicroseconds * 100); + return dest; +} + +/* EOF */ diff --git a/vendor/linux/fs/udf/unicode.c b/vendor/linux/fs/udf/unicode.c new file mode 100644 index 0000000..695389a --- /dev/null +++ b/vendor/linux/fs/udf/unicode.c @@ -0,0 +1,396 @@ +/* + * unicode.c + * + * PURPOSE + * Routines for converting between UTF-8 and OSTA Compressed Unicode. + * Also handles filename mangling + * + * DESCRIPTION + * OSTA Compressed Unicode is explained in the OSTA UDF specification. + * http://www.osta.org/ + * UTF-8 is explained in the IETF RFC XXXX. + * ftp://ftp.internic.net/rfc/rfcxxxx.txt + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + */ + +#include "udfdecl.h" + +#include +#include /* for memset */ +#include +#include +#include + +#include "udf_sb.h" + +static int udf_uni2char_utf8(wchar_t uni, + unsigned char *out, + int boundlen) +{ + int u_len = 0; + + if (boundlen <= 0) + return -ENAMETOOLONG; + + if (uni < 0x80) { + out[u_len++] = (unsigned char)uni; + } else if (uni < 0x800) { + if (boundlen < 2) + return -ENAMETOOLONG; + out[u_len++] = (unsigned char)(0xc0 | (uni >> 6)); + out[u_len++] = (unsigned char)(0x80 | (uni & 0x3f)); + } else { + if (boundlen < 3) + return -ENAMETOOLONG; + out[u_len++] = (unsigned char)(0xe0 | (uni >> 12)); + out[u_len++] = (unsigned char)(0x80 | ((uni >> 6) & 0x3f)); + out[u_len++] = (unsigned char)(0x80 | (uni & 0x3f)); + } + return u_len; +} + +static int udf_char2uni_utf8(const unsigned char *in, + int boundlen, + wchar_t *uni) +{ + unsigned int utf_char; + unsigned char c; + int utf_cnt, u_len; + + utf_char = 0; + utf_cnt = 0; + for (u_len = 0; u_len < boundlen;) { + c = in[u_len++]; + + /* Complete a multi-byte UTF-8 character */ + if (utf_cnt) { + utf_char = (utf_char << 6) | (c & 0x3f); + if (--utf_cnt) + continue; + } else { + /* Check for a multi-byte UTF-8 character */ + if (c & 0x80) { + /* Start a multi-byte UTF-8 character */ + if ((c & 0xe0) == 0xc0) { + utf_char = c & 0x1f; + utf_cnt = 1; + } else if ((c & 0xf0) == 0xe0) { + utf_char = c & 0x0f; + utf_cnt = 2; + } else if ((c & 0xf8) == 0xf0) { + utf_char = c & 0x07; + utf_cnt = 3; + } else if ((c & 0xfc) == 0xf8) { + utf_char = c & 0x03; + utf_cnt = 4; + } else if ((c & 0xfe) == 0xfc) { + utf_char = c & 0x01; + utf_cnt = 5; + } else { + utf_cnt = -1; + break; + } + continue; + } else { + /* Single byte UTF-8 character (most common) */ + utf_char = c; + } + } + *uni = utf_char; + break; + } + if (utf_cnt) { + *uni = '?'; + return -EINVAL; + } + return u_len; +} + +#define ILLEGAL_CHAR_MARK '_' +#define EXT_MARK '.' +#define CRC_MARK '#' +#define EXT_SIZE 5 +/* Number of chars we need to store generated CRC to make filename unique */ +#define CRC_LEN 5 + +static int udf_name_conv_char(uint8_t *str_o, int str_o_max_len, + int *str_o_idx, + const uint8_t *str_i, int str_i_max_len, + int *str_i_idx, + int u_ch, int *needsCRC, + int (*conv_f)(wchar_t, unsigned char *, int), + int translate) +{ + uint32_t c; + int illChar = 0; + int len, gotch = 0; + + for (; (!gotch) && (*str_i_idx < str_i_max_len); *str_i_idx += u_ch) { + if (*str_o_idx >= str_o_max_len) { + *needsCRC = 1; + return gotch; + } + + /* Expand OSTA compressed Unicode to Unicode */ + c = str_i[*str_i_idx]; + if (u_ch > 1) + c = (c << 8) | str_i[*str_i_idx + 1]; + + if (translate && (c == '/' || c == 0)) + illChar = 1; + else if (illChar) + break; + else + gotch = 1; + } + if (illChar) { + *needsCRC = 1; + c = ILLEGAL_CHAR_MARK; + gotch = 1; + } + if (gotch) { + len = conv_f(c, &str_o[*str_o_idx], str_o_max_len - *str_o_idx); + /* Valid character? */ + if (len >= 0) + *str_o_idx += len; + else if (len == -ENAMETOOLONG) { + *needsCRC = 1; + gotch = 0; + } else { + str_o[(*str_o_idx)++] = '?'; + *needsCRC = 1; + } + } + return gotch; +} + +static int udf_name_from_CS0(uint8_t *str_o, int str_max_len, + const uint8_t *ocu, int ocu_len, + int (*conv_f)(wchar_t, unsigned char *, int), + int translate) +{ + uint32_t c; + uint8_t cmp_id; + int idx, len; + int u_ch; + int needsCRC = 0; + int ext_i_len, ext_max_len; + int str_o_len = 0; /* Length of resulting output */ + int ext_o_len = 0; /* Extension output length */ + int ext_crc_len = 0; /* Extension output length if used with CRC */ + int i_ext = -1; /* Extension position in input buffer */ + int o_crc = 0; /* Rightmost possible output pos for CRC+ext */ + unsigned short valueCRC; + uint8_t ext[EXT_SIZE * NLS_MAX_CHARSET_SIZE + 1]; + uint8_t crc[CRC_LEN]; + + if (str_max_len <= 0) + return 0; + + if (ocu_len == 0) { + memset(str_o, 0, str_max_len); + return 0; + } + + cmp_id = ocu[0]; + if (cmp_id != 8 && cmp_id != 16) { + memset(str_o, 0, str_max_len); + pr_err("unknown compression code (%d)\n", cmp_id); + return -EINVAL; + } + u_ch = cmp_id >> 3; + + ocu++; + ocu_len--; + + if (ocu_len % u_ch) { + pr_err("incorrect filename length (%d)\n", ocu_len + 1); + return -EINVAL; + } + + if (translate) { + /* Look for extension */ + for (idx = ocu_len - u_ch, ext_i_len = 0; + (idx >= 0) && (ext_i_len < EXT_SIZE); + idx -= u_ch, ext_i_len++) { + c = ocu[idx]; + if (u_ch > 1) + c = (c << 8) | ocu[idx + 1]; + + if (c == EXT_MARK) { + if (ext_i_len) + i_ext = idx; + break; + } + } + if (i_ext >= 0) { + /* Convert extension */ + ext_max_len = min_t(int, sizeof(ext), str_max_len); + ext[ext_o_len++] = EXT_MARK; + idx = i_ext + u_ch; + while (udf_name_conv_char(ext, ext_max_len, &ext_o_len, + ocu, ocu_len, &idx, + u_ch, &needsCRC, + conv_f, translate)) { + if ((ext_o_len + CRC_LEN) < str_max_len) + ext_crc_len = ext_o_len; + } + } + } + + idx = 0; + while (1) { + if (translate && (idx == i_ext)) { + if (str_o_len > (str_max_len - ext_o_len)) + needsCRC = 1; + break; + } + + if (!udf_name_conv_char(str_o, str_max_len, &str_o_len, + ocu, ocu_len, &idx, + u_ch, &needsCRC, conv_f, translate)) + break; + + if (translate && + (str_o_len <= (str_max_len - ext_o_len - CRC_LEN))) + o_crc = str_o_len; + } + + if (translate) { + if (str_o_len <= 2 && str_o[0] == '.' && + (str_o_len == 1 || str_o[1] == '.')) + needsCRC = 1; + if (needsCRC) { + str_o_len = o_crc; + valueCRC = crc_itu_t(0, ocu, ocu_len); + crc[0] = CRC_MARK; + crc[1] = hex_asc_upper_hi(valueCRC >> 8); + crc[2] = hex_asc_upper_lo(valueCRC >> 8); + crc[3] = hex_asc_upper_hi(valueCRC); + crc[4] = hex_asc_upper_lo(valueCRC); + len = min_t(int, CRC_LEN, str_max_len - str_o_len); + memcpy(&str_o[str_o_len], crc, len); + str_o_len += len; + ext_o_len = ext_crc_len; + } + if (ext_o_len > 0) { + memcpy(&str_o[str_o_len], ext, ext_o_len); + str_o_len += ext_o_len; + } + } + + return str_o_len; +} + +static int udf_name_to_CS0(uint8_t *ocu, int ocu_max_len, + const uint8_t *str_i, int str_len, + int (*conv_f)(const unsigned char *, int, wchar_t *)) +{ + int i, len; + unsigned int max_val; + wchar_t uni_char; + int u_len, u_ch; + + if (ocu_max_len <= 0) + return 0; + + memset(ocu, 0, ocu_max_len); + ocu[0] = 8; + max_val = 0xff; + u_ch = 1; + +try_again: + u_len = 1; + for (i = 0; i < str_len; i++) { + /* Name didn't fit? */ + if (u_len + u_ch > ocu_max_len) + return 0; + len = conv_f(&str_i[i], str_len - i, &uni_char); + if (!len) + continue; + /* Invalid character, deal with it */ + if (len < 0) { + len = 1; + uni_char = '?'; + } + + if (uni_char > max_val) { + max_val = 0xffff; + ocu[0] = 0x10; + u_ch = 2; + goto try_again; + } + + if (max_val == 0xffff) + ocu[u_len++] = (uint8_t)(uni_char >> 8); + ocu[u_len++] = (uint8_t)(uni_char & 0xff); + i += len - 1; + } + + return u_len; +} + +int udf_dstrCS0toUTF8(uint8_t *utf_o, int o_len, + const uint8_t *ocu_i, int i_len) +{ + int s_len = 0; + + if (i_len > 0) { + s_len = ocu_i[i_len - 1]; + if (s_len >= i_len) { + pr_err("incorrect dstring lengths (%d/%d)\n", + s_len, i_len); + return -EINVAL; + } + } + + return udf_name_from_CS0(utf_o, o_len, ocu_i, s_len, + udf_uni2char_utf8, 0); +} + +int udf_get_filename(struct super_block *sb, const uint8_t *sname, int slen, + uint8_t *dname, int dlen) +{ + int (*conv_f)(wchar_t, unsigned char *, int); + int ret; + + if (!slen) + return -EIO; + + if (dlen <= 0) + return 0; + + if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { + conv_f = udf_uni2char_utf8; + } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) { + conv_f = UDF_SB(sb)->s_nls_map->uni2char; + } else + BUG(); + + ret = udf_name_from_CS0(dname, dlen, sname, slen, conv_f, 1); + /* Zero length filename isn't valid... */ + if (ret == 0) + ret = -EINVAL; + return ret; +} + +int udf_put_filename(struct super_block *sb, const uint8_t *sname, int slen, + uint8_t *dname, int dlen) +{ + int (*conv_f)(const unsigned char *, int, wchar_t *); + + if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { + conv_f = udf_char2uni_utf8; + } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) { + conv_f = UDF_SB(sb)->s_nls_map->char2uni; + } else + BUG(); + + return udf_name_to_CS0(dname, dlen, sname, slen, conv_f); +} + diff --git a/vendor/linux/include/linux/crc-itu-t.h b/vendor/linux/include/linux/crc-itu-t.h new file mode 100644 index 0000000..a9953c7 --- /dev/null +++ b/vendor/linux/include/linux/crc-itu-t.h @@ -0,0 +1,28 @@ +/* + * crc-itu-t.h - CRC ITU-T V.41 routine + * + * Implements the standard CRC ITU-T V.41: + * Width 16 + * Poly 0x1021 (x^16 + x^12 + x^15 + 1) + * Init 0 + * + * This source code is licensed under the GNU General Public License, + * Version 2. See the file COPYING for more details. + */ + +#ifndef CRC_ITU_T_H +#define CRC_ITU_T_H + +#include + +extern u16 const crc_itu_t_table[256]; + +extern u16 crc_itu_t(u16 crc, const u8 *buffer, size_t len); + +static inline u16 crc_itu_t_byte(u16 crc, const u8 data) +{ + return (crc << 8) ^ crc_itu_t_table[((crc >> 8) ^ data) & 0xff]; +} + +#endif /* CRC_ITU_T_H */ + diff --git a/vendor/linux/include/uapi/linux/iso_fs.h b/vendor/linux/include/uapi/linux/iso_fs.h new file mode 100644 index 0000000..4688ac4 --- /dev/null +++ b/vendor/linux/include/uapi/linux/iso_fs.h @@ -0,0 +1,165 @@ +#ifndef _ISOFS_FS_H +#define _ISOFS_FS_H + +#include +#include + +/* + * The isofs filesystem constants/structures + */ + +/* This part borrowed from the bsd386 isofs */ +#define ISODCL(from, to) (to - from + 1) + +struct iso_volume_descriptor { + char type[ISODCL(1,1)]; /* 711 */ + char id[ISODCL(2,6)]; + char version[ISODCL(7,7)]; + char data[ISODCL(8,2048)]; +}; + +/* volume descriptor types */ +#define ISO_VD_PRIMARY 1 +#define ISO_VD_SUPPLEMENTARY 2 +#define ISO_VD_END 255 + +#define ISO_STANDARD_ID "CD001" + +struct iso_primary_descriptor { + char type [ISODCL ( 1, 1)]; /* 711 */ + char id [ISODCL ( 2, 6)]; + char version [ISODCL ( 7, 7)]; /* 711 */ + char unused1 [ISODCL ( 8, 8)]; + char system_id [ISODCL ( 9, 40)]; /* achars */ + char volume_id [ISODCL ( 41, 72)]; /* dchars */ + char unused2 [ISODCL ( 73, 80)]; + char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ + char unused3 [ISODCL ( 89, 120)]; + char volume_set_size [ISODCL (121, 124)]; /* 723 */ + char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ + char logical_block_size [ISODCL (129, 132)]; /* 723 */ + char path_table_size [ISODCL (133, 140)]; /* 733 */ + char type_l_path_table [ISODCL (141, 144)]; /* 731 */ + char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ + char type_m_path_table [ISODCL (149, 152)]; /* 732 */ + char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ + char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ + char volume_set_id [ISODCL (191, 318)]; /* dchars */ + char publisher_id [ISODCL (319, 446)]; /* achars */ + char preparer_id [ISODCL (447, 574)]; /* achars */ + char application_id [ISODCL (575, 702)]; /* achars */ + char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ + char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ + char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ + char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ + char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ + char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ + char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ + char file_structure_version [ISODCL (882, 882)]; /* 711 */ + char unused4 [ISODCL (883, 883)]; + char application_data [ISODCL (884, 1395)]; + char unused5 [ISODCL (1396, 2048)]; +}; + +/* Almost the same as the primary descriptor but two fields are specified */ +struct iso_supplementary_descriptor { + char type [ISODCL ( 1, 1)]; /* 711 */ + char id [ISODCL ( 2, 6)]; + char version [ISODCL ( 7, 7)]; /* 711 */ + char flags [ISODCL ( 8, 8)]; /* 853 */ + char system_id [ISODCL ( 9, 40)]; /* achars */ + char volume_id [ISODCL ( 41, 72)]; /* dchars */ + char unused2 [ISODCL ( 73, 80)]; + char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ + char escape [ISODCL ( 89, 120)]; /* 856 */ + char volume_set_size [ISODCL (121, 124)]; /* 723 */ + char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ + char logical_block_size [ISODCL (129, 132)]; /* 723 */ + char path_table_size [ISODCL (133, 140)]; /* 733 */ + char type_l_path_table [ISODCL (141, 144)]; /* 731 */ + char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ + char type_m_path_table [ISODCL (149, 152)]; /* 732 */ + char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ + char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ + char volume_set_id [ISODCL (191, 318)]; /* dchars */ + char publisher_id [ISODCL (319, 446)]; /* achars */ + char preparer_id [ISODCL (447, 574)]; /* achars */ + char application_id [ISODCL (575, 702)]; /* achars */ + char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ + char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ + char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ + char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ + char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ + char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ + char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ + char file_structure_version [ISODCL (882, 882)]; /* 711 */ + char unused4 [ISODCL (883, 883)]; + char application_data [ISODCL (884, 1395)]; + char unused5 [ISODCL (1396, 2048)]; +}; + + +#define HS_STANDARD_ID "CDROM" + +struct hs_volume_descriptor { + char foo [ISODCL ( 1, 8)]; /* 733 */ + char type [ISODCL ( 9, 9)]; /* 711 */ + char id [ISODCL ( 10, 14)]; + char version [ISODCL ( 15, 15)]; /* 711 */ + char data[ISODCL(16,2048)]; +}; + + +struct hs_primary_descriptor { + char foo [ISODCL ( 1, 8)]; /* 733 */ + char type [ISODCL ( 9, 9)]; /* 711 */ + char id [ISODCL ( 10, 14)]; + char version [ISODCL ( 15, 15)]; /* 711 */ + char unused1 [ISODCL ( 16, 16)]; /* 711 */ + char system_id [ISODCL ( 17, 48)]; /* achars */ + char volume_id [ISODCL ( 49, 80)]; /* dchars */ + char unused2 [ISODCL ( 81, 88)]; /* 733 */ + char volume_space_size [ISODCL ( 89, 96)]; /* 733 */ + char unused3 [ISODCL ( 97, 128)]; /* 733 */ + char volume_set_size [ISODCL (129, 132)]; /* 723 */ + char volume_sequence_number [ISODCL (133, 136)]; /* 723 */ + char logical_block_size [ISODCL (137, 140)]; /* 723 */ + char path_table_size [ISODCL (141, 148)]; /* 733 */ + char type_l_path_table [ISODCL (149, 152)]; /* 731 */ + char unused4 [ISODCL (153, 180)]; /* 733 */ + char root_directory_record [ISODCL (181, 214)]; /* 9.1 */ +}; + +/* We use this to help us look up the parent inode numbers. */ + +struct iso_path_table{ + unsigned char name_len[2]; /* 721 */ + char extent[4]; /* 731 */ + char parent[2]; /* 721 */ + char name[0]; +} __attribute__((packed)); + +/* high sierra is identical to iso, except that the date is only 6 bytes, and + there is an extra reserved byte after the flags */ + +struct iso_directory_record { + char length [ISODCL (1, 1)]; /* 711 */ + char ext_attr_length [ISODCL (2, 2)]; /* 711 */ + char extent [ISODCL (3, 10)]; /* 733 */ + char size [ISODCL (11, 18)]; /* 733 */ + char date [ISODCL (19, 25)]; /* 7 by 711 */ + char flags [ISODCL (26, 26)]; + char file_unit_size [ISODCL (27, 27)]; /* 711 */ + char interleave [ISODCL (28, 28)]; /* 711 */ + char volume_sequence_number [ISODCL (29, 32)]; /* 723 */ + unsigned char name_len [ISODCL (33, 33)]; /* 711 */ + char name [0]; +} __attribute__((packed)); + +#define ISOFS_BLOCK_BITS 11 +#define ISOFS_BLOCK_SIZE 2048 + +#define ISOFS_BUFFER_SIZE(INODE) ((INODE)->i_sb->s_blocksize) +#define ISOFS_BUFFER_BITS(INODE) ((INODE)->i_sb->s_blocksize_bits) + +#endif /* _ISOFS_FS_H */ diff --git a/vendor/linux/include/uapi/linux/udf_fs_i.h b/vendor/linux/include/uapi/linux/udf_fs_i.h new file mode 100644 index 0000000..3536965 --- /dev/null +++ b/vendor/linux/include/uapi/linux/udf_fs_i.h @@ -0,0 +1,21 @@ +/* + * udf_fs_i.h + * + * This file is intended for the Linux kernel/module. + * + * COPYRIGHT + * This file is distributed under the terms of the GNU General Public + * License (GPL). Copies of the GPL can be obtained from: + * ftp://prep.ai.mit.edu/pub/gnu/GPL + * Each contributing author retains all rights to their own work. + */ +#ifndef _UDF_FS_I_H +#define _UDF_FS_I_H 1 + +/* exported IOCTLs, we have 'l', 0x40-0x7f */ +#define UDF_GETEASIZE _IOR('l', 0x40, int) +#define UDF_GETEABLOCK _IOR('l', 0x41, void *) +#define UDF_GETVOLIDENT _IOR('l', 0x42, void *) +#define UDF_RELOCATE_BLOCKS _IOWR('l', 0x43, long) + +#endif /* _UDF_FS_I_H */ diff --git a/vendor/linux/lib/crc-itu-t.c b/vendor/linux/lib/crc-itu-t.c new file mode 100644 index 0000000..b3219d0 --- /dev/null +++ b/vendor/linux/lib/crc-itu-t.c @@ -0,0 +1,69 @@ +/* + * crc-itu-t.c + * + * This source code is licensed under the GNU General Public License, + * Version 2. See the file COPYING for more details. + */ + +#include +#include +#include + +/** CRC table for the CRC ITU-T V.41 0x1021 (x^16 + x^12 + x^15 + 1) */ +const u16 crc_itu_t_table[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 +}; + +EXPORT_SYMBOL(crc_itu_t_table); + +/** + * crc_itu_t - Compute the CRC-ITU-T for the data buffer + * + * @crc: previous CRC value + * @buffer: data pointer + * @len: number of bytes in the buffer + * + * Returns the updated CRC value + */ +u16 crc_itu_t(u16 crc, const u8 *buffer, size_t len) +{ + while (len--) + crc = crc_itu_t_byte(crc, *buffer++); + return crc; +} +EXPORT_SYMBOL(crc_itu_t); + +MODULE_DESCRIPTION("CRC ITU-T V.41 calculations"); +MODULE_LICENSE("GPL"); + diff --git a/vendor/linux/net/ipv4/tcp_bbr.c b/vendor/linux/net/ipv4/tcp_bbr.c new file mode 100644 index 0000000..0ea66c2 --- /dev/null +++ b/vendor/linux/net/ipv4/tcp_bbr.c @@ -0,0 +1,896 @@ +/* Bottleneck Bandwidth and RTT (BBR) congestion control + * + * BBR congestion control computes the sending rate based on the delivery + * rate (throughput) estimated from ACKs. In a nutshell: + * + * On each ACK, update our model of the network path: + * bottleneck_bandwidth = windowed_max(delivered / elapsed, 10 round trips) + * min_rtt = windowed_min(rtt, 10 seconds) + * pacing_rate = pacing_gain * bottleneck_bandwidth + * cwnd = max(cwnd_gain * bottleneck_bandwidth * min_rtt, 4) + * + * The core algorithm does not react directly to packet losses or delays, + * although BBR may adjust the size of next send per ACK when loss is + * observed, or adjust the sending rate if it estimates there is a + * traffic policer, in order to keep the drop rate reasonable. + * + * BBR is described in detail in: + * "BBR: Congestion-Based Congestion Control", + * Neal Cardwell, Yuchung Cheng, C. Stephen Gunn, Soheil Hassas Yeganeh, + * Van Jacobson. ACM Queue, Vol. 14 No. 5, September-October 2016. + * + * There is a public e-mail list for discussing BBR development and testing: + * https://groups.google.com/forum/#!forum/bbr-dev + * + * NOTE: BBR *must* be used with the fq qdisc ("man tc-fq") with pacing enabled, + * since pacing is integral to the BBR design and implementation. + * BBR without pacing would not function properly, and may incur unnecessary + * high packet loss rates. + */ +#include +#include +#include +#include +#include +#include + +/* Scale factor for rate in pkt/uSec unit to avoid truncation in bandwidth + * estimation. The rate unit ~= (1500 bytes / 1 usec / 2^24) ~= 715 bps. + * This handles bandwidths from 0.06pps (715bps) to 256Mpps (3Tbps) in a u32. + * Since the minimum window is >=4 packets, the lower bound isn't + * an issue. The upper bound isn't an issue with existing technologies. + */ +#define BW_SCALE 24 +#define BW_UNIT (1 << BW_SCALE) + +#define BBR_SCALE 8 /* scaling factor for fractions in BBR (e.g. gains) */ +#define BBR_UNIT (1 << BBR_SCALE) + +/* BBR has the following modes for deciding how fast to send: */ +enum bbr_mode { + BBR_STARTUP, /* ramp up sending rate rapidly to fill pipe */ + BBR_DRAIN, /* drain any queue created during startup */ + BBR_PROBE_BW, /* discover, share bw: pace around estimated bw */ + BBR_PROBE_RTT, /* cut cwnd to min to probe min_rtt */ +}; + +/* BBR congestion control block */ +struct bbr { + u32 min_rtt_us; /* min RTT in min_rtt_win_sec window */ + u32 min_rtt_stamp; /* timestamp of min_rtt_us */ + u32 probe_rtt_done_stamp; /* end time for BBR_PROBE_RTT mode */ + struct minmax bw; /* Max recent delivery rate in pkts/uS << 24 */ + u32 rtt_cnt; /* count of packet-timed rounds elapsed */ + u32 next_rtt_delivered; /* scb->tx.delivered at end of round */ + struct skb_mstamp cycle_mstamp; /* time of this cycle phase start */ + u32 mode:3, /* current bbr_mode in state machine */ + prev_ca_state:3, /* CA state on previous ACK */ + packet_conservation:1, /* use packet conservation? */ + restore_cwnd:1, /* decided to revert cwnd to old value */ + round_start:1, /* start of packet-timed tx->ack round? */ + tso_segs_goal:7, /* segments we want in each skb we send */ + idle_restart:1, /* restarting after idle? */ + probe_rtt_round_done:1, /* a BBR_PROBE_RTT round at 4 pkts? */ + unused:5, + lt_is_sampling:1, /* taking long-term ("LT") samples now? */ + lt_rtt_cnt:7, /* round trips in long-term interval */ + lt_use_bw:1; /* use lt_bw as our bw estimate? */ + u32 lt_bw; /* LT est delivery rate in pkts/uS << 24 */ + u32 lt_last_delivered; /* LT intvl start: tp->delivered */ + u32 lt_last_stamp; /* LT intvl start: tp->delivered_mstamp */ + u32 lt_last_lost; /* LT intvl start: tp->lost */ + u32 pacing_gain:10, /* current gain for setting pacing rate */ + cwnd_gain:10, /* current gain for setting cwnd */ + full_bw_cnt:3, /* number of rounds without large bw gains */ + cycle_idx:3, /* current index in pacing_gain cycle array */ + unused_b:6; + u32 prior_cwnd; /* prior cwnd upon entering loss recovery */ + u32 full_bw; /* recent bw, to estimate if pipe is full */ +}; + +#define CYCLE_LEN 8 /* number of phases in a pacing gain cycle */ + +/* Window length of bw filter (in rounds): */ +static const int bbr_bw_rtts = CYCLE_LEN + 2; +/* Window length of min_rtt filter (in sec): */ +static const u32 bbr_min_rtt_win_sec = 10; +/* Minimum time (in ms) spent at bbr_cwnd_min_target in BBR_PROBE_RTT mode: */ +static const u32 bbr_probe_rtt_mode_ms = 200; +/* Skip TSO below the following bandwidth (bits/sec): */ +static const int bbr_min_tso_rate = 1200000; + +/* We use a high_gain value of 2/ln(2) because it's the smallest pacing gain + * that will allow a smoothly increasing pacing rate that will double each RTT + * and send the same number of packets per RTT that an un-paced, slow-starting + * Reno or CUBIC flow would: + */ +static const int bbr_high_gain = BBR_UNIT * 2885 / 1000 + 1; +/* The pacing gain of 1/high_gain in BBR_DRAIN is calculated to typically drain + * the queue created in BBR_STARTUP in a single round: + */ +static const int bbr_drain_gain = BBR_UNIT * 1000 / 2885; +/* The gain for deriving steady-state cwnd tolerates delayed/stretched ACKs: */ +static const int bbr_cwnd_gain = BBR_UNIT * 2; +/* The pacing_gain values for the PROBE_BW gain cycle, to discover/share bw: */ +static const int bbr_pacing_gain[] = { + BBR_UNIT * 5 / 4, /* probe for more available bw */ + BBR_UNIT * 3 / 4, /* drain queue and/or yield bw to other flows */ + BBR_UNIT, BBR_UNIT, BBR_UNIT, /* cruise at 1.0*bw to utilize pipe, */ + BBR_UNIT, BBR_UNIT, BBR_UNIT /* without creating excess queue... */ +}; +/* Randomize the starting gain cycling phase over N phases: */ +static const u32 bbr_cycle_rand = 7; + +/* Try to keep at least this many packets in flight, if things go smoothly. For + * smooth functioning, a sliding window protocol ACKing every other packet + * needs at least 4 packets in flight: + */ +static const u32 bbr_cwnd_min_target = 4; + +/* To estimate if BBR_STARTUP mode (i.e. high_gain) has filled pipe... */ +/* If bw has increased significantly (1.25x), there may be more bw available: */ +static const u32 bbr_full_bw_thresh = BBR_UNIT * 5 / 4; +/* But after 3 rounds w/o significant bw growth, estimate pipe is full: */ +static const u32 bbr_full_bw_cnt = 3; + +/* "long-term" ("LT") bandwidth estimator parameters... */ +/* The minimum number of rounds in an LT bw sampling interval: */ +static const u32 bbr_lt_intvl_min_rtts = 4; +/* If lost/delivered ratio > 20%, interval is "lossy" and we may be policed: */ +static const u32 bbr_lt_loss_thresh = 50; +/* If 2 intervals have a bw ratio <= 1/8, their bw is "consistent": */ +static const u32 bbr_lt_bw_ratio = BBR_UNIT / 8; +/* If 2 intervals have a bw diff <= 4 Kbit/sec their bw is "consistent": */ +static const u32 bbr_lt_bw_diff = 4000 / 8; +/* If we estimate we're policed, use lt_bw for this many round trips: */ +static const u32 bbr_lt_bw_max_rtts = 48; + +/* Do we estimate that STARTUP filled the pipe? */ +static bool bbr_full_bw_reached(const struct sock *sk) +{ + const struct bbr *bbr = inet_csk_ca(sk); + + return bbr->full_bw_cnt >= bbr_full_bw_cnt; +} + +/* Return the windowed max recent bandwidth sample, in pkts/uS << BW_SCALE. */ +static u32 bbr_max_bw(const struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return minmax_get(&bbr->bw); +} + +/* Return the estimated bandwidth of the path, in pkts/uS << BW_SCALE. */ +static u32 bbr_bw(const struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return bbr->lt_use_bw ? bbr->lt_bw : bbr_max_bw(sk); +} + +/* Return rate in bytes per second, optionally with a gain. + * The order here is chosen carefully to avoid overflow of u64. This should + * work for input rates of up to 2.9Tbit/sec and gain of 2.89x. + */ +static u64 bbr_rate_bytes_per_sec(struct sock *sk, u64 rate, int gain) +{ + rate *= tcp_mss_to_mtu(sk, tcp_sk(sk)->mss_cache); + rate *= gain; + rate >>= BBR_SCALE; + rate *= USEC_PER_SEC; + return rate >> BW_SCALE; +} + +/* Pace using current bw estimate and a gain factor. In order to help drive the + * network toward lower queues while maintaining high utilization and low + * latency, the average pacing rate aims to be slightly (~1%) lower than the + * estimated bandwidth. This is an important aspect of the design. In this + * implementation this slightly lower pacing rate is achieved implicitly by not + * including link-layer headers in the packet size used for the pacing rate. + */ +static void bbr_set_pacing_rate(struct sock *sk, u32 bw, int gain) +{ + struct bbr *bbr = inet_csk_ca(sk); + u64 rate = bw; + + rate = bbr_rate_bytes_per_sec(sk, rate, gain); + rate = min_t(u64, rate, sk->sk_max_pacing_rate); + if (bbr->mode != BBR_STARTUP || rate > sk->sk_pacing_rate) + sk->sk_pacing_rate = rate; +} + +/* Return count of segments we want in the skbs we send, or 0 for default. */ +static u32 bbr_tso_segs_goal(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + return bbr->tso_segs_goal; +} + +static void bbr_set_tso_segs_goal(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 min_segs; + + min_segs = sk->sk_pacing_rate < (bbr_min_tso_rate >> 3) ? 1 : 2; + bbr->tso_segs_goal = min(tcp_tso_autosize(sk, tp->mss_cache, min_segs), + 0x7FU); +} + +/* Save "last known good" cwnd so we can restore it after losses or PROBE_RTT */ +static void bbr_save_cwnd(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + if (bbr->prev_ca_state < TCP_CA_Recovery && bbr->mode != BBR_PROBE_RTT) + bbr->prior_cwnd = tp->snd_cwnd; /* this cwnd is good enough */ + else /* loss recovery or BBR_PROBE_RTT have temporarily cut cwnd */ + bbr->prior_cwnd = max(bbr->prior_cwnd, tp->snd_cwnd); +} + +static void bbr_cwnd_event(struct sock *sk, enum tcp_ca_event event) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + if (event == CA_EVENT_TX_START && tp->app_limited) { + bbr->idle_restart = 1; + /* Avoid pointless buffer overflows: pace at est. bw if we don't + * need more speed (we're restarting from idle and app-limited). + */ + if (bbr->mode == BBR_PROBE_BW) + bbr_set_pacing_rate(sk, bbr_bw(sk), BBR_UNIT); + } +} + +/* Find target cwnd. Right-size the cwnd based on min RTT and the + * estimated bottleneck bandwidth: + * + * cwnd = bw * min_rtt * gain = BDP * gain + * + * The key factor, gain, controls the amount of queue. While a small gain + * builds a smaller queue, it becomes more vulnerable to noise in RTT + * measurements (e.g., delayed ACKs or other ACK compression effects). This + * noise may cause BBR to under-estimate the rate. + * + * To achieve full performance in high-speed paths, we budget enough cwnd to + * fit full-sized skbs in-flight on both end hosts to fully utilize the path: + * - one skb in sending host Qdisc, + * - one skb in sending host TSO/GSO engine + * - one skb being received by receiver host LRO/GRO/delayed-ACK engine + * Don't worry, at low rates (bbr_min_tso_rate) this won't bloat cwnd because + * in such cases tso_segs_goal is 1. The minimum cwnd is 4 packets, + * which allows 2 outstanding 2-packet sequences, to try to keep pipe + * full even with ACK-every-other-packet delayed ACKs. + */ +static u32 bbr_target_cwnd(struct sock *sk, u32 bw, int gain) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 cwnd; + u64 w; + + /* If we've never had a valid RTT sample, cap cwnd at the initial + * default. This should only happen when the connection is not using TCP + * timestamps and has retransmitted all of the SYN/SYNACK/data packets + * ACKed so far. In this case, an RTO can cut cwnd to 1, in which + * case we need to slow-start up toward something safe: TCP_INIT_CWND. + */ + if (unlikely(bbr->min_rtt_us == ~0U)) /* no valid RTT samples yet? */ + return TCP_INIT_CWND; /* be safe: cap at default initial cwnd*/ + + w = (u64)bw * bbr->min_rtt_us; + + /* Apply a gain to the given value, then remove the BW_SCALE shift. */ + cwnd = (((w * gain) >> BBR_SCALE) + BW_UNIT - 1) / BW_UNIT; + + /* Allow enough full-sized skbs in flight to utilize end systems. */ + cwnd += 3 * bbr->tso_segs_goal; + + /* Reduce delayed ACKs by rounding up cwnd to the next even number. */ + cwnd = (cwnd + 1) & ~1U; + + return cwnd; +} + +/* An optimization in BBR to reduce losses: On the first round of recovery, we + * follow the packet conservation principle: send P packets per P packets acked. + * After that, we slow-start and send at most 2*P packets per P packets acked. + * After recovery finishes, or upon undo, we restore the cwnd we had when + * recovery started (capped by the target cwnd based on estimated BDP). + * + * TODO(ycheng/ncardwell): implement a rate-based approach. + */ +static bool bbr_set_cwnd_to_recover_or_restore( + struct sock *sk, const struct rate_sample *rs, u32 acked, u32 *new_cwnd) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u8 prev_state = bbr->prev_ca_state, state = inet_csk(sk)->icsk_ca_state; + u32 cwnd = tp->snd_cwnd; + + /* An ACK for P pkts should release at most 2*P packets. We do this + * in two steps. First, here we deduct the number of lost packets. + * Then, in bbr_set_cwnd() we slow start up toward the target cwnd. + */ + if (rs->losses > 0) + cwnd = max_t(s32, cwnd - rs->losses, 1); + + if (state == TCP_CA_Recovery && prev_state != TCP_CA_Recovery) { + /* Starting 1st round of Recovery, so do packet conservation. */ + bbr->packet_conservation = 1; + bbr->next_rtt_delivered = tp->delivered; /* start round now */ + /* Cut unused cwnd from app behavior, TSQ, or TSO deferral: */ + cwnd = tcp_packets_in_flight(tp) + acked; + } else if (prev_state >= TCP_CA_Recovery && state < TCP_CA_Recovery) { + /* Exiting loss recovery; restore cwnd saved before recovery. */ + bbr->restore_cwnd = 1; + bbr->packet_conservation = 0; + } + bbr->prev_ca_state = state; + + if (bbr->restore_cwnd) { + /* Restore cwnd after exiting loss recovery or PROBE_RTT. */ + cwnd = max(cwnd, bbr->prior_cwnd); + bbr->restore_cwnd = 0; + } + + if (bbr->packet_conservation) { + *new_cwnd = max(cwnd, tcp_packets_in_flight(tp) + acked); + return true; /* yes, using packet conservation */ + } + *new_cwnd = cwnd; + return false; +} + +/* Slow-start up toward target cwnd (if bw estimate is growing, or packet loss + * has drawn us down below target), or snap down to target if we're above it. + */ +static void bbr_set_cwnd(struct sock *sk, const struct rate_sample *rs, + u32 acked, u32 bw, int gain) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 cwnd = 0, target_cwnd = 0; + + if (!acked) + return; + + if (bbr_set_cwnd_to_recover_or_restore(sk, rs, acked, &cwnd)) + goto done; + + /* If we're below target cwnd, slow start cwnd toward target cwnd. */ + target_cwnd = bbr_target_cwnd(sk, bw, gain); + if (bbr_full_bw_reached(sk)) /* only cut cwnd if we filled the pipe */ + cwnd = min(cwnd + acked, target_cwnd); + else if (cwnd < target_cwnd || tp->delivered < TCP_INIT_CWND) + cwnd = cwnd + acked; + cwnd = max(cwnd, bbr_cwnd_min_target); + +done: + tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp); /* apply global cap */ + if (bbr->mode == BBR_PROBE_RTT) /* drain queue, refresh min_rtt */ + tp->snd_cwnd = min(tp->snd_cwnd, bbr_cwnd_min_target); +} + +/* End cycle phase if it's time and/or we hit the phase's in-flight target. */ +static bool bbr_is_next_cycle_phase(struct sock *sk, + const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + bool is_full_length = + skb_mstamp_us_delta(&tp->delivered_mstamp, &bbr->cycle_mstamp) > + bbr->min_rtt_us; + u32 inflight, bw; + + /* The pacing_gain of 1.0 paces at the estimated bw to try to fully + * use the pipe without increasing the queue. + */ + if (bbr->pacing_gain == BBR_UNIT) + return is_full_length; /* just use wall clock time */ + + inflight = rs->prior_in_flight; /* what was in-flight before ACK? */ + bw = bbr_max_bw(sk); + + /* A pacing_gain > 1.0 probes for bw by trying to raise inflight to at + * least pacing_gain*BDP; this may take more than min_rtt if min_rtt is + * small (e.g. on a LAN). We do not persist if packets are lost, since + * a path with small buffers may not hold that much. + */ + if (bbr->pacing_gain > BBR_UNIT) + return is_full_length && + (rs->losses || /* perhaps pacing_gain*BDP won't fit */ + inflight >= bbr_target_cwnd(sk, bw, bbr->pacing_gain)); + + /* A pacing_gain < 1.0 tries to drain extra queue we added if bw + * probing didn't find more bw. If inflight falls to match BDP then we + * estimate queue is drained; persisting would underutilize the pipe. + */ + return is_full_length || + inflight <= bbr_target_cwnd(sk, bw, BBR_UNIT); +} + +static void bbr_advance_cycle_phase(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + bbr->cycle_idx = (bbr->cycle_idx + 1) & (CYCLE_LEN - 1); + bbr->cycle_mstamp = tp->delivered_mstamp; + bbr->pacing_gain = bbr_pacing_gain[bbr->cycle_idx]; +} + +/* Gain cycling: cycle pacing gain to converge to fair share of available bw. */ +static void bbr_update_cycle_phase(struct sock *sk, + const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if ((bbr->mode == BBR_PROBE_BW) && !bbr->lt_use_bw && + bbr_is_next_cycle_phase(sk, rs)) + bbr_advance_cycle_phase(sk); +} + +static void bbr_reset_startup_mode(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->mode = BBR_STARTUP; + bbr->pacing_gain = bbr_high_gain; + bbr->cwnd_gain = bbr_high_gain; +} + +static void bbr_reset_probe_bw_mode(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->mode = BBR_PROBE_BW; + bbr->pacing_gain = BBR_UNIT; + bbr->cwnd_gain = bbr_cwnd_gain; + bbr->cycle_idx = CYCLE_LEN - 1 - prandom_u32_max(bbr_cycle_rand); + bbr_advance_cycle_phase(sk); /* flip to next phase of gain cycle */ +} + +static void bbr_reset_mode(struct sock *sk) +{ + if (!bbr_full_bw_reached(sk)) + bbr_reset_startup_mode(sk); + else + bbr_reset_probe_bw_mode(sk); +} + +/* Start a new long-term sampling interval. */ +static void bbr_reset_lt_bw_sampling_interval(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + + bbr->lt_last_stamp = tp->delivered_mstamp.stamp_jiffies; + bbr->lt_last_delivered = tp->delivered; + bbr->lt_last_lost = tp->lost; + bbr->lt_rtt_cnt = 0; +} + +/* Completely reset long-term bandwidth sampling. */ +static void bbr_reset_lt_bw_sampling(struct sock *sk) +{ + struct bbr *bbr = inet_csk_ca(sk); + + bbr->lt_bw = 0; + bbr->lt_use_bw = 0; + bbr->lt_is_sampling = false; + bbr_reset_lt_bw_sampling_interval(sk); +} + +/* Long-term bw sampling interval is done. Estimate whether we're policed. */ +static void bbr_lt_bw_interval_done(struct sock *sk, u32 bw) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 diff; + + if (bbr->lt_bw) { /* do we have bw from a previous interval? */ + /* Is new bw close to the lt_bw from the previous interval? */ + diff = abs(bw - bbr->lt_bw); + if ((diff * BBR_UNIT <= bbr_lt_bw_ratio * bbr->lt_bw) || + (bbr_rate_bytes_per_sec(sk, diff, BBR_UNIT) <= + bbr_lt_bw_diff)) { + /* All criteria are met; estimate we're policed. */ + bbr->lt_bw = (bw + bbr->lt_bw) >> 1; /* avg 2 intvls */ + bbr->lt_use_bw = 1; + bbr->pacing_gain = BBR_UNIT; /* try to avoid drops */ + bbr->lt_rtt_cnt = 0; + return; + } + } + bbr->lt_bw = bw; + bbr_reset_lt_bw_sampling_interval(sk); +} + +/* Token-bucket traffic policers are common (see "An Internet-Wide Analysis of + * Traffic Policing", SIGCOMM 2016). BBR detects token-bucket policers and + * explicitly models their policed rate, to reduce unnecessary losses. We + * estimate that we're policed if we see 2 consecutive sampling intervals with + * consistent throughput and high packet loss. If we think we're being policed, + * set lt_bw to the "long-term" average delivery rate from those 2 intervals. + */ +static void bbr_lt_bw_sampling(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u32 lost, delivered; + u64 bw; + s32 t; + + if (bbr->lt_use_bw) { /* already using long-term rate, lt_bw? */ + if (bbr->mode == BBR_PROBE_BW && bbr->round_start && + ++bbr->lt_rtt_cnt >= bbr_lt_bw_max_rtts) { + bbr_reset_lt_bw_sampling(sk); /* stop using lt_bw */ + bbr_reset_probe_bw_mode(sk); /* restart gain cycling */ + } + return; + } + + /* Wait for the first loss before sampling, to let the policer exhaust + * its tokens and estimate the steady-state rate allowed by the policer. + * Starting samples earlier includes bursts that over-estimate the bw. + */ + if (!bbr->lt_is_sampling) { + if (!rs->losses) + return; + bbr_reset_lt_bw_sampling_interval(sk); + bbr->lt_is_sampling = true; + } + + /* To avoid underestimates, reset sampling if we run out of data. */ + if (rs->is_app_limited) { + bbr_reset_lt_bw_sampling(sk); + return; + } + + if (bbr->round_start) + bbr->lt_rtt_cnt++; /* count round trips in this interval */ + if (bbr->lt_rtt_cnt < bbr_lt_intvl_min_rtts) + return; /* sampling interval needs to be longer */ + if (bbr->lt_rtt_cnt > 4 * bbr_lt_intvl_min_rtts) { + bbr_reset_lt_bw_sampling(sk); /* interval is too long */ + return; + } + + /* End sampling interval when a packet is lost, so we estimate the + * policer tokens were exhausted. Stopping the sampling before the + * tokens are exhausted under-estimates the policed rate. + */ + if (!rs->losses) + return; + + /* Calculate packets lost and delivered in sampling interval. */ + lost = tp->lost - bbr->lt_last_lost; + delivered = tp->delivered - bbr->lt_last_delivered; + /* Is loss rate (lost/delivered) >= lt_loss_thresh? If not, wait. */ + if (!delivered || (lost << BBR_SCALE) < bbr_lt_loss_thresh * delivered) + return; + + /* Find average delivery rate in this sampling interval. */ + t = (s32)(tp->delivered_mstamp.stamp_jiffies - bbr->lt_last_stamp); + if (t < 1) + return; /* interval is less than one jiffy, so wait */ + t = jiffies_to_usecs(t); + /* Interval long enough for jiffies_to_usecs() to return a bogus 0? */ + if (t < 1) { + bbr_reset_lt_bw_sampling(sk); /* interval too long; reset */ + return; + } + bw = (u64)delivered * BW_UNIT; + do_div(bw, t); + bbr_lt_bw_interval_done(sk, bw); +} + +/* Estimate the bandwidth based on how fast packets are delivered */ +static void bbr_update_bw(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw; + + bbr->round_start = 0; + if (rs->delivered < 0 || rs->interval_us <= 0) + return; /* Not a valid observation */ + + /* See if we've reached the next RTT */ + if (!before(rs->prior_delivered, bbr->next_rtt_delivered)) { + bbr->next_rtt_delivered = tp->delivered; + bbr->rtt_cnt++; + bbr->round_start = 1; + bbr->packet_conservation = 0; + } + + bbr_lt_bw_sampling(sk, rs); + + /* Divide delivered by the interval to find a (lower bound) bottleneck + * bandwidth sample. Delivered is in packets and interval_us in uS and + * ratio will be <<1 for most connections. So delivered is first scaled. + */ + bw = (u64)rs->delivered * BW_UNIT; + do_div(bw, rs->interval_us); + + /* If this sample is application-limited, it is likely to have a very + * low delivered count that represents application behavior rather than + * the available network rate. Such a sample could drag down estimated + * bw, causing needless slow-down. Thus, to continue to send at the + * last measured network rate, we filter out app-limited samples unless + * they describe the path bw at least as well as our bw model. + * + * So the goal during app-limited phase is to proceed with the best + * network rate no matter how long. We automatically leave this + * phase when app writes faster than the network can deliver :) + */ + if (!rs->is_app_limited || bw >= bbr_max_bw(sk)) { + /* Incorporate new sample into our max bw filter. */ + minmax_running_max(&bbr->bw, bbr_bw_rtts, bbr->rtt_cnt, bw); + } +} + +/* Estimate when the pipe is full, using the change in delivery rate: BBR + * estimates that STARTUP filled the pipe if the estimated bw hasn't changed by + * at least bbr_full_bw_thresh (25%) after bbr_full_bw_cnt (3) non-app-limited + * rounds. Why 3 rounds: 1: rwin autotuning grows the rwin, 2: we fill the + * higher rwin, 3: we get higher delivery rate samples. Or transient + * cross-traffic or radio noise can go away. CUBIC Hystart shares a similar + * design goal, but uses delay and inter-ACK spacing instead of bandwidth. + */ +static void bbr_check_full_bw_reached(struct sock *sk, + const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 bw_thresh; + + if (bbr_full_bw_reached(sk) || !bbr->round_start || rs->is_app_limited) + return; + + bw_thresh = (u64)bbr->full_bw * bbr_full_bw_thresh >> BBR_SCALE; + if (bbr_max_bw(sk) >= bw_thresh) { + bbr->full_bw = bbr_max_bw(sk); + bbr->full_bw_cnt = 0; + return; + } + ++bbr->full_bw_cnt; +} + +/* If pipe is probably full, drain the queue and then enter steady-state. */ +static void bbr_check_drain(struct sock *sk, const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if (bbr->mode == BBR_STARTUP && bbr_full_bw_reached(sk)) { + bbr->mode = BBR_DRAIN; /* drain queue we created */ + bbr->pacing_gain = bbr_drain_gain; /* pace slow to drain */ + bbr->cwnd_gain = bbr_high_gain; /* maintain cwnd */ + } /* fall through to check if in-flight is already small: */ + if (bbr->mode == BBR_DRAIN && + tcp_packets_in_flight(tcp_sk(sk)) <= + bbr_target_cwnd(sk, bbr_max_bw(sk), BBR_UNIT)) + bbr_reset_probe_bw_mode(sk); /* we estimate queue is drained */ +} + +/* The goal of PROBE_RTT mode is to have BBR flows cooperatively and + * periodically drain the bottleneck queue, to converge to measure the true + * min_rtt (unloaded propagation delay). This allows the flows to keep queues + * small (reducing queuing delay and packet loss) and achieve fairness among + * BBR flows. + * + * The min_rtt filter window is 10 seconds. When the min_rtt estimate expires, + * we enter PROBE_RTT mode and cap the cwnd at bbr_cwnd_min_target=4 packets. + * After at least bbr_probe_rtt_mode_ms=200ms and at least one packet-timed + * round trip elapsed with that flight size <= 4, we leave PROBE_RTT mode and + * re-enter the previous mode. BBR uses 200ms to approximately bound the + * performance penalty of PROBE_RTT's cwnd capping to roughly 2% (200ms/10s). + * + * Note that flows need only pay 2% if they are busy sending over the last 10 + * seconds. Interactive applications (e.g., Web, RPCs, video chunks) often have + * natural silences or low-rate periods within 10 seconds where the rate is low + * enough for long enough to drain its queue in the bottleneck. We pick up + * these min RTT measurements opportunistically with our min_rtt filter. :-) + */ +static void bbr_update_min_rtt(struct sock *sk, const struct rate_sample *rs) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + bool filter_expired; + + /* Track min RTT seen in the min_rtt_win_sec filter window: */ + filter_expired = after(tcp_time_stamp, + bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ); + if (rs->rtt_us >= 0 && + (rs->rtt_us <= bbr->min_rtt_us || filter_expired)) { + bbr->min_rtt_us = rs->rtt_us; + bbr->min_rtt_stamp = tcp_time_stamp; + } + + if (bbr_probe_rtt_mode_ms > 0 && filter_expired && + !bbr->idle_restart && bbr->mode != BBR_PROBE_RTT) { + bbr->mode = BBR_PROBE_RTT; /* dip, drain queue */ + bbr->pacing_gain = BBR_UNIT; + bbr->cwnd_gain = BBR_UNIT; + bbr_save_cwnd(sk); /* note cwnd so we can restore it */ + bbr->probe_rtt_done_stamp = 0; + } + + if (bbr->mode == BBR_PROBE_RTT) { + /* Ignore low rate samples during this mode. */ + tp->app_limited = + (tp->delivered + tcp_packets_in_flight(tp)) ? : 1; + /* Maintain min packets in flight for max(200 ms, 1 round). */ + if (!bbr->probe_rtt_done_stamp && + tcp_packets_in_flight(tp) <= bbr_cwnd_min_target) { + bbr->probe_rtt_done_stamp = tcp_time_stamp + + msecs_to_jiffies(bbr_probe_rtt_mode_ms); + bbr->probe_rtt_round_done = 0; + bbr->next_rtt_delivered = tp->delivered; + } else if (bbr->probe_rtt_done_stamp) { + if (bbr->round_start) + bbr->probe_rtt_round_done = 1; + if (bbr->probe_rtt_round_done && + after(tcp_time_stamp, bbr->probe_rtt_done_stamp)) { + bbr->min_rtt_stamp = tcp_time_stamp; + bbr->restore_cwnd = 1; /* snap to prior_cwnd */ + bbr_reset_mode(sk); + } + } + } + bbr->idle_restart = 0; +} + +static void bbr_update_model(struct sock *sk, const struct rate_sample *rs) +{ + bbr_update_bw(sk, rs); + bbr_update_cycle_phase(sk, rs); + bbr_check_full_bw_reached(sk, rs); + bbr_check_drain(sk, rs); + bbr_update_min_rtt(sk, rs); +} + +static void bbr_main(struct sock *sk, const struct rate_sample *rs) +{ + struct bbr *bbr = inet_csk_ca(sk); + u32 bw; + + bbr_update_model(sk, rs); + + bw = bbr_bw(sk); + bbr_set_pacing_rate(sk, bw, bbr->pacing_gain); + bbr_set_tso_segs_goal(sk); + bbr_set_cwnd(sk, rs, rs->acked_sacked, bw, bbr->cwnd_gain); +} + +static void bbr_init(struct sock *sk) +{ + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw; + + bbr->prior_cwnd = 0; + bbr->tso_segs_goal = 0; /* default segs per skb until first ACK */ + bbr->rtt_cnt = 0; + bbr->next_rtt_delivered = 0; + bbr->prev_ca_state = TCP_CA_Open; + bbr->packet_conservation = 0; + + bbr->probe_rtt_done_stamp = 0; + bbr->probe_rtt_round_done = 0; + bbr->min_rtt_us = tcp_min_rtt(tp); + bbr->min_rtt_stamp = tcp_time_stamp; + + minmax_reset(&bbr->bw, bbr->rtt_cnt, 0); /* init max bw to 0 */ + + /* Initialize pacing rate to: high_gain * init_cwnd / RTT. */ + bw = (u64)tp->snd_cwnd * BW_UNIT; + do_div(bw, (tp->srtt_us >> 3) ? : USEC_PER_MSEC); + sk->sk_pacing_rate = 0; /* force an update of sk_pacing_rate */ + bbr_set_pacing_rate(sk, bw, bbr_high_gain); + + bbr->restore_cwnd = 0; + bbr->round_start = 0; + bbr->idle_restart = 0; + bbr->full_bw = 0; + bbr->full_bw_cnt = 0; + bbr->cycle_mstamp.v64 = 0; + bbr->cycle_idx = 0; + bbr_reset_lt_bw_sampling(sk); + bbr_reset_startup_mode(sk); +} + +static u32 bbr_sndbuf_expand(struct sock *sk) +{ + /* Provision 3 * cwnd since BBR may slow-start even during recovery. */ + return 3; +} + +/* In theory BBR does not need to undo the cwnd since it does not + * always reduce cwnd on losses (see bbr_main()). Keep it for now. + */ +static u32 bbr_undo_cwnd(struct sock *sk) +{ + return tcp_sk(sk)->snd_cwnd; +} + +/* Entering loss recovery, so save cwnd for when we exit or undo recovery. */ +static u32 bbr_ssthresh(struct sock *sk) +{ + bbr_save_cwnd(sk); + return TCP_INFINITE_SSTHRESH; /* BBR does not use ssthresh */ +} + +static size_t bbr_get_info(struct sock *sk, u32 ext, int *attr, + union tcp_cc_info *info) +{ + if (ext & (1 << (INET_DIAG_BBRINFO - 1)) || + ext & (1 << (INET_DIAG_VEGASINFO - 1))) { + struct tcp_sock *tp = tcp_sk(sk); + struct bbr *bbr = inet_csk_ca(sk); + u64 bw = bbr_bw(sk); + + bw = bw * tp->mss_cache * USEC_PER_SEC >> BW_SCALE; + memset(&info->bbr, 0, sizeof(info->bbr)); + info->bbr.bbr_bw_lo = (u32)bw; + info->bbr.bbr_bw_hi = (u32)(bw >> 32); + info->bbr.bbr_min_rtt = bbr->min_rtt_us; + info->bbr.bbr_pacing_gain = bbr->pacing_gain; + info->bbr.bbr_cwnd_gain = bbr->cwnd_gain; + *attr = INET_DIAG_BBRINFO; + return sizeof(info->bbr); + } + return 0; +} + +static void bbr_set_state(struct sock *sk, u8 new_state) +{ + struct bbr *bbr = inet_csk_ca(sk); + + if (new_state == TCP_CA_Loss) { + struct rate_sample rs = { .losses = 1 }; + + bbr->prev_ca_state = TCP_CA_Loss; + bbr->full_bw = 0; + bbr->round_start = 1; /* treat RTO like end of a round */ + bbr_lt_bw_sampling(sk, &rs); + } +} + +static struct tcp_congestion_ops tcp_bbr_cong_ops __read_mostly = { + .flags = TCP_CONG_NON_RESTRICTED, + .name = "bbr", + .owner = THIS_MODULE, + .init = bbr_init, + .cong_control = bbr_main, + .sndbuf_expand = bbr_sndbuf_expand, + .undo_cwnd = bbr_undo_cwnd, + .cwnd_event = bbr_cwnd_event, + .ssthresh = bbr_ssthresh, + .tso_segs_goal = bbr_tso_segs_goal, + .get_info = bbr_get_info, + .set_state = bbr_set_state, +}; + +static int __init bbr_register(void) +{ + BUILD_BUG_ON(sizeof(struct bbr) > ICSK_CA_PRIV_SIZE); + return tcp_register_congestion_control(&tcp_bbr_cong_ops); +} + +static void __exit bbr_unregister(void) +{ + tcp_unregister_congestion_control(&tcp_bbr_cong_ops); +} + +module_init(bbr_register); +module_exit(bbr_unregister); + +MODULE_AUTHOR("Van Jacobson "); +MODULE_AUTHOR("Neal Cardwell "); +MODULE_AUTHOR("Yuchung Cheng "); +MODULE_AUTHOR("Soheil Hassas Yeganeh "); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_DESCRIPTION("TCP BBR (Bottleneck Bandwidth and RTT)"); diff --git a/vendor/linux/net/sched/sch_api.c b/vendor/linux/net/sched/sch_api.c new file mode 100644 index 0000000..206dc24 --- /dev/null +++ b/vendor/linux/net/sched/sch_api.c @@ -0,0 +1,1998 @@ +/* + * net/sched/sch_api.c Packet scheduler API. + * + * This program 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. + * + * Authors: Alexey Kuznetsov, + * + * Fixes: + * + * Rani Assaf :980802: JIFFIES and CPU clock sources are repaired. + * Eduardo J. Blanco :990222: kmod support + * Jamal Hadi Salim : 990601: ingress support + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +static int qdisc_notify(struct net *net, struct sk_buff *oskb, + struct nlmsghdr *n, u32 clid, + struct Qdisc *old, struct Qdisc *new); +static int tclass_notify(struct net *net, struct sk_buff *oskb, + struct nlmsghdr *n, struct Qdisc *q, + unsigned long cl, int event); + +/* + + Short review. + ------------- + + This file consists of two interrelated parts: + + 1. queueing disciplines manager frontend. + 2. traffic classes manager frontend. + + Generally, queueing discipline ("qdisc") is a black box, + which is able to enqueue packets and to dequeue them (when + device is ready to send something) in order and at times + determined by algorithm hidden in it. + + qdisc's are divided to two categories: + - "queues", which have no internal structure visible from outside. + - "schedulers", which split all the packets to "traffic classes", + using "packet classifiers" (look at cls_api.c) + + In turn, classes may have child qdiscs (as rule, queues) + attached to them etc. etc. etc. + + The goal of the routines in this file is to translate + information supplied by user in the form of handles + to more intelligible for kernel form, to make some sanity + checks and part of work, which is common to all qdiscs + and to provide rtnetlink notifications. + + All real intelligent work is done inside qdisc modules. + + + + Every discipline has two major routines: enqueue and dequeue. + + ---dequeue + + dequeue usually returns a skb to send. It is allowed to return NULL, + but it does not mean that queue is empty, it just means that + discipline does not want to send anything this time. + Queue is really empty if q->q.qlen == 0. + For complicated disciplines with multiple queues q->q is not + real packet queue, but however q->q.qlen must be valid. + + ---enqueue + + enqueue returns 0, if packet was enqueued successfully. + If packet (this one or another one) was dropped, it returns + not zero error code. + NET_XMIT_DROP - this packet dropped + Expected action: do not backoff, but wait until queue will clear. + NET_XMIT_CN - probably this packet enqueued, but another one dropped. + Expected action: backoff or ignore + + Auxiliary routines: + + ---peek + + like dequeue but without removing a packet from the queue + + ---reset + + returns qdisc to initial state: purge all buffers, clear all + timers, counters (except for statistics) etc. + + ---init + + initializes newly created qdisc. + + ---destroy + + destroys resources allocated by init and during lifetime of qdisc. + + ---change + + changes qdisc parameters. + */ + +/* Protects list of registered TC modules. It is pure SMP lock. */ +static DEFINE_RWLOCK(qdisc_mod_lock); + + +/************************************************ + * Queueing disciplines manipulation. * + ************************************************/ + + +/* The list of all installed queueing disciplines. */ + +static struct Qdisc_ops *qdisc_base; + +/* Register/unregister queueing discipline */ + +int register_qdisc(struct Qdisc_ops *qops) +{ + struct Qdisc_ops *q, **qp; + int rc = -EEXIST; + + write_lock(&qdisc_mod_lock); + for (qp = &qdisc_base; (q = *qp) != NULL; qp = &q->next) + if (!strcmp(qops->id, q->id)) + goto out; + + if (qops->enqueue == NULL) + qops->enqueue = noop_qdisc_ops.enqueue; + if (qops->peek == NULL) { + if (qops->dequeue == NULL) + qops->peek = noop_qdisc_ops.peek; + else + goto out_einval; + } + if (qops->dequeue == NULL) + qops->dequeue = noop_qdisc_ops.dequeue; + + if (qops->cl_ops) { + const struct Qdisc_class_ops *cops = qops->cl_ops; + + if (!(cops->get && cops->put && cops->walk && cops->leaf)) + goto out_einval; + + if (cops->tcf_chain && !(cops->bind_tcf && cops->unbind_tcf)) + goto out_einval; + } + + qops->next = NULL; + *qp = qops; + rc = 0; +out: + write_unlock(&qdisc_mod_lock); + return rc; + +out_einval: + rc = -EINVAL; + goto out; +} +EXPORT_SYMBOL(register_qdisc); + +int unregister_qdisc(struct Qdisc_ops *qops) +{ + struct Qdisc_ops *q, **qp; + int err = -ENOENT; + + write_lock(&qdisc_mod_lock); + for (qp = &qdisc_base; (q = *qp) != NULL; qp = &q->next) + if (q == qops) + break; + if (q) { + *qp = q->next; + q->next = NULL; + err = 0; + } + write_unlock(&qdisc_mod_lock); + return err; +} +EXPORT_SYMBOL(unregister_qdisc); + +/* Get default qdisc if not otherwise specified */ +void qdisc_get_default(char *name, size_t len) +{ + read_lock(&qdisc_mod_lock); + strlcpy(name, default_qdisc_ops->id, len); + read_unlock(&qdisc_mod_lock); +} + +static struct Qdisc_ops *qdisc_lookup_default(const char *name) +{ + struct Qdisc_ops *q = NULL; + + for (q = qdisc_base; q; q = q->next) { + if (!strcmp(name, q->id)) { + if (!try_module_get(q->owner)) + q = NULL; + break; + } + } + + return q; +} + +/* Set new default qdisc to use */ +int qdisc_set_default(const char *name) +{ + const struct Qdisc_ops *ops; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + write_lock(&qdisc_mod_lock); + ops = qdisc_lookup_default(name); + if (!ops) { + /* Not found, drop lock and try to load module */ + write_unlock(&qdisc_mod_lock); + request_module("sch_%s", name); + write_lock(&qdisc_mod_lock); + + ops = qdisc_lookup_default(name); + } + + if (ops) { + /* Set new default */ + module_put(default_qdisc_ops->owner); + default_qdisc_ops = ops; + } + write_unlock(&qdisc_mod_lock); + + return ops ? 0 : -ENOENT; +} + +/* We know handle. Find qdisc among all qdisc's attached to device + * (root qdisc, all its children, children of children etc.) + * Note: caller either uses rtnl or rcu_read_lock() + */ + +static struct Qdisc *qdisc_match_from_root(struct Qdisc *root, u32 handle) +{ + struct Qdisc *q; + + if (!qdisc_dev(root)) + return (root->handle == handle ? root : NULL); + + if (!(root->flags & TCQ_F_BUILTIN) && + root->handle == handle) + return root; + + hash_for_each_possible_rcu(qdisc_dev(root)->qdisc_hash, q, hash, handle) { + if (q->handle == handle) + return q; + } + return NULL; +} + +void qdisc_hash_add(struct Qdisc *q) +{ + if ((q->parent != TC_H_ROOT) && !(q->flags & TCQ_F_INGRESS)) { + struct Qdisc *root = qdisc_dev(q)->qdisc; + + WARN_ON_ONCE(root == &noop_qdisc); + ASSERT_RTNL(); + hash_add_rcu(qdisc_dev(q)->qdisc_hash, &q->hash, q->handle); + } +} +EXPORT_SYMBOL(qdisc_hash_add); + +void qdisc_hash_del(struct Qdisc *q) +{ + if ((q->parent != TC_H_ROOT) && !(q->flags & TCQ_F_INGRESS)) { + ASSERT_RTNL(); + hash_del_rcu(&q->hash); + } +} +EXPORT_SYMBOL(qdisc_hash_del); + +struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle) +{ + struct Qdisc *q; + + q = qdisc_match_from_root(dev->qdisc, handle); + if (q) + goto out; + + if (dev_ingress_queue(dev)) + q = qdisc_match_from_root( + dev_ingress_queue(dev)->qdisc_sleeping, + handle); +out: + return q; +} + +static struct Qdisc *qdisc_leaf(struct Qdisc *p, u32 classid) +{ + unsigned long cl; + struct Qdisc *leaf; + const struct Qdisc_class_ops *cops = p->ops->cl_ops; + + if (cops == NULL) + return NULL; + cl = cops->get(p, classid); + + if (cl == 0) + return NULL; + leaf = cops->leaf(p, cl); + cops->put(p, cl); + return leaf; +} + +/* Find queueing discipline by name */ + +static struct Qdisc_ops *qdisc_lookup_ops(struct nlattr *kind) +{ + struct Qdisc_ops *q = NULL; + + if (kind) { + read_lock(&qdisc_mod_lock); + for (q = qdisc_base; q; q = q->next) { + if (nla_strcmp(kind, q->id) == 0) { + if (!try_module_get(q->owner)) + q = NULL; + break; + } + } + read_unlock(&qdisc_mod_lock); + } + return q; +} + +/* The linklayer setting were not transferred from iproute2, in older + * versions, and the rate tables lookup systems have been dropped in + * the kernel. To keep backward compatible with older iproute2 tc + * utils, we detect the linklayer setting by detecting if the rate + * table were modified. + * + * For linklayer ATM table entries, the rate table will be aligned to + * 48 bytes, thus some table entries will contain the same value. The + * mpu (min packet unit) is also encoded into the old rate table, thus + * starting from the mpu, we find low and high table entries for + * mapping this cell. If these entries contain the same value, when + * the rate tables have been modified for linklayer ATM. + * + * This is done by rounding mpu to the nearest 48 bytes cell/entry, + * and then roundup to the next cell, calc the table entry one below, + * and compare. + */ +static __u8 __detect_linklayer(struct tc_ratespec *r, __u32 *rtab) +{ + int low = roundup(r->mpu, 48); + int high = roundup(low+1, 48); + int cell_low = low >> r->cell_log; + int cell_high = (high >> r->cell_log) - 1; + + /* rtab is too inaccurate at rates > 100Mbit/s */ + if ((r->rate > (100000000/8)) || (rtab[0] == 0)) { + pr_debug("TC linklayer: Giving up ATM detection\n"); + return TC_LINKLAYER_ETHERNET; + } + + if ((cell_high > cell_low) && (cell_high < 256) + && (rtab[cell_low] == rtab[cell_high])) { + pr_debug("TC linklayer: Detected ATM, low(%d)=high(%d)=%u\n", + cell_low, cell_high, rtab[cell_high]); + return TC_LINKLAYER_ATM; + } + return TC_LINKLAYER_ETHERNET; +} + +static struct qdisc_rate_table *qdisc_rtab_list; + +struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, + struct nlattr *tab) +{ + struct qdisc_rate_table *rtab; + + if (tab == NULL || r->rate == 0 || r->cell_log == 0 || + nla_len(tab) != TC_RTAB_SIZE) + return NULL; + + for (rtab = qdisc_rtab_list; rtab; rtab = rtab->next) { + if (!memcmp(&rtab->rate, r, sizeof(struct tc_ratespec)) && + !memcmp(&rtab->data, nla_data(tab), 1024)) { + rtab->refcnt++; + return rtab; + } + } + + rtab = kmalloc(sizeof(*rtab), GFP_KERNEL); + if (rtab) { + rtab->rate = *r; + rtab->refcnt = 1; + memcpy(rtab->data, nla_data(tab), 1024); + if (r->linklayer == TC_LINKLAYER_UNAWARE) + r->linklayer = __detect_linklayer(r, rtab->data); + rtab->next = qdisc_rtab_list; + qdisc_rtab_list = rtab; + } + return rtab; +} +EXPORT_SYMBOL(qdisc_get_rtab); + +void qdisc_put_rtab(struct qdisc_rate_table *tab) +{ + struct qdisc_rate_table *rtab, **rtabp; + + if (!tab || --tab->refcnt) + return; + + for (rtabp = &qdisc_rtab_list; + (rtab = *rtabp) != NULL; + rtabp = &rtab->next) { + if (rtab == tab) { + *rtabp = rtab->next; + kfree(rtab); + return; + } + } +} +EXPORT_SYMBOL(qdisc_put_rtab); + +static LIST_HEAD(qdisc_stab_list); +static DEFINE_SPINLOCK(qdisc_stab_lock); + +static const struct nla_policy stab_policy[TCA_STAB_MAX + 1] = { + [TCA_STAB_BASE] = { .len = sizeof(struct tc_sizespec) }, + [TCA_STAB_DATA] = { .type = NLA_BINARY }, +}; + +static struct qdisc_size_table *qdisc_get_stab(struct nlattr *opt) +{ + struct nlattr *tb[TCA_STAB_MAX + 1]; + struct qdisc_size_table *stab; + struct tc_sizespec *s; + unsigned int tsize = 0; + u16 *tab = NULL; + int err; + + err = nla_parse_nested(tb, TCA_STAB_MAX, opt, stab_policy); + if (err < 0) + return ERR_PTR(err); + if (!tb[TCA_STAB_BASE]) + return ERR_PTR(-EINVAL); + + s = nla_data(tb[TCA_STAB_BASE]); + + if (s->tsize > 0) { + if (!tb[TCA_STAB_DATA]) + return ERR_PTR(-EINVAL); + tab = nla_data(tb[TCA_STAB_DATA]); + tsize = nla_len(tb[TCA_STAB_DATA]) / sizeof(u16); + } + + if (tsize != s->tsize || (!tab && tsize > 0)) + return ERR_PTR(-EINVAL); + + spin_lock(&qdisc_stab_lock); + + list_for_each_entry(stab, &qdisc_stab_list, list) { + if (memcmp(&stab->szopts, s, sizeof(*s))) + continue; + if (tsize > 0 && memcmp(stab->data, tab, tsize * sizeof(u16))) + continue; + stab->refcnt++; + spin_unlock(&qdisc_stab_lock); + return stab; + } + + spin_unlock(&qdisc_stab_lock); + + stab = kmalloc(sizeof(*stab) + tsize * sizeof(u16), GFP_KERNEL); + if (!stab) + return ERR_PTR(-ENOMEM); + + stab->refcnt = 1; + stab->szopts = *s; + if (tsize > 0) + memcpy(stab->data, tab, tsize * sizeof(u16)); + + spin_lock(&qdisc_stab_lock); + list_add_tail(&stab->list, &qdisc_stab_list); + spin_unlock(&qdisc_stab_lock); + + return stab; +} + +static void stab_kfree_rcu(struct rcu_head *head) +{ + kfree(container_of(head, struct qdisc_size_table, rcu)); +} + +void qdisc_put_stab(struct qdisc_size_table *tab) +{ + if (!tab) + return; + + spin_lock(&qdisc_stab_lock); + + if (--tab->refcnt == 0) { + list_del(&tab->list); + call_rcu_bh(&tab->rcu, stab_kfree_rcu); + } + + spin_unlock(&qdisc_stab_lock); +} +EXPORT_SYMBOL(qdisc_put_stab); + +static int qdisc_dump_stab(struct sk_buff *skb, struct qdisc_size_table *stab) +{ + struct nlattr *nest; + + nest = nla_nest_start(skb, TCA_STAB); + if (nest == NULL) + goto nla_put_failure; + if (nla_put(skb, TCA_STAB_BASE, sizeof(stab->szopts), &stab->szopts)) + goto nla_put_failure; + nla_nest_end(skb, nest); + + return skb->len; + +nla_put_failure: + return -1; +} + +void __qdisc_calculate_pkt_len(struct sk_buff *skb, + const struct qdisc_size_table *stab) +{ + int pkt_len, slot; + + pkt_len = skb->len + stab->szopts.overhead; + if (unlikely(!stab->szopts.tsize)) + goto out; + + slot = pkt_len + stab->szopts.cell_align; + if (unlikely(slot < 0)) + slot = 0; + + slot >>= stab->szopts.cell_log; + if (likely(slot < stab->szopts.tsize)) + pkt_len = stab->data[slot]; + else + pkt_len = stab->data[stab->szopts.tsize - 1] * + (slot / stab->szopts.tsize) + + stab->data[slot % stab->szopts.tsize]; + + pkt_len <<= stab->szopts.size_log; +out: + if (unlikely(pkt_len < 1)) + pkt_len = 1; + qdisc_skb_cb(skb)->pkt_len = pkt_len; +} +EXPORT_SYMBOL(__qdisc_calculate_pkt_len); + +void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc) +{ + if (!(qdisc->flags & TCQ_F_WARN_NONWC)) { + pr_warn("%s: %s qdisc %X: is non-work-conserving?\n", + txt, qdisc->ops->id, qdisc->handle >> 16); + qdisc->flags |= TCQ_F_WARN_NONWC; + } +} +EXPORT_SYMBOL(qdisc_warn_nonwc); + +static enum hrtimer_restart qdisc_watchdog(struct hrtimer *timer) +{ + struct qdisc_watchdog *wd = container_of(timer, struct qdisc_watchdog, + timer); + + rcu_read_lock(); + __netif_schedule(qdisc_root(wd->qdisc)); + rcu_read_unlock(); + + return HRTIMER_NORESTART; +} + +void qdisc_watchdog_init(struct qdisc_watchdog *wd, struct Qdisc *qdisc) +{ + hrtimer_init(&wd->timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); + wd->timer.function = qdisc_watchdog; + wd->qdisc = qdisc; +} +EXPORT_SYMBOL(qdisc_watchdog_init); + +void qdisc_watchdog_schedule_ns(struct qdisc_watchdog *wd, u64 expires) +{ + if (test_bit(__QDISC_STATE_DEACTIVATED, + &qdisc_root_sleeping(wd->qdisc)->state)) + return; + + if (wd->last_expires == expires) + return; + + wd->last_expires = expires; + hrtimer_start(&wd->timer, + ns_to_ktime(expires), + HRTIMER_MODE_ABS_PINNED); +} +EXPORT_SYMBOL(qdisc_watchdog_schedule_ns); + +void qdisc_watchdog_cancel(struct qdisc_watchdog *wd) +{ + hrtimer_cancel(&wd->timer); +} +EXPORT_SYMBOL(qdisc_watchdog_cancel); + +static struct hlist_head *qdisc_class_hash_alloc(unsigned int n) +{ + unsigned int size = n * sizeof(struct hlist_head), i; + struct hlist_head *h; + + if (size <= PAGE_SIZE) + h = kmalloc(size, GFP_KERNEL); + else + h = (struct hlist_head *) + __get_free_pages(GFP_KERNEL, get_order(size)); + + if (h != NULL) { + for (i = 0; i < n; i++) + INIT_HLIST_HEAD(&h[i]); + } + return h; +} + +static void qdisc_class_hash_free(struct hlist_head *h, unsigned int n) +{ + unsigned int size = n * sizeof(struct hlist_head); + + if (size <= PAGE_SIZE) + kfree(h); + else + free_pages((unsigned long)h, get_order(size)); +} + +void qdisc_class_hash_grow(struct Qdisc *sch, struct Qdisc_class_hash *clhash) +{ + struct Qdisc_class_common *cl; + struct hlist_node *next; + struct hlist_head *nhash, *ohash; + unsigned int nsize, nmask, osize; + unsigned int i, h; + + /* Rehash when load factor exceeds 0.75 */ + if (clhash->hashelems * 4 <= clhash->hashsize * 3) + return; + nsize = clhash->hashsize * 2; + nmask = nsize - 1; + nhash = qdisc_class_hash_alloc(nsize); + if (nhash == NULL) + return; + + ohash = clhash->hash; + osize = clhash->hashsize; + + sch_tree_lock(sch); + for (i = 0; i < osize; i++) { + hlist_for_each_entry_safe(cl, next, &ohash[i], hnode) { + h = qdisc_class_hash(cl->classid, nmask); + hlist_add_head(&cl->hnode, &nhash[h]); + } + } + clhash->hash = nhash; + clhash->hashsize = nsize; + clhash->hashmask = nmask; + sch_tree_unlock(sch); + + qdisc_class_hash_free(ohash, osize); +} +EXPORT_SYMBOL(qdisc_class_hash_grow); + +int qdisc_class_hash_init(struct Qdisc_class_hash *clhash) +{ + unsigned int size = 4; + + clhash->hash = qdisc_class_hash_alloc(size); + if (clhash->hash == NULL) + return -ENOMEM; + clhash->hashsize = size; + clhash->hashmask = size - 1; + clhash->hashelems = 0; + return 0; +} +EXPORT_SYMBOL(qdisc_class_hash_init); + +void qdisc_class_hash_destroy(struct Qdisc_class_hash *clhash) +{ + qdisc_class_hash_free(clhash->hash, clhash->hashsize); +} +EXPORT_SYMBOL(qdisc_class_hash_destroy); + +void qdisc_class_hash_insert(struct Qdisc_class_hash *clhash, + struct Qdisc_class_common *cl) +{ + unsigned int h; + + INIT_HLIST_NODE(&cl->hnode); + h = qdisc_class_hash(cl->classid, clhash->hashmask); + hlist_add_head(&cl->hnode, &clhash->hash[h]); + clhash->hashelems++; +} +EXPORT_SYMBOL(qdisc_class_hash_insert); + +void qdisc_class_hash_remove(struct Qdisc_class_hash *clhash, + struct Qdisc_class_common *cl) +{ + hlist_del(&cl->hnode); + clhash->hashelems--; +} +EXPORT_SYMBOL(qdisc_class_hash_remove); + +/* Allocate an unique handle from space managed by kernel + * Possible range is [8000-FFFF]:0000 (0x8000 values) + */ +static u32 qdisc_alloc_handle(struct net_device *dev) +{ + int i = 0x8000; + static u32 autohandle = TC_H_MAKE(0x80000000U, 0); + + do { + autohandle += TC_H_MAKE(0x10000U, 0); + if (autohandle == TC_H_MAKE(TC_H_ROOT, 0)) + autohandle = TC_H_MAKE(0x80000000U, 0); + if (!qdisc_lookup(dev, autohandle)) + return autohandle; + cond_resched(); + } while (--i > 0); + + return 0; +} + +void qdisc_tree_reduce_backlog(struct Qdisc *sch, unsigned int n, + unsigned int len) +{ + const struct Qdisc_class_ops *cops; + unsigned long cl; + u32 parentid; + int drops; + + if (n == 0 && len == 0) + return; + drops = max_t(int, n, 0); + rcu_read_lock(); + while ((parentid = sch->parent)) { + if (TC_H_MAJ(parentid) == TC_H_MAJ(TC_H_INGRESS)) + break; + + if (sch->flags & TCQ_F_NOPARENT) + break; + /* TODO: perform the search on a per txq basis */ + sch = qdisc_lookup(qdisc_dev(sch), TC_H_MAJ(parentid)); + if (sch == NULL) { + WARN_ON_ONCE(parentid != TC_H_ROOT); + break; + } + cops = sch->ops->cl_ops; + if (cops->qlen_notify) { + cl = cops->get(sch, parentid); + cops->qlen_notify(sch, cl); + cops->put(sch, cl); + } + sch->q.qlen -= n; + sch->qstats.backlog -= len; + __qdisc_qstats_drop(sch, drops); + } + rcu_read_unlock(); +} +EXPORT_SYMBOL(qdisc_tree_reduce_backlog); + +static void notify_and_destroy(struct net *net, struct sk_buff *skb, + struct nlmsghdr *n, u32 clid, + struct Qdisc *old, struct Qdisc *new) +{ + if (new || old) + qdisc_notify(net, skb, n, clid, old, new); + + if (old) + qdisc_destroy(old); +} + +/* Graft qdisc "new" to class "classid" of qdisc "parent" or + * to device "dev". + * + * When appropriate send a netlink notification using 'skb' + * and "n". + * + * On success, destroy old qdisc. + */ + +static int qdisc_graft(struct net_device *dev, struct Qdisc *parent, + struct sk_buff *skb, struct nlmsghdr *n, u32 classid, + struct Qdisc *new, struct Qdisc *old) +{ + struct Qdisc *q = old; + struct net *net = dev_net(dev); + int err = 0; + + if (parent == NULL) { + unsigned int i, num_q, ingress; + + ingress = 0; + num_q = dev->num_tx_queues; + if ((q && q->flags & TCQ_F_INGRESS) || + (new && new->flags & TCQ_F_INGRESS)) { + num_q = 1; + ingress = 1; + if (!dev_ingress_queue(dev)) + return -ENOENT; + } + + if (dev->flags & IFF_UP) + dev_deactivate(dev); + + if (new && new->ops->attach) + goto skip; + + for (i = 0; i < num_q; i++) { + struct netdev_queue *dev_queue = dev_ingress_queue(dev); + + if (!ingress) + dev_queue = netdev_get_tx_queue(dev, i); + + old = dev_graft_qdisc(dev_queue, new); + if (new && i > 0) + atomic_inc(&new->refcnt); + + if (!ingress) + qdisc_destroy(old); + } + +skip: + if (!ingress) { + notify_and_destroy(net, skb, n, classid, + dev->qdisc, new); + if (new && !new->ops->attach) + atomic_inc(&new->refcnt); + dev->qdisc = new ? : &noop_qdisc; + + if (new && new->ops->attach) + new->ops->attach(new); + } else { + notify_and_destroy(net, skb, n, classid, old, new); + } + + if (dev->flags & IFF_UP) + dev_activate(dev); + } else { + const struct Qdisc_class_ops *cops = parent->ops->cl_ops; + + err = -EOPNOTSUPP; + if (cops && cops->graft) { + unsigned long cl = cops->get(parent, classid); + if (cl) { + err = cops->graft(parent, cl, new, &old); + cops->put(parent, cl); + } else + err = -ENOENT; + } + if (!err) + notify_and_destroy(net, skb, n, classid, old, new); + } + return err; +} + +/* lockdep annotation is needed for ingress; egress gets it only for name */ +static struct lock_class_key qdisc_tx_lock; +static struct lock_class_key qdisc_rx_lock; + +/* + Allocate and initialize new qdisc. + + Parameters are passed via opt. + */ + +static struct Qdisc *qdisc_create(struct net_device *dev, + struct netdev_queue *dev_queue, + struct Qdisc *p, u32 parent, u32 handle, + struct nlattr **tca, int *errp) +{ + int err; + struct nlattr *kind = tca[TCA_KIND]; + struct Qdisc *sch; + struct Qdisc_ops *ops; + struct qdisc_size_table *stab; + + ops = qdisc_lookup_ops(kind); +#ifdef CONFIG_MODULES + if (ops == NULL && kind != NULL) { + char name[IFNAMSIZ]; + if (nla_strlcpy(name, kind, IFNAMSIZ) < IFNAMSIZ) { + /* We dropped the RTNL semaphore in order to + * perform the module load. So, even if we + * succeeded in loading the module we have to + * tell the caller to replay the request. We + * indicate this using -EAGAIN. + * We replay the request because the device may + * go away in the mean time. + */ + rtnl_unlock(); + request_module("sch_%s", name); + rtnl_lock(); + ops = qdisc_lookup_ops(kind); + if (ops != NULL) { + /* We will try again qdisc_lookup_ops, + * so don't keep a reference. + */ + module_put(ops->owner); + err = -EAGAIN; + goto err_out; + } + } + } +#endif + + err = -ENOENT; + if (ops == NULL) + goto err_out; + + sch = qdisc_alloc(dev_queue, ops); + if (IS_ERR(sch)) { + err = PTR_ERR(sch); + goto err_out2; + } + + sch->parent = parent; + + if (handle == TC_H_INGRESS) { + sch->flags |= TCQ_F_INGRESS; + handle = TC_H_MAKE(TC_H_INGRESS, 0); + lockdep_set_class(qdisc_lock(sch), &qdisc_rx_lock); + } else { + if (handle == 0) { + handle = qdisc_alloc_handle(dev); + err = -ENOMEM; + if (handle == 0) + goto err_out3; + } + lockdep_set_class(qdisc_lock(sch), &qdisc_tx_lock); + if (!netif_is_multiqueue(dev)) + sch->flags |= TCQ_F_ONETXQUEUE; + } + + sch->handle = handle; + + if (!ops->init || (err = ops->init(sch, tca[TCA_OPTIONS])) == 0) { + if (qdisc_is_percpu_stats(sch)) { + sch->cpu_bstats = + netdev_alloc_pcpu_stats(struct gnet_stats_basic_cpu); + if (!sch->cpu_bstats) + goto err_out4; + + sch->cpu_qstats = alloc_percpu(struct gnet_stats_queue); + if (!sch->cpu_qstats) + goto err_out4; + } + + if (tca[TCA_STAB]) { + stab = qdisc_get_stab(tca[TCA_STAB]); + if (IS_ERR(stab)) { + err = PTR_ERR(stab); + goto err_out4; + } + rcu_assign_pointer(sch->stab, stab); + } + if (tca[TCA_RATE]) { + seqcount_t *running; + + err = -EOPNOTSUPP; + if (sch->flags & TCQ_F_MQROOT) + goto err_out4; + + if ((sch->parent != TC_H_ROOT) && + !(sch->flags & TCQ_F_INGRESS) && + (!p || !(p->flags & TCQ_F_MQROOT))) + running = qdisc_root_sleeping_running(sch); + else + running = &sch->running; + + err = gen_new_estimator(&sch->bstats, + sch->cpu_bstats, + &sch->rate_est, + NULL, + running, + tca[TCA_RATE]); + if (err) + goto err_out4; + } + + qdisc_hash_add(sch); + + return sch; + } +err_out3: + dev_put(dev); + kfree((char *) sch - sch->padded); +err_out2: + module_put(ops->owner); +err_out: + *errp = err; + return NULL; + +err_out4: + free_percpu(sch->cpu_bstats); + free_percpu(sch->cpu_qstats); + /* + * Any broken qdiscs that would require a ops->reset() here? + * The qdisc was never in action so it shouldn't be necessary. + */ + qdisc_put_stab(rtnl_dereference(sch->stab)); + if (ops->destroy) + ops->destroy(sch); + goto err_out3; +} + +static int qdisc_change(struct Qdisc *sch, struct nlattr **tca) +{ + struct qdisc_size_table *ostab, *stab = NULL; + int err = 0; + + if (tca[TCA_OPTIONS]) { + if (sch->ops->change == NULL) + return -EINVAL; + err = sch->ops->change(sch, tca[TCA_OPTIONS]); + if (err) + return err; + } + + if (tca[TCA_STAB]) { + stab = qdisc_get_stab(tca[TCA_STAB]); + if (IS_ERR(stab)) + return PTR_ERR(stab); + } + + ostab = rtnl_dereference(sch->stab); + rcu_assign_pointer(sch->stab, stab); + qdisc_put_stab(ostab); + + if (tca[TCA_RATE]) { + /* NB: ignores errors from replace_estimator + because change can't be undone. */ + if (sch->flags & TCQ_F_MQROOT) + goto out; + gen_replace_estimator(&sch->bstats, + sch->cpu_bstats, + &sch->rate_est, + NULL, + qdisc_root_sleeping_running(sch), + tca[TCA_RATE]); + } +out: + return 0; +} + +struct check_loop_arg { + struct qdisc_walker w; + struct Qdisc *p; + int depth; +}; + +static int check_loop_fn(struct Qdisc *q, unsigned long cl, + struct qdisc_walker *w); + +static int check_loop(struct Qdisc *q, struct Qdisc *p, int depth) +{ + struct check_loop_arg arg; + + if (q->ops->cl_ops == NULL) + return 0; + + arg.w.stop = arg.w.skip = arg.w.count = 0; + arg.w.fn = check_loop_fn; + arg.depth = depth; + arg.p = p; + q->ops->cl_ops->walk(q, &arg.w); + return arg.w.stop ? -ELOOP : 0; +} + +static int +check_loop_fn(struct Qdisc *q, unsigned long cl, struct qdisc_walker *w) +{ + struct Qdisc *leaf; + const struct Qdisc_class_ops *cops = q->ops->cl_ops; + struct check_loop_arg *arg = (struct check_loop_arg *)w; + + leaf = cops->leaf(q, cl); + if (leaf) { + if (leaf == arg->p || arg->depth > 7) + return -ELOOP; + return check_loop(leaf, arg->p, arg->depth + 1); + } + return 0; +} + +/* + * Delete/get qdisc. + */ + +static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n) +{ + struct net *net = sock_net(skb->sk); + struct tcmsg *tcm = nlmsg_data(n); + struct nlattr *tca[TCA_MAX + 1]; + struct net_device *dev; + u32 clid; + struct Qdisc *q = NULL; + struct Qdisc *p = NULL; + int err; + + if ((n->nlmsg_type != RTM_GETQDISC) && + !netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) + return -EPERM; + + err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, NULL); + if (err < 0) + return err; + + dev = __dev_get_by_index(net, tcm->tcm_ifindex); + if (!dev) + return -ENODEV; + + clid = tcm->tcm_parent; + if (clid) { + if (clid != TC_H_ROOT) { + if (TC_H_MAJ(clid) != TC_H_MAJ(TC_H_INGRESS)) { + p = qdisc_lookup(dev, TC_H_MAJ(clid)); + if (!p) + return -ENOENT; + q = qdisc_leaf(p, clid); + } else if (dev_ingress_queue(dev)) { + q = dev_ingress_queue(dev)->qdisc_sleeping; + } + } else { + q = dev->qdisc; + } + if (!q) + return -ENOENT; + + if (tcm->tcm_handle && q->handle != tcm->tcm_handle) + return -EINVAL; + } else { + q = qdisc_lookup(dev, tcm->tcm_handle); + if (!q) + return -ENOENT; + } + + if (tca[TCA_KIND] && nla_strcmp(tca[TCA_KIND], q->ops->id)) + return -EINVAL; + + if (n->nlmsg_type == RTM_DELQDISC) { + if (!clid) + return -EINVAL; + if (q->handle == 0) + return -ENOENT; + err = qdisc_graft(dev, p, skb, n, clid, NULL, q); + if (err != 0) + return err; + } else { + qdisc_notify(net, skb, n, clid, NULL, q); + } + return 0; +} + +/* + * Create/change qdisc. + */ + +static int tc_modify_qdisc(struct sk_buff *skb, struct nlmsghdr *n) +{ + struct net *net = sock_net(skb->sk); + struct tcmsg *tcm; + struct nlattr *tca[TCA_MAX + 1]; + struct net_device *dev; + u32 clid; + struct Qdisc *q, *p; + int err; + + if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) + return -EPERM; + +replay: + /* Reinit, just in case something touches this. */ + err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, NULL); + if (err < 0) + return err; + + tcm = nlmsg_data(n); + clid = tcm->tcm_parent; + q = p = NULL; + + dev = __dev_get_by_index(net, tcm->tcm_ifindex); + if (!dev) + return -ENODEV; + + + if (clid) { + if (clid != TC_H_ROOT) { + if (clid != TC_H_INGRESS) { + p = qdisc_lookup(dev, TC_H_MAJ(clid)); + if (!p) + return -ENOENT; + q = qdisc_leaf(p, clid); + } else if (dev_ingress_queue_create(dev)) { + q = dev_ingress_queue(dev)->qdisc_sleeping; + } + } else { + q = dev->qdisc; + } + + /* It may be default qdisc, ignore it */ + if (q && q->handle == 0) + q = NULL; + + if (!q || !tcm->tcm_handle || q->handle != tcm->tcm_handle) { + if (tcm->tcm_handle) { + if (q && !(n->nlmsg_flags & NLM_F_REPLACE)) + return -EEXIST; + if (TC_H_MIN(tcm->tcm_handle)) + return -EINVAL; + q = qdisc_lookup(dev, tcm->tcm_handle); + if (!q) + goto create_n_graft; + if (n->nlmsg_flags & NLM_F_EXCL) + return -EEXIST; + if (tca[TCA_KIND] && nla_strcmp(tca[TCA_KIND], q->ops->id)) + return -EINVAL; + if (q == p || + (p && check_loop(q, p, 0))) + return -ELOOP; + atomic_inc(&q->refcnt); + goto graft; + } else { + if (!q) + goto create_n_graft; + + /* This magic test requires explanation. + * + * We know, that some child q is already + * attached to this parent and have choice: + * either to change it or to create/graft new one. + * + * 1. We are allowed to create/graft only + * if CREATE and REPLACE flags are set. + * + * 2. If EXCL is set, requestor wanted to say, + * that qdisc tcm_handle is not expected + * to exist, so that we choose create/graft too. + * + * 3. The last case is when no flags are set. + * Alas, it is sort of hole in API, we + * cannot decide what to do unambiguously. + * For now we select create/graft, if + * user gave KIND, which does not match existing. + */ + if ((n->nlmsg_flags & NLM_F_CREATE) && + (n->nlmsg_flags & NLM_F_REPLACE) && + ((n->nlmsg_flags & NLM_F_EXCL) || + (tca[TCA_KIND] && + nla_strcmp(tca[TCA_KIND], q->ops->id)))) + goto create_n_graft; + } + } + } else { + if (!tcm->tcm_handle) + return -EINVAL; + q = qdisc_lookup(dev, tcm->tcm_handle); + } + + /* Change qdisc parameters */ + if (q == NULL) + return -ENOENT; + if (n->nlmsg_flags & NLM_F_EXCL) + return -EEXIST; + if (tca[TCA_KIND] && nla_strcmp(tca[TCA_KIND], q->ops->id)) + return -EINVAL; + err = qdisc_change(q, tca); + if (err == 0) + qdisc_notify(net, skb, n, clid, NULL, q); + return err; + +create_n_graft: + if (!(n->nlmsg_flags & NLM_F_CREATE)) + return -ENOENT; + if (clid == TC_H_INGRESS) { + if (dev_ingress_queue(dev)) + q = qdisc_create(dev, dev_ingress_queue(dev), p, + tcm->tcm_parent, tcm->tcm_parent, + tca, &err); + else + err = -ENOENT; + } else { + struct netdev_queue *dev_queue; + + if (p && p->ops->cl_ops && p->ops->cl_ops->select_queue) + dev_queue = p->ops->cl_ops->select_queue(p, tcm); + else if (p) + dev_queue = p->dev_queue; + else + dev_queue = netdev_get_tx_queue(dev, 0); + + q = qdisc_create(dev, dev_queue, p, + tcm->tcm_parent, tcm->tcm_handle, + tca, &err); + } + if (q == NULL) { + if (err == -EAGAIN) + goto replay; + return err; + } + +graft: + err = qdisc_graft(dev, p, skb, n, clid, q, NULL); + if (err) { + if (q) + qdisc_destroy(q); + return err; + } + + return 0; +} + +static int tc_fill_qdisc(struct sk_buff *skb, struct Qdisc *q, u32 clid, + u32 portid, u32 seq, u16 flags, int event) +{ + struct gnet_stats_basic_cpu __percpu *cpu_bstats = NULL; + struct gnet_stats_queue __percpu *cpu_qstats = NULL; + struct tcmsg *tcm; + struct nlmsghdr *nlh; + unsigned char *b = skb_tail_pointer(skb); + struct gnet_dump d; + struct qdisc_size_table *stab; + __u32 qlen; + + cond_resched(); + nlh = nlmsg_put(skb, portid, seq, event, sizeof(*tcm), flags); + if (!nlh) + goto out_nlmsg_trim; + tcm = nlmsg_data(nlh); + tcm->tcm_family = AF_UNSPEC; + tcm->tcm__pad1 = 0; + tcm->tcm__pad2 = 0; + tcm->tcm_ifindex = qdisc_dev(q)->ifindex; + tcm->tcm_parent = clid; + tcm->tcm_handle = q->handle; + tcm->tcm_info = atomic_read(&q->refcnt); + if (nla_put_string(skb, TCA_KIND, q->ops->id)) + goto nla_put_failure; + if (q->ops->dump && q->ops->dump(q, skb) < 0) + goto nla_put_failure; + qlen = q->q.qlen; + + stab = rtnl_dereference(q->stab); + if (stab && qdisc_dump_stab(skb, stab) < 0) + goto nla_put_failure; + + if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, TCA_XSTATS, + NULL, &d, TCA_PAD) < 0) + goto nla_put_failure; + + if (q->ops->dump_stats && q->ops->dump_stats(q, &d) < 0) + goto nla_put_failure; + + if (qdisc_is_percpu_stats(q)) { + cpu_bstats = q->cpu_bstats; + cpu_qstats = q->cpu_qstats; + } + + if (gnet_stats_copy_basic(qdisc_root_sleeping_running(q), + &d, cpu_bstats, &q->bstats) < 0 || + gnet_stats_copy_rate_est(&d, &q->bstats, &q->rate_est) < 0 || + gnet_stats_copy_queue(&d, cpu_qstats, &q->qstats, qlen) < 0) + goto nla_put_failure; + + if (gnet_stats_finish_copy(&d) < 0) + goto nla_put_failure; + + nlh->nlmsg_len = skb_tail_pointer(skb) - b; + return skb->len; + +out_nlmsg_trim: +nla_put_failure: + nlmsg_trim(skb, b); + return -1; +} + +static bool tc_qdisc_dump_ignore(struct Qdisc *q) +{ + return (q->flags & TCQ_F_BUILTIN) ? true : false; +} + +static int qdisc_notify(struct net *net, struct sk_buff *oskb, + struct nlmsghdr *n, u32 clid, + struct Qdisc *old, struct Qdisc *new) +{ + struct sk_buff *skb; + u32 portid = oskb ? NETLINK_CB(oskb).portid : 0; + + skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL); + if (!skb) + return -ENOBUFS; + + if (old && !tc_qdisc_dump_ignore(old)) { + if (tc_fill_qdisc(skb, old, clid, portid, n->nlmsg_seq, + 0, RTM_DELQDISC) < 0) + goto err_out; + } + if (new && !tc_qdisc_dump_ignore(new)) { + if (tc_fill_qdisc(skb, new, clid, portid, n->nlmsg_seq, + old ? NLM_F_REPLACE : 0, RTM_NEWQDISC) < 0) + goto err_out; + } + + if (skb->len) + return rtnetlink_send(skb, net, portid, RTNLGRP_TC, + n->nlmsg_flags & NLM_F_ECHO); + +err_out: + kfree_skb(skb); + return -EINVAL; +} + +static int tc_dump_qdisc_root(struct Qdisc *root, struct sk_buff *skb, + struct netlink_callback *cb, + int *q_idx_p, int s_q_idx, bool recur) +{ + int ret = 0, q_idx = *q_idx_p; + struct Qdisc *q; + int b; + + if (!root) + return 0; + + q = root; + if (q_idx < s_q_idx) { + q_idx++; + } else { + if (!tc_qdisc_dump_ignore(q) && + tc_fill_qdisc(skb, q, q->parent, NETLINK_CB(cb->skb).portid, + cb->nlh->nlmsg_seq, NLM_F_MULTI, + RTM_NEWQDISC) <= 0) + goto done; + q_idx++; + } + + /* If dumping singletons, there is no qdisc_dev(root) and the singleton + * itself has already been dumped. + * + * If we've already dumped the top-level (ingress) qdisc above and the global + * qdisc hashtable, we don't want to hit it again + */ + if (!qdisc_dev(root) || !recur) + goto out; + + hash_for_each(qdisc_dev(root)->qdisc_hash, b, q, hash) { + if (q_idx < s_q_idx) { + q_idx++; + continue; + } + if (!tc_qdisc_dump_ignore(q) && + tc_fill_qdisc(skb, q, q->parent, NETLINK_CB(cb->skb).portid, + cb->nlh->nlmsg_seq, NLM_F_MULTI, + RTM_NEWQDISC) <= 0) + goto done; + q_idx++; + } + +out: + *q_idx_p = q_idx; + return ret; +done: + ret = -1; + goto out; +} + +static int tc_dump_qdisc(struct sk_buff *skb, struct netlink_callback *cb) +{ + struct net *net = sock_net(skb->sk); + int idx, q_idx; + int s_idx, s_q_idx; + struct net_device *dev; + + s_idx = cb->args[0]; + s_q_idx = q_idx = cb->args[1]; + + idx = 0; + ASSERT_RTNL(); + for_each_netdev(net, dev) { + struct netdev_queue *dev_queue; + + if (idx < s_idx) + goto cont; + if (idx > s_idx) + s_q_idx = 0; + q_idx = 0; + + if (tc_dump_qdisc_root(dev->qdisc, skb, cb, &q_idx, s_q_idx, + true) < 0) + goto done; + + dev_queue = dev_ingress_queue(dev); + if (dev_queue && + tc_dump_qdisc_root(dev_queue->qdisc_sleeping, skb, cb, + &q_idx, s_q_idx, false) < 0) + goto done; + +cont: + idx++; + } + +done: + cb->args[0] = idx; + cb->args[1] = q_idx; + + return skb->len; +} + + + +/************************************************ + * Traffic classes manipulation. * + ************************************************/ + + + +static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n) +{ + struct net *net = sock_net(skb->sk); + struct tcmsg *tcm = nlmsg_data(n); + struct nlattr *tca[TCA_MAX + 1]; + struct net_device *dev; + struct Qdisc *q = NULL; + const struct Qdisc_class_ops *cops; + unsigned long cl = 0; + unsigned long new_cl; + u32 portid; + u32 clid; + u32 qid; + int err; + + if ((n->nlmsg_type != RTM_GETTCLASS) && + !netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) + return -EPERM; + + err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, NULL); + if (err < 0) + return err; + + dev = __dev_get_by_index(net, tcm->tcm_ifindex); + if (!dev) + return -ENODEV; + + /* + parent == TC_H_UNSPEC - unspecified parent. + parent == TC_H_ROOT - class is root, which has no parent. + parent == X:0 - parent is root class. + parent == X:Y - parent is a node in hierarchy. + parent == 0:Y - parent is X:Y, where X:0 is qdisc. + + handle == 0:0 - generate handle from kernel pool. + handle == 0:Y - class is X:Y, where X:0 is qdisc. + handle == X:Y - clear. + handle == X:0 - root class. + */ + + /* Step 1. Determine qdisc handle X:0 */ + + portid = tcm->tcm_parent; + clid = tcm->tcm_handle; + qid = TC_H_MAJ(clid); + + if (portid != TC_H_ROOT) { + u32 qid1 = TC_H_MAJ(portid); + + if (qid && qid1) { + /* If both majors are known, they must be identical. */ + if (qid != qid1) + return -EINVAL; + } else if (qid1) { + qid = qid1; + } else if (qid == 0) + qid = dev->qdisc->handle; + + /* Now qid is genuine qdisc handle consistent + * both with parent and child. + * + * TC_H_MAJ(portid) still may be unspecified, complete it now. + */ + if (portid) + portid = TC_H_MAKE(qid, portid); + } else { + if (qid == 0) + qid = dev->qdisc->handle; + } + + /* OK. Locate qdisc */ + q = qdisc_lookup(dev, qid); + if (!q) + return -ENOENT; + + /* An check that it supports classes */ + cops = q->ops->cl_ops; + if (cops == NULL) + return -EINVAL; + + /* Now try to get class */ + if (clid == 0) { + if (portid == TC_H_ROOT) + clid = qid; + } else + clid = TC_H_MAKE(qid, clid); + + if (clid) + cl = cops->get(q, clid); + + if (cl == 0) { + err = -ENOENT; + if (n->nlmsg_type != RTM_NEWTCLASS || + !(n->nlmsg_flags & NLM_F_CREATE)) + goto out; + } else { + switch (n->nlmsg_type) { + case RTM_NEWTCLASS: + err = -EEXIST; + if (n->nlmsg_flags & NLM_F_EXCL) + goto out; + break; + case RTM_DELTCLASS: + err = -EOPNOTSUPP; + if (cops->delete) + err = cops->delete(q, cl); + if (err == 0) + tclass_notify(net, skb, n, q, cl, + RTM_DELTCLASS); + goto out; + case RTM_GETTCLASS: + err = tclass_notify(net, skb, n, q, cl, RTM_NEWTCLASS); + goto out; + default: + err = -EINVAL; + goto out; + } + } + + new_cl = cl; + err = -EOPNOTSUPP; + if (cops->change) + err = cops->change(q, clid, portid, tca, &new_cl); + if (err == 0) + tclass_notify(net, skb, n, q, new_cl, RTM_NEWTCLASS); + +out: + if (cl) + cops->put(q, cl); + + return err; +} + + +static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q, + unsigned long cl, + u32 portid, u32 seq, u16 flags, int event) +{ + struct tcmsg *tcm; + struct nlmsghdr *nlh; + unsigned char *b = skb_tail_pointer(skb); + struct gnet_dump d; + const struct Qdisc_class_ops *cl_ops = q->ops->cl_ops; + + cond_resched(); + nlh = nlmsg_put(skb, portid, seq, event, sizeof(*tcm), flags); + if (!nlh) + goto out_nlmsg_trim; + tcm = nlmsg_data(nlh); + tcm->tcm_family = AF_UNSPEC; + tcm->tcm__pad1 = 0; + tcm->tcm__pad2 = 0; + tcm->tcm_ifindex = qdisc_dev(q)->ifindex; + tcm->tcm_parent = q->handle; + tcm->tcm_handle = q->handle; + tcm->tcm_info = 0; + if (nla_put_string(skb, TCA_KIND, q->ops->id)) + goto nla_put_failure; + if (cl_ops->dump && cl_ops->dump(q, cl, skb, tcm) < 0) + goto nla_put_failure; + + if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, TCA_XSTATS, + NULL, &d, TCA_PAD) < 0) + goto nla_put_failure; + + if (cl_ops->dump_stats && cl_ops->dump_stats(q, cl, &d) < 0) + goto nla_put_failure; + + if (gnet_stats_finish_copy(&d) < 0) + goto nla_put_failure; + + nlh->nlmsg_len = skb_tail_pointer(skb) - b; + return skb->len; + +out_nlmsg_trim: +nla_put_failure: + nlmsg_trim(skb, b); + return -1; +} + +static int tclass_notify(struct net *net, struct sk_buff *oskb, + struct nlmsghdr *n, struct Qdisc *q, + unsigned long cl, int event) +{ + struct sk_buff *skb; + u32 portid = oskb ? NETLINK_CB(oskb).portid : 0; + + skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL); + if (!skb) + return -ENOBUFS; + + if (tc_fill_tclass(skb, q, cl, portid, n->nlmsg_seq, 0, event) < 0) { + kfree_skb(skb); + return -EINVAL; + } + + return rtnetlink_send(skb, net, portid, RTNLGRP_TC, + n->nlmsg_flags & NLM_F_ECHO); +} + +struct qdisc_dump_args { + struct qdisc_walker w; + struct sk_buff *skb; + struct netlink_callback *cb; +}; + +static int qdisc_class_dump(struct Qdisc *q, unsigned long cl, + struct qdisc_walker *arg) +{ + struct qdisc_dump_args *a = (struct qdisc_dump_args *)arg; + + return tc_fill_tclass(a->skb, q, cl, NETLINK_CB(a->cb->skb).portid, + a->cb->nlh->nlmsg_seq, NLM_F_MULTI, + RTM_NEWTCLASS); +} + +static int tc_dump_tclass_qdisc(struct Qdisc *q, struct sk_buff *skb, + struct tcmsg *tcm, struct netlink_callback *cb, + int *t_p, int s_t) +{ + struct qdisc_dump_args arg; + + if (tc_qdisc_dump_ignore(q) || + *t_p < s_t || !q->ops->cl_ops || + (tcm->tcm_parent && + TC_H_MAJ(tcm->tcm_parent) != q->handle)) { + (*t_p)++; + return 0; + } + if (*t_p > s_t) + memset(&cb->args[1], 0, sizeof(cb->args)-sizeof(cb->args[0])); + arg.w.fn = qdisc_class_dump; + arg.skb = skb; + arg.cb = cb; + arg.w.stop = 0; + arg.w.skip = cb->args[1]; + arg.w.count = 0; + q->ops->cl_ops->walk(q, &arg.w); + cb->args[1] = arg.w.count; + if (arg.w.stop) + return -1; + (*t_p)++; + return 0; +} + +static int tc_dump_tclass_root(struct Qdisc *root, struct sk_buff *skb, + struct tcmsg *tcm, struct netlink_callback *cb, + int *t_p, int s_t) +{ + struct Qdisc *q; + int b; + + if (!root) + return 0; + + if (tc_dump_tclass_qdisc(root, skb, tcm, cb, t_p, s_t) < 0) + return -1; + + if (!qdisc_dev(root)) + return 0; + + hash_for_each(qdisc_dev(root)->qdisc_hash, b, q, hash) { + if (tc_dump_tclass_qdisc(q, skb, tcm, cb, t_p, s_t) < 0) + return -1; + } + + return 0; +} + +static int tc_dump_tclass(struct sk_buff *skb, struct netlink_callback *cb) +{ + struct tcmsg *tcm = nlmsg_data(cb->nlh); + struct net *net = sock_net(skb->sk); + struct netdev_queue *dev_queue; + struct net_device *dev; + int t, s_t; + + if (nlmsg_len(cb->nlh) < sizeof(*tcm)) + return 0; + dev = dev_get_by_index(net, tcm->tcm_ifindex); + if (!dev) + return 0; + + s_t = cb->args[0]; + t = 0; + + if (tc_dump_tclass_root(dev->qdisc, skb, tcm, cb, &t, s_t) < 0) + goto done; + + dev_queue = dev_ingress_queue(dev); + if (dev_queue && + tc_dump_tclass_root(dev_queue->qdisc_sleeping, skb, tcm, cb, + &t, s_t) < 0) + goto done; + +done: + cb->args[0] = t; + + dev_put(dev); + return skb->len; +} + +/* Main classifier routine: scans classifier chain attached + * to this qdisc, (optionally) tests for protocol and asks + * specific classifiers. + */ +int tc_classify(struct sk_buff *skb, const struct tcf_proto *tp, + struct tcf_result *res, bool compat_mode) +{ + __be16 protocol = tc_skb_protocol(skb); +#ifdef CONFIG_NET_CLS_ACT + const struct tcf_proto *old_tp = tp; + int limit = 0; + +reclassify: +#endif + for (; tp; tp = rcu_dereference_bh(tp->next)) { + int err; + + if (tp->protocol != protocol && + tp->protocol != htons(ETH_P_ALL)) + continue; + + err = tp->classify(skb, tp, res); +#ifdef CONFIG_NET_CLS_ACT + if (unlikely(err == TC_ACT_RECLASSIFY && !compat_mode)) + goto reset; +#endif + if (err >= 0) + return err; + } + + return TC_ACT_UNSPEC; /* signal: continue lookup */ +#ifdef CONFIG_NET_CLS_ACT +reset: + if (unlikely(limit++ >= MAX_REC_LOOP)) { + net_notice_ratelimited("%s: reclassify loop, rule prio %u, protocol %02x\n", + tp->q->ops->id, tp->prio & 0xffff, + ntohs(tp->protocol)); + return TC_ACT_SHOT; + } + + tp = old_tp; + protocol = tc_skb_protocol(skb); + goto reclassify; +#endif +} +EXPORT_SYMBOL(tc_classify); + +bool tcf_destroy(struct tcf_proto *tp, bool force) +{ + if (tp->ops->destroy(tp, force)) { + module_put(tp->ops->owner); + kfree_rcu(tp, rcu); + return true; + } + + return false; +} + +void tcf_destroy_chain(struct tcf_proto __rcu **fl) +{ + struct tcf_proto *tp; + + while ((tp = rtnl_dereference(*fl)) != NULL) { + RCU_INIT_POINTER(*fl, tp->next); + tcf_destroy(tp, true); + } +} +EXPORT_SYMBOL(tcf_destroy_chain); + +#ifdef CONFIG_PROC_FS +static int psched_show(struct seq_file *seq, void *v) +{ + seq_printf(seq, "%08x %08x %08x %08x\n", + (u32)NSEC_PER_USEC, (u32)PSCHED_TICKS2NS(1), + 1000000, + (u32)NSEC_PER_SEC / hrtimer_resolution); + + return 0; +} + +static int psched_open(struct inode *inode, struct file *file) +{ + return single_open(file, psched_show, NULL); +} + +static const struct file_operations psched_fops = { + .owner = THIS_MODULE, + .open = psched_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int __net_init psched_net_init(struct net *net) +{ + struct proc_dir_entry *e; + + e = proc_create("psched", 0, net->proc_net, &psched_fops); + if (e == NULL) + return -ENOMEM; + + return 0; +} + +static void __net_exit psched_net_exit(struct net *net) +{ + remove_proc_entry("psched", net->proc_net); +} +#else +static int __net_init psched_net_init(struct net *net) +{ + return 0; +} + +static void __net_exit psched_net_exit(struct net *net) +{ +} +#endif + +static struct pernet_operations psched_net_ops = { + .init = psched_net_init, + .exit = psched_net_exit, +}; + +static int __init pktsched_init(void) +{ + int err; + + err = register_pernet_subsys(&psched_net_ops); + if (err) { + pr_err("pktsched_init: " + "cannot initialize per netns operations\n"); + return err; + } + + register_qdisc(&pfifo_fast_ops); + register_qdisc(&pfifo_qdisc_ops); + register_qdisc(&bfifo_qdisc_ops); + register_qdisc(&pfifo_head_drop_qdisc_ops); + register_qdisc(&mq_qdisc_ops); + register_qdisc(&noqueue_qdisc_ops); + + rtnl_register(PF_UNSPEC, RTM_NEWQDISC, tc_modify_qdisc, NULL, NULL); + rtnl_register(PF_UNSPEC, RTM_DELQDISC, tc_get_qdisc, NULL, NULL); + rtnl_register(PF_UNSPEC, RTM_GETQDISC, tc_get_qdisc, tc_dump_qdisc, + NULL); + rtnl_register(PF_UNSPEC, RTM_NEWTCLASS, tc_ctl_tclass, NULL, NULL); + rtnl_register(PF_UNSPEC, RTM_DELTCLASS, tc_ctl_tclass, NULL, NULL); + rtnl_register(PF_UNSPEC, RTM_GETTCLASS, tc_ctl_tclass, tc_dump_tclass, + NULL); + + return 0; +} + +subsys_initcall(pktsched_init); diff --git a/vendor/linux/net/sched/sch_blackhole.c b/vendor/linux/net/sched/sch_blackhole.c new file mode 100644 index 0000000..c98a61e --- /dev/null +++ b/vendor/linux/net/sched/sch_blackhole.c @@ -0,0 +1,45 @@ +/* + * net/sched/sch_blackhole.c Black hole queue + * + * This program 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. + * + * Authors: Thomas Graf + * + * Note: Quantum tunneling is not supported. + */ + +#include +#include +#include +#include +#include + +static int blackhole_enqueue(struct sk_buff *skb, struct Qdisc *sch, + struct sk_buff **to_free) +{ + qdisc_drop(skb, sch, to_free); + return NET_XMIT_SUCCESS; +} + +static struct sk_buff *blackhole_dequeue(struct Qdisc *sch) +{ + return NULL; +} + +static struct Qdisc_ops blackhole_qdisc_ops __read_mostly = { + .id = "blackhole", + .priv_size = 0, + .enqueue = blackhole_enqueue, + .dequeue = blackhole_dequeue, + .peek = blackhole_dequeue, + .owner = THIS_MODULE, +}; + +static int __init blackhole_init(void) +{ + return register_qdisc(&blackhole_qdisc_ops); +} +device_initcall(blackhole_init) diff --git a/vendor/linux/net/sched/sch_fifo.c b/vendor/linux/net/sched/sch_fifo.c new file mode 100644 index 0000000..1e37247 --- /dev/null +++ b/vendor/linux/net/sched/sch_fifo.c @@ -0,0 +1,184 @@ +/* + * net/sched/sch_fifo.c The simplest FIFO queue. + * + * This program 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. + * + * Authors: Alexey Kuznetsov, + */ + +#include +#include +#include +#include +#include +#include +#include + +/* 1 band FIFO pseudo-"scheduler" */ + +static int bfifo_enqueue(struct sk_buff *skb, struct Qdisc *sch, + struct sk_buff **to_free) +{ + if (likely(sch->qstats.backlog + qdisc_pkt_len(skb) <= sch->limit)) + return qdisc_enqueue_tail(skb, sch); + + return qdisc_drop(skb, sch, to_free); +} + +static int pfifo_enqueue(struct sk_buff *skb, struct Qdisc *sch, + struct sk_buff **to_free) +{ + if (likely(sch->q.qlen < sch->limit)) + return qdisc_enqueue_tail(skb, sch); + + return qdisc_drop(skb, sch, to_free); +} + +static int pfifo_tail_enqueue(struct sk_buff *skb, struct Qdisc *sch, + struct sk_buff **to_free) +{ + unsigned int prev_backlog; + + if (likely(sch->q.qlen < sch->limit)) + return qdisc_enqueue_tail(skb, sch); + + prev_backlog = sch->qstats.backlog; + /* queue full, remove one skb to fulfill the limit */ + __qdisc_queue_drop_head(sch, &sch->q, to_free); + qdisc_qstats_drop(sch); + qdisc_enqueue_tail(skb, sch); + + qdisc_tree_reduce_backlog(sch, 0, prev_backlog - sch->qstats.backlog); + return NET_XMIT_CN; +} + +static int fifo_init(struct Qdisc *sch, struct nlattr *opt) +{ + bool bypass; + bool is_bfifo = sch->ops == &bfifo_qdisc_ops; + + if (opt == NULL) { + u32 limit = qdisc_dev(sch)->tx_queue_len; + + if (is_bfifo) + limit *= psched_mtu(qdisc_dev(sch)); + + sch->limit = limit; + } else { + struct tc_fifo_qopt *ctl = nla_data(opt); + + if (nla_len(opt) < sizeof(*ctl)) + return -EINVAL; + + sch->limit = ctl->limit; + } + + if (is_bfifo) + bypass = sch->limit >= psched_mtu(qdisc_dev(sch)); + else + bypass = sch->limit >= 1; + + if (bypass) + sch->flags |= TCQ_F_CAN_BYPASS; + else + sch->flags &= ~TCQ_F_CAN_BYPASS; + return 0; +} + +static int fifo_dump(struct Qdisc *sch, struct sk_buff *skb) +{ + struct tc_fifo_qopt opt = { .limit = sch->limit }; + + if (nla_put(skb, TCA_OPTIONS, sizeof(opt), &opt)) + goto nla_put_failure; + return skb->len; + +nla_put_failure: + return -1; +} + +struct Qdisc_ops pfifo_qdisc_ops __read_mostly = { + .id = "pfifo", + .priv_size = 0, + .enqueue = pfifo_enqueue, + .dequeue = qdisc_dequeue_head, + .peek = qdisc_peek_head, + .init = fifo_init, + .reset = qdisc_reset_queue, + .change = fifo_init, + .dump = fifo_dump, + .owner = THIS_MODULE, +}; +EXPORT_SYMBOL(pfifo_qdisc_ops); + +struct Qdisc_ops bfifo_qdisc_ops __read_mostly = { + .id = "bfifo", + .priv_size = 0, + .enqueue = bfifo_enqueue, + .dequeue = qdisc_dequeue_head, + .peek = qdisc_peek_head, + .init = fifo_init, + .reset = qdisc_reset_queue, + .change = fifo_init, + .dump = fifo_dump, + .owner = THIS_MODULE, +}; +EXPORT_SYMBOL(bfifo_qdisc_ops); + +struct Qdisc_ops pfifo_head_drop_qdisc_ops __read_mostly = { + .id = "pfifo_head_drop", + .priv_size = 0, + .enqueue = pfifo_tail_enqueue, + .dequeue = qdisc_dequeue_head, + .peek = qdisc_peek_head, + .init = fifo_init, + .reset = qdisc_reset_queue, + .change = fifo_init, + .dump = fifo_dump, + .owner = THIS_MODULE, +}; + +/* Pass size change message down to embedded FIFO */ +int fifo_set_limit(struct Qdisc *q, unsigned int limit) +{ + struct nlattr *nla; + int ret = -ENOMEM; + + /* Hack to avoid sending change message to non-FIFO */ + if (strncmp(q->ops->id + 1, "fifo", 4) != 0) + return 0; + + nla = kmalloc(nla_attr_size(sizeof(struct tc_fifo_qopt)), GFP_KERNEL); + if (nla) { + nla->nla_type = RTM_NEWQDISC; + nla->nla_len = nla_attr_size(sizeof(struct tc_fifo_qopt)); + ((struct tc_fifo_qopt *)nla_data(nla))->limit = limit; + + ret = q->ops->change(q, nla); + kfree(nla); + } + return ret; +} +EXPORT_SYMBOL(fifo_set_limit); + +struct Qdisc *fifo_create_dflt(struct Qdisc *sch, struct Qdisc_ops *ops, + unsigned int limit) +{ + struct Qdisc *q; + int err = -ENOMEM; + + q = qdisc_create_dflt(sch->dev_queue, ops, TC_H_MAKE(sch->handle, 1)); + if (q) { + err = fifo_set_limit(q, limit); + if (err < 0) { + qdisc_destroy(q); + q = NULL; + } + } + + return q ? : ERR_PTR(err); +} +EXPORT_SYMBOL(fifo_create_dflt); diff --git a/vendor/linux/net/sched/sch_fq.c b/vendor/linux/net/sched/sch_fq.c new file mode 100644 index 0000000..18e7524 --- /dev/null +++ b/vendor/linux/net/sched/sch_fq.c @@ -0,0 +1,920 @@ +/* + * net/sched/sch_fq.c Fair Queue Packet Scheduler (per flow pacing) + * + * Copyright (C) 2013-2015 Eric Dumazet + * + * This program 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. + * + * Meant to be mostly used for locally generated traffic : + * Fast classification depends on skb->sk being set before reaching us. + * If not, (router workload), we use rxhash as fallback, with 32 bits wide hash. + * All packets belonging to a socket are considered as a 'flow'. + * + * Flows are dynamically allocated and stored in a hash table of RB trees + * They are also part of one Round Robin 'queues' (new or old flows) + * + * Burst avoidance (aka pacing) capability : + * + * Transport (eg TCP) can set in sk->sk_pacing_rate a rate, enqueue a + * bunch of packets, and this packet scheduler adds delay between + * packets to respect rate limitation. + * + * enqueue() : + * - lookup one RB tree (out of 1024 or more) to find the flow. + * If non existent flow, create it, add it to the tree. + * Add skb to the per flow list of skb (fifo). + * - Use a special fifo for high prio packets + * + * dequeue() : serves flows in Round Robin + * Note : When a flow becomes empty, we do not immediately remove it from + * rb trees, for performance reasons (its expected to send additional packets, + * or SLAB cache will reuse socket for another flow) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Per flow structure, dynamically allocated + */ +struct fq_flow { + struct sk_buff *head; /* list of skbs for this flow : first skb */ + union { + struct sk_buff *tail; /* last skb in the list */ + unsigned long age; /* jiffies when flow was emptied, for gc */ + }; + struct rb_node fq_node; /* anchor in fq_root[] trees */ + struct sock *sk; + int qlen; /* number of packets in flow queue */ + int credit; + u32 socket_hash; /* sk_hash */ + struct fq_flow *next; /* next pointer in RR lists, or &detached */ + + struct rb_node rate_node; /* anchor in q->delayed tree */ + u64 time_next_packet; +}; + +struct fq_flow_head { + struct fq_flow *first; + struct fq_flow *last; +}; + +struct fq_sched_data { + struct fq_flow_head new_flows; + + struct fq_flow_head old_flows; + + struct rb_root delayed; /* for rate limited flows */ + u64 time_next_delayed_flow; + unsigned long unthrottle_latency_ns; + + struct fq_flow internal; /* for non classified or high prio packets */ + u32 quantum; + u32 initial_quantum; + u32 flow_refill_delay; + u32 flow_max_rate; /* optional max rate per flow */ + u32 flow_plimit; /* max packets per flow */ + u32 orphan_mask; /* mask for orphaned skb */ + u32 low_rate_threshold; + struct rb_root *fq_root; + u8 rate_enable; + u8 fq_trees_log; + + u32 flows; + u32 inactive_flows; + u32 throttled_flows; + + u64 stat_gc_flows; + u64 stat_internal_packets; + u64 stat_tcp_retrans; + u64 stat_throttled; + u64 stat_flows_plimit; + u64 stat_pkts_too_long; + u64 stat_allocation_errors; + struct qdisc_watchdog watchdog; +}; + +/* special value to mark a detached flow (not on old/new list) */ +static struct fq_flow detached, throttled; + +static void fq_flow_set_detached(struct fq_flow *f) +{ + f->next = &detached; + f->age = jiffies; +} + +static bool fq_flow_is_detached(const struct fq_flow *f) +{ + return f->next == &detached; +} + +static void fq_flow_set_throttled(struct fq_sched_data *q, struct fq_flow *f) +{ + struct rb_node **p = &q->delayed.rb_node, *parent = NULL; + + while (*p) { + struct fq_flow *aux; + + parent = *p; + aux = container_of(parent, struct fq_flow, rate_node); + if (f->time_next_packet >= aux->time_next_packet) + p = &parent->rb_right; + else + p = &parent->rb_left; + } + rb_link_node(&f->rate_node, parent, p); + rb_insert_color(&f->rate_node, &q->delayed); + q->throttled_flows++; + q->stat_throttled++; + + f->next = &throttled; + if (q->time_next_delayed_flow > f->time_next_packet) + q->time_next_delayed_flow = f->time_next_packet; +} + + +static struct kmem_cache *fq_flow_cachep __read_mostly; + +static void fq_flow_add_tail(struct fq_flow_head *head, struct fq_flow *flow) +{ + if (head->first) + head->last->next = flow; + else + head->first = flow; + head->last = flow; + flow->next = NULL; +} + +/* limit number of collected flows per round */ +#define FQ_GC_MAX 8 +#define FQ_GC_AGE (3*HZ) + +static bool fq_gc_candidate(const struct fq_flow *f) +{ + return fq_flow_is_detached(f) && + time_after(jiffies, f->age + FQ_GC_AGE); +} + +static void fq_gc(struct fq_sched_data *q, + struct rb_root *root, + struct sock *sk) +{ + struct fq_flow *f, *tofree[FQ_GC_MAX]; + struct rb_node **p, *parent; + int fcnt = 0; + + p = &root->rb_node; + parent = NULL; + while (*p) { + parent = *p; + + f = container_of(parent, struct fq_flow, fq_node); + if (f->sk == sk) + break; + + if (fq_gc_candidate(f)) { + tofree[fcnt++] = f; + if (fcnt == FQ_GC_MAX) + break; + } + + if (f->sk > sk) + p = &parent->rb_right; + else + p = &parent->rb_left; + } + + q->flows -= fcnt; + q->inactive_flows -= fcnt; + q->stat_gc_flows += fcnt; + while (fcnt) { + struct fq_flow *f = tofree[--fcnt]; + + rb_erase(&f->fq_node, root); + kmem_cache_free(fq_flow_cachep, f); + } +} + +static struct fq_flow *fq_classify(struct sk_buff *skb, struct fq_sched_data *q) +{ + struct rb_node **p, *parent; + struct sock *sk = skb->sk; + struct rb_root *root; + struct fq_flow *f; + + /* warning: no starvation prevention... */ + if (unlikely((skb->priority & TC_PRIO_MAX) == TC_PRIO_CONTROL)) + return &q->internal; + + /* SYNACK messages are attached to a TCP_NEW_SYN_RECV request socket + * or a listener (SYNCOOKIE mode) + * 1) request sockets are not full blown, + * they do not contain sk_pacing_rate + * 2) They are not part of a 'flow' yet + * 3) We do not want to rate limit them (eg SYNFLOOD attack), + * especially if the listener set SO_MAX_PACING_RATE + * 4) We pretend they are orphaned + */ + if (!sk || sk_listener(sk)) { + unsigned long hash = skb_get_hash(skb) & q->orphan_mask; + + /* By forcing low order bit to 1, we make sure to not + * collide with a local flow (socket pointers are word aligned) + */ + sk = (struct sock *)((hash << 1) | 1UL); + skb_orphan(skb); + } + + root = &q->fq_root[hash_32((u32)(long)sk, q->fq_trees_log)]; + + if (q->flows >= (2U << q->fq_trees_log) && + q->inactive_flows > q->flows/2) + fq_gc(q, root, sk); + + p = &root->rb_node; + parent = NULL; + while (*p) { + parent = *p; + + f = container_of(parent, struct fq_flow, fq_node); + if (f->sk == sk) { + /* socket might have been reallocated, so check + * if its sk_hash is the same. + * It not, we need to refill credit with + * initial quantum + */ + if (unlikely(skb->sk && + f->socket_hash != sk->sk_hash)) { + f->credit = q->initial_quantum; + f->socket_hash = sk->sk_hash; + f->time_next_packet = 0ULL; + } + return f; + } + if (f->sk > sk) + p = &parent->rb_right; + else + p = &parent->rb_left; + } + + f = kmem_cache_zalloc(fq_flow_cachep, GFP_ATOMIC | __GFP_NOWARN); + if (unlikely(!f)) { + q->stat_allocation_errors++; + return &q->internal; + } + fq_flow_set_detached(f); + f->sk = sk; + if (skb->sk) + f->socket_hash = sk->sk_hash; + f->credit = q->initial_quantum; + + rb_link_node(&f->fq_node, parent, p); + rb_insert_color(&f->fq_node, root); + + q->flows++; + q->inactive_flows++; + return f; +} + + +/* remove one skb from head of flow queue */ +static struct sk_buff *fq_dequeue_head(struct Qdisc *sch, struct fq_flow *flow) +{ + struct sk_buff *skb = flow->head; + + if (skb) { + flow->head = skb->next; + skb->next = NULL; + flow->qlen--; + qdisc_qstats_backlog_dec(sch, skb); + sch->q.qlen--; + } + return skb; +} + +/* We might add in the future detection of retransmits + * For the time being, just return false + */ +static bool skb_is_retransmit(struct sk_buff *skb) +{ + return false; +} + +/* add skb to flow queue + * flow queue is a linked list, kind of FIFO, except for TCP retransmits + * We special case tcp retransmits to be transmitted before other packets. + * We rely on fact that TCP retransmits are unlikely, so we do not waste + * a separate queue or a pointer. + * head-> [retrans pkt 1] + * [retrans pkt 2] + * [ normal pkt 1] + * [ normal pkt 2] + * [ normal pkt 3] + * tail-> [ normal pkt 4] + */ +static void flow_queue_add(struct fq_flow *flow, struct sk_buff *skb) +{ + struct sk_buff *prev, *head = flow->head; + + skb->next = NULL; + if (!head) { + flow->head = skb; + flow->tail = skb; + return; + } + if (likely(!skb_is_retransmit(skb))) { + flow->tail->next = skb; + flow->tail = skb; + return; + } + + /* This skb is a tcp retransmit, + * find the last retrans packet in the queue + */ + prev = NULL; + while (skb_is_retransmit(head)) { + prev = head; + head = head->next; + if (!head) + break; + } + if (!prev) { /* no rtx packet in queue, become the new head */ + skb->next = flow->head; + flow->head = skb; + } else { + if (prev == flow->tail) + flow->tail = skb; + else + skb->next = prev->next; + prev->next = skb; + } +} + +static int fq_enqueue(struct sk_buff *skb, struct Qdisc *sch, + struct sk_buff **to_free) +{ + struct fq_sched_data *q = qdisc_priv(sch); + struct fq_flow *f; + + if (unlikely(sch->q.qlen >= sch->limit)) + return qdisc_drop(skb, sch, to_free); + + f = fq_classify(skb, q); + if (unlikely(f->qlen >= q->flow_plimit && f != &q->internal)) { + q->stat_flows_plimit++; + return qdisc_drop(skb, sch, to_free); + } + + f->qlen++; + if (skb_is_retransmit(skb)) + q->stat_tcp_retrans++; + qdisc_qstats_backlog_inc(sch, skb); + if (fq_flow_is_detached(f)) { + fq_flow_add_tail(&q->new_flows, f); + if (time_after(jiffies, f->age + q->flow_refill_delay)) + f->credit = max_t(u32, f->credit, q->quantum); + q->inactive_flows--; + } + + /* Note: this overwrites f->age */ + flow_queue_add(f, skb); + + if (unlikely(f == &q->internal)) { + q->stat_internal_packets++; + } + sch->q.qlen++; + + return NET_XMIT_SUCCESS; +} + +static void fq_check_throttled(struct fq_sched_data *q, u64 now) +{ + unsigned long sample; + struct rb_node *p; + + if (q->time_next_delayed_flow > now) + return; + + /* Update unthrottle latency EWMA. + * This is cheap and can help diagnosing timer/latency problems. + */ + sample = (unsigned long)(now - q->time_next_delayed_flow); + q->unthrottle_latency_ns -= q->unthrottle_latency_ns >> 3; + q->unthrottle_latency_ns += sample >> 3; + + q->time_next_delayed_flow = ~0ULL; + while ((p = rb_first(&q->delayed)) != NULL) { + struct fq_flow *f = container_of(p, struct fq_flow, rate_node); + + if (f->time_next_packet > now) { + q->time_next_delayed_flow = f->time_next_packet; + break; + } + rb_erase(p, &q->delayed); + q->throttled_flows--; + fq_flow_add_tail(&q->old_flows, f); + } +} + +static struct sk_buff *fq_dequeue(struct Qdisc *sch) +{ + struct fq_sched_data *q = qdisc_priv(sch); + u64 now = ktime_get_ns(); + struct fq_flow_head *head; + struct sk_buff *skb; + struct fq_flow *f; + u32 rate, plen; + + skb = fq_dequeue_head(sch, &q->internal); + if (skb) + goto out; + fq_check_throttled(q, now); +begin: + head = &q->new_flows; + if (!head->first) { + head = &q->old_flows; + if (!head->first) { + if (q->time_next_delayed_flow != ~0ULL) + qdisc_watchdog_schedule_ns(&q->watchdog, + q->time_next_delayed_flow); + return NULL; + } + } + f = head->first; + + if (f->credit <= 0) { + f->credit += q->quantum; + head->first = f->next; + fq_flow_add_tail(&q->old_flows, f); + goto begin; + } + + skb = f->head; + if (unlikely(skb && now < f->time_next_packet && + !skb_is_tcp_pure_ack(skb))) { + head->first = f->next; + fq_flow_set_throttled(q, f); + goto begin; + } + + skb = fq_dequeue_head(sch, f); + if (!skb) { + head->first = f->next; + /* force a pass through old_flows to prevent starvation */ + if ((head == &q->new_flows) && q->old_flows.first) { + fq_flow_add_tail(&q->old_flows, f); + } else { + fq_flow_set_detached(f); + q->inactive_flows++; + } + goto begin; + } + prefetch(&skb->end); + f->credit -= qdisc_pkt_len(skb); + + if (!q->rate_enable) + goto out; + + /* Do not pace locally generated ack packets */ + if (skb_is_tcp_pure_ack(skb)) + goto out; + + rate = q->flow_max_rate; + if (skb->sk) + rate = min(skb->sk->sk_pacing_rate, rate); + + if (rate <= q->low_rate_threshold) { + f->credit = 0; + plen = qdisc_pkt_len(skb); + } else { + plen = max(qdisc_pkt_len(skb), q->quantum); + if (f->credit > 0) + goto out; + } + if (rate != ~0U) { + u64 len = (u64)plen * NSEC_PER_SEC; + + if (likely(rate)) + do_div(len, rate); + /* Since socket rate can change later, + * clamp the delay to 1 second. + * Really, providers of too big packets should be fixed ! + */ + if (unlikely(len > NSEC_PER_SEC)) { + len = NSEC_PER_SEC; + q->stat_pkts_too_long++; + } + /* Account for schedule/timers drifts. + * f->time_next_packet was set when prior packet was sent, + * and current time (@now) can be too late by tens of us. + */ + if (f->time_next_packet) + len -= min(len/2, now - f->time_next_packet); + f->time_next_packet = now + len; + } +out: + qdisc_bstats_update(sch, skb); + return skb; +} + +static void fq_flow_purge(struct fq_flow *flow) +{ + rtnl_kfree_skbs(flow->head, flow->tail); + flow->head = NULL; + flow->qlen = 0; +} + +static void fq_reset(struct Qdisc *sch) +{ + struct fq_sched_data *q = qdisc_priv(sch); + struct rb_root *root; + struct rb_node *p; + struct fq_flow *f; + unsigned int idx; + + sch->q.qlen = 0; + sch->qstats.backlog = 0; + + fq_flow_purge(&q->internal); + + if (!q->fq_root) + return; + + for (idx = 0; idx < (1U << q->fq_trees_log); idx++) { + root = &q->fq_root[idx]; + while ((p = rb_first(root)) != NULL) { + f = container_of(p, struct fq_flow, fq_node); + rb_erase(p, root); + + fq_flow_purge(f); + + kmem_cache_free(fq_flow_cachep, f); + } + } + q->new_flows.first = NULL; + q->old_flows.first = NULL; + q->delayed = RB_ROOT; + q->flows = 0; + q->inactive_flows = 0; + q->throttled_flows = 0; +} + +static void fq_rehash(struct fq_sched_data *q, + struct rb_root *old_array, u32 old_log, + struct rb_root *new_array, u32 new_log) +{ + struct rb_node *op, **np, *parent; + struct rb_root *oroot, *nroot; + struct fq_flow *of, *nf; + int fcnt = 0; + u32 idx; + + for (idx = 0; idx < (1U << old_log); idx++) { + oroot = &old_array[idx]; + while ((op = rb_first(oroot)) != NULL) { + rb_erase(op, oroot); + of = container_of(op, struct fq_flow, fq_node); + if (fq_gc_candidate(of)) { + fcnt++; + kmem_cache_free(fq_flow_cachep, of); + continue; + } + nroot = &new_array[hash_32((u32)(long)of->sk, new_log)]; + + np = &nroot->rb_node; + parent = NULL; + while (*np) { + parent = *np; + + nf = container_of(parent, struct fq_flow, fq_node); + BUG_ON(nf->sk == of->sk); + + if (nf->sk > of->sk) + np = &parent->rb_right; + else + np = &parent->rb_left; + } + + rb_link_node(&of->fq_node, parent, np); + rb_insert_color(&of->fq_node, nroot); + } + } + q->flows -= fcnt; + q->inactive_flows -= fcnt; + q->stat_gc_flows += fcnt; +} + +static void *fq_alloc_node(size_t sz, int node) +{ + void *ptr; + + ptr = kmalloc_node(sz, GFP_KERNEL | __GFP_REPEAT | __GFP_NOWARN, node); + if (!ptr) + ptr = vmalloc_node(sz, node); + return ptr; +} + +static void fq_free(void *addr) +{ + kvfree(addr); +} + +static int fq_resize(struct Qdisc *sch, u32 log) +{ + struct fq_sched_data *q = qdisc_priv(sch); + struct rb_root *array; + void *old_fq_root; + u32 idx; + + if (q->fq_root && log == q->fq_trees_log) + return 0; + + /* If XPS was setup, we can allocate memory on right NUMA node */ + array = fq_alloc_node(sizeof(struct rb_root) << log, + netdev_queue_numa_node_read(sch->dev_queue)); + if (!array) + return -ENOMEM; + + for (idx = 0; idx < (1U << log); idx++) + array[idx] = RB_ROOT; + + sch_tree_lock(sch); + + old_fq_root = q->fq_root; + if (old_fq_root) + fq_rehash(q, old_fq_root, q->fq_trees_log, array, log); + + q->fq_root = array; + q->fq_trees_log = log; + + sch_tree_unlock(sch); + + fq_free(old_fq_root); + + return 0; +} + +static const struct nla_policy fq_policy[TCA_FQ_MAX + 1] = { + [TCA_FQ_PLIMIT] = { .type = NLA_U32 }, + [TCA_FQ_FLOW_PLIMIT] = { .type = NLA_U32 }, + [TCA_FQ_QUANTUM] = { .type = NLA_U32 }, + [TCA_FQ_INITIAL_QUANTUM] = { .type = NLA_U32 }, + [TCA_FQ_RATE_ENABLE] = { .type = NLA_U32 }, + [TCA_FQ_FLOW_DEFAULT_RATE] = { .type = NLA_U32 }, + [TCA_FQ_FLOW_MAX_RATE] = { .type = NLA_U32 }, + [TCA_FQ_BUCKETS_LOG] = { .type = NLA_U32 }, + [TCA_FQ_FLOW_REFILL_DELAY] = { .type = NLA_U32 }, + [TCA_FQ_LOW_RATE_THRESHOLD] = { .type = NLA_U32 }, +}; + +static int fq_change(struct Qdisc *sch, struct nlattr *opt) +{ + struct fq_sched_data *q = qdisc_priv(sch); + struct nlattr *tb[TCA_FQ_MAX + 1]; + int err, drop_count = 0; + unsigned drop_len = 0; + u32 fq_log; + + if (!opt) + return -EINVAL; + + err = nla_parse_nested(tb, TCA_FQ_MAX, opt, fq_policy); + if (err < 0) + return err; + + sch_tree_lock(sch); + + fq_log = q->fq_trees_log; + + if (tb[TCA_FQ_BUCKETS_LOG]) { + u32 nval = nla_get_u32(tb[TCA_FQ_BUCKETS_LOG]); + + if (nval >= 1 && nval <= ilog2(256*1024)) + fq_log = nval; + else + err = -EINVAL; + } + if (tb[TCA_FQ_PLIMIT]) + sch->limit = nla_get_u32(tb[TCA_FQ_PLIMIT]); + + if (tb[TCA_FQ_FLOW_PLIMIT]) + q->flow_plimit = nla_get_u32(tb[TCA_FQ_FLOW_PLIMIT]); + + if (tb[TCA_FQ_QUANTUM]) { + u32 quantum = nla_get_u32(tb[TCA_FQ_QUANTUM]); + + if (quantum > 0) + q->quantum = quantum; + else + err = -EINVAL; + } + + if (tb[TCA_FQ_INITIAL_QUANTUM]) + q->initial_quantum = nla_get_u32(tb[TCA_FQ_INITIAL_QUANTUM]); + + if (tb[TCA_FQ_FLOW_DEFAULT_RATE]) + pr_warn_ratelimited("sch_fq: defrate %u ignored.\n", + nla_get_u32(tb[TCA_FQ_FLOW_DEFAULT_RATE])); + + if (tb[TCA_FQ_FLOW_MAX_RATE]) + q->flow_max_rate = nla_get_u32(tb[TCA_FQ_FLOW_MAX_RATE]); + + if (tb[TCA_FQ_LOW_RATE_THRESHOLD]) + q->low_rate_threshold = + nla_get_u32(tb[TCA_FQ_LOW_RATE_THRESHOLD]); + + if (tb[TCA_FQ_RATE_ENABLE]) { + u32 enable = nla_get_u32(tb[TCA_FQ_RATE_ENABLE]); + + if (enable <= 1) + q->rate_enable = enable; + else + err = -EINVAL; + } + + if (tb[TCA_FQ_FLOW_REFILL_DELAY]) { + u32 usecs_delay = nla_get_u32(tb[TCA_FQ_FLOW_REFILL_DELAY]) ; + + q->flow_refill_delay = usecs_to_jiffies(usecs_delay); + } + + if (tb[TCA_FQ_ORPHAN_MASK]) + q->orphan_mask = nla_get_u32(tb[TCA_FQ_ORPHAN_MASK]); + + if (!err) { + sch_tree_unlock(sch); + err = fq_resize(sch, fq_log); + sch_tree_lock(sch); + } + while (sch->q.qlen > sch->limit) { + struct sk_buff *skb = fq_dequeue(sch); + + if (!skb) + break; + drop_len += qdisc_pkt_len(skb); + rtnl_kfree_skbs(skb, skb); + drop_count++; + } + qdisc_tree_reduce_backlog(sch, drop_count, drop_len); + + sch_tree_unlock(sch); + return err; +} + +static void fq_destroy(struct Qdisc *sch) +{ + struct fq_sched_data *q = qdisc_priv(sch); + + fq_reset(sch); + fq_free(q->fq_root); + qdisc_watchdog_cancel(&q->watchdog); +} + +static int fq_init(struct Qdisc *sch, struct nlattr *opt) +{ + struct fq_sched_data *q = qdisc_priv(sch); + int err; + + sch->limit = 10000; + q->flow_plimit = 100; + q->quantum = 2 * psched_mtu(qdisc_dev(sch)); + q->initial_quantum = 10 * psched_mtu(qdisc_dev(sch)); + q->flow_refill_delay = msecs_to_jiffies(40); + q->flow_max_rate = ~0U; + q->time_next_delayed_flow = ~0ULL; + q->rate_enable = 1; + q->new_flows.first = NULL; + q->old_flows.first = NULL; + q->delayed = RB_ROOT; + q->fq_root = NULL; + q->fq_trees_log = ilog2(1024); + q->orphan_mask = 1024 - 1; + q->low_rate_threshold = 550000 / 8; + qdisc_watchdog_init(&q->watchdog, sch); + + if (opt) + err = fq_change(sch, opt); + else + err = fq_resize(sch, q->fq_trees_log); + + return err; +} + +static int fq_dump(struct Qdisc *sch, struct sk_buff *skb) +{ + struct fq_sched_data *q = qdisc_priv(sch); + struct nlattr *opts; + + opts = nla_nest_start(skb, TCA_OPTIONS); + if (opts == NULL) + goto nla_put_failure; + + /* TCA_FQ_FLOW_DEFAULT_RATE is not used anymore */ + + if (nla_put_u32(skb, TCA_FQ_PLIMIT, sch->limit) || + nla_put_u32(skb, TCA_FQ_FLOW_PLIMIT, q->flow_plimit) || + nla_put_u32(skb, TCA_FQ_QUANTUM, q->quantum) || + nla_put_u32(skb, TCA_FQ_INITIAL_QUANTUM, q->initial_quantum) || + nla_put_u32(skb, TCA_FQ_RATE_ENABLE, q->rate_enable) || + nla_put_u32(skb, TCA_FQ_FLOW_MAX_RATE, q->flow_max_rate) || + nla_put_u32(skb, TCA_FQ_FLOW_REFILL_DELAY, + jiffies_to_usecs(q->flow_refill_delay)) || + nla_put_u32(skb, TCA_FQ_ORPHAN_MASK, q->orphan_mask) || + nla_put_u32(skb, TCA_FQ_LOW_RATE_THRESHOLD, + q->low_rate_threshold) || + nla_put_u32(skb, TCA_FQ_BUCKETS_LOG, q->fq_trees_log)) + goto nla_put_failure; + + return nla_nest_end(skb, opts); + +nla_put_failure: + return -1; +} + +static int fq_dump_stats(struct Qdisc *sch, struct gnet_dump *d) +{ + struct fq_sched_data *q = qdisc_priv(sch); + struct tc_fq_qd_stats st; + + sch_tree_lock(sch); + + st.gc_flows = q->stat_gc_flows; + st.highprio_packets = q->stat_internal_packets; + st.tcp_retrans = q->stat_tcp_retrans; + st.throttled = q->stat_throttled; + st.flows_plimit = q->stat_flows_plimit; + st.pkts_too_long = q->stat_pkts_too_long; + st.allocation_errors = q->stat_allocation_errors; + st.time_next_delayed_flow = q->time_next_delayed_flow - ktime_get_ns(); + st.flows = q->flows; + st.inactive_flows = q->inactive_flows; + st.throttled_flows = q->throttled_flows; + st.unthrottle_latency_ns = min_t(unsigned long, + q->unthrottle_latency_ns, ~0U); + sch_tree_unlock(sch); + + return gnet_stats_copy_app(d, &st, sizeof(st)); +} + +static struct Qdisc_ops fq_qdisc_ops __read_mostly = { + .id = "fq", + .priv_size = sizeof(struct fq_sched_data), + + .enqueue = fq_enqueue, + .dequeue = fq_dequeue, + .peek = qdisc_peek_dequeued, + .init = fq_init, + .reset = fq_reset, + .destroy = fq_destroy, + .change = fq_change, + .dump = fq_dump, + .dump_stats = fq_dump_stats, + .owner = THIS_MODULE, +}; + +static int __init fq_module_init(void) +{ + int ret; + + fq_flow_cachep = kmem_cache_create("fq_flow_cache", + sizeof(struct fq_flow), + 0, 0, NULL); + if (!fq_flow_cachep) + return -ENOMEM; + + ret = register_qdisc(&fq_qdisc_ops); + if (ret) + kmem_cache_destroy(fq_flow_cachep); + return ret; +} + +static void __exit fq_module_exit(void) +{ + unregister_qdisc(&fq_qdisc_ops); + kmem_cache_destroy(fq_flow_cachep); +} + +module_init(fq_module_init) +module_exit(fq_module_exit) +MODULE_AUTHOR("Eric Dumazet"); +MODULE_LICENSE("GPL"); diff --git a/vendor/linux/tools/lkl/include/lkl.h b/vendor/linux/tools/lkl/include/lkl.h index a4fb9f2..16a2caa 100644 --- a/vendor/linux/tools/lkl/include/lkl.h +++ b/vendor/linux/tools/lkl/include/lkl.h @@ -15,6 +15,10 @@ extern "C" { #undef class #endif +#if defined(__MINGW32__) +#define strtok_r strtok_s +#endif + #if __LKL__BITS_PER_LONG == 64 #define lkl_sys_stat lkl_sys_newstat #define lkl_sys_lstat lkl_sys_newlstat @@ -461,6 +465,39 @@ int lkl_if_wait_ipv6_dad(int ifindex, void *addr); */ int lkl_set_fd_limit(unsigned int fd_limit); +/** + * lkl_qdisc_add - set qdisc rule onto an interface + * + * @ifindex - the ifindex of the interface + * @root - the name of root class (e.g., "root"); + * @type - the type of qdisc (e.g., "fq") + */ +int lkl_qdisc_add(int ifindex, char *root, char *type); + +/** + * lkl_qdisc_parse_add - Add a qdisc entry for an interface with strings + * + * @ifindex - the ifindex of the interface + * @entries - strings of qdisc configurations in the form of + * "root|type;root|type;..." + */ +void lkl_qdisc_parse_add(int ifindex, char *entries); + +/** + * lkl_sysctl - write a sysctl value + * + * @path - the path to an sysctl entry (e.g., "net.ipv4.tcp_wmem"); + * @value - the value of the sysctl (e.g., "4096 87380 2147483647") + */ +int lkl_sysctl(const char *path, const char *value); + +/** + * lkl_sysctl_parse_write - Configure sysctl parameters with strings + * + * @sysctls - Configure sysctl parameters as the form of "key=value;..." + */ +void lkl_sysctl_parse_write(const char *sysctls); + #ifdef __cplusplus } #endif diff --git a/vendor/linux/tools/lkl/lib/net.c b/vendor/linux/tools/lkl/lib/net.c index 1e5b7eb..ffd1f43 100644 --- a/vendor/linux/tools/lkl/lib/net.c +++ b/vendor/linux/tools/lkl/lib/net.c @@ -529,3 +529,67 @@ int lkl_if_del_ip(int ifindex, int af, void *addr, unsigned int netprefix_len) return ipaddr_modify(LKL_RTM_DELADDR, 0, ifindex, af, addr, netprefix_len); } + +static int qdisc_add(int cmd, int flags, int ifindex, + char *root, char *type) +{ + struct { + struct lkl_nlmsghdr n; + struct lkl_tcmsg tc; + char buf[64*1024]; + } req = { + .n.nlmsg_len = LKL_NLMSG_LENGTH(sizeof(struct lkl_tcmsg)), + .n.nlmsg_flags = LKL_NLM_F_REQUEST|flags, + .n.nlmsg_type = cmd, + .tc.tcm_family = LKL_AF_UNSPEC, + }; + int err, fd; + + if (!root || !type) { + lkl_printf("root and type arguments\n"); + return -1; + } + + if (strcmp(root, "root") == 0) + req.tc.tcm_parent = LKL_TC_H_ROOT; + req.tc.tcm_ifindex = ifindex; + + fd = netlink_sock(0); + if (fd < 0) + return fd; + + // create the qdisc attribute + addattr_l(&req.n, sizeof(req), LKL_TCA_KIND, type, 2); + + err = rtnl_talk(fd, &req.n); + lkl_sys_close(fd); + return err; +} + +int lkl_qdisc_add(int ifindex, char *root, char *type) +{ + return qdisc_add(LKL_RTM_NEWQDISC, LKL_NLM_F_CREATE | LKL_NLM_F_EXCL, + ifindex, root, type); +} + +/* Add a qdisc entry for an interface in the form of + * "root|type;root|type;..." + */ +void lkl_qdisc_parse_add(int ifindex, char *entries) +{ + char *saveptr = NULL, *token = NULL; + char *root = NULL, *type = NULL; + int ret = 0; + + for (token = strtok_r(entries, ";", &saveptr); token; + token = strtok_r(NULL, ";", &saveptr)) { + root = strtok(token, "|"); + type = strtok(NULL, "|"); + ret = lkl_qdisc_add(ifindex, root, type); + if (ret) { + lkl_printf("Failed to add qdisc entry: %s\n", + lkl_strerror(ret)); + return; + } + } +} diff --git a/vendor/linux/tools/lkl/lib/utils.c b/vendor/linux/tools/lkl/lib/utils.c index b4631e0..af69b15 100644 --- a/vendor/linux/tools/lkl/lib/utils.c +++ b/vendor/linux/tools/lkl/lib/utils.c @@ -1,5 +1,6 @@ #include #include +#include #include static const char * const lkl_err_strings[] = { @@ -205,3 +206,58 @@ void lkl_bug(const char *fmt, ...) lkl_host_ops.panic(); } + +int lkl_sysctl(const char *path, const char *value) +{ + int ret; + int fd; + char *delim, *p; + char full_path[256]; + + lkl_mount_fs("proc"); + + snprintf(full_path, sizeof(full_path), "/proc/sys/%s", path); + p = full_path; + while ((delim = strstr(p, "."))) { + *delim = '/'; + p = delim + 1; + } + + fd = lkl_sys_open(full_path, LKL_O_WRONLY | LKL_O_CREAT, 0); + if (fd < 0) { + lkl_printf("lkl_sys_open %s: %s\n", + full_path, lkl_strerror(fd)); + return -1; + } + ret = lkl_sys_write(fd, value, strlen(value)); + if (ret < 0) { + lkl_printf("lkl_sys_write %s: %s\n", + full_path, lkl_strerror(fd)); + } + + lkl_sys_close(fd); + + return 0; +} + +/* Configure sysctl parameters as the form of "key=value;key=value;..." */ +void lkl_sysctl_parse_write(const char *sysctls) +{ + char *saveptr = NULL, *token = NULL; + char *key = NULL, *value = NULL; + char strings[256]; + int ret = 0; + + strcpy(strings, sysctls); + for (token = strtok_r(strings, ";", &saveptr); token; + token = strtok_r(NULL, ";", &saveptr)) { + key = strtok(token, "="); + value = strtok(NULL, "="); + ret = lkl_sysctl(key, value); + if (ret) { + lkl_printf("Failed to configure sysctl entries: %s\n", + lkl_strerror(ret)); + return; + } + } +} diff --git a/vendor/linux/tools/lkl/lib/virtio_net_tap.c b/vendor/linux/tools/lkl/lib/virtio_net_tap.c index 60bf1fd..c8979ce 100644 --- a/vendor/linux/tools/lkl/lib/virtio_net_tap.c +++ b/vendor/linux/tools/lkl/lib/virtio_net_tap.c @@ -34,14 +34,16 @@ struct lkl_netdev *lkl_netdev_tap_init(const char *path, int offload, if (offload & (BIT(LKL_VIRTIO_NET_F_GUEST_TSO4) | BIT(LKL_VIRTIO_NET_F_MRG_RXBUF))) tap_arg |= TUN_F_TSO4 | TUN_F_CSUM; + if (offload & (BIT(LKL_VIRTIO_NET_F_GUEST_TSO6))) + tap_arg |= TUN_F_TSO6 | TUN_F_CSUM; if (tap_arg || (offload & (BIT(LKL_VIRTIO_NET_F_CSUM) | - BIT(LKL_VIRTIO_NET_F_HOST_TSO4)))) { + BIT(LKL_VIRTIO_NET_F_HOST_TSO4) | + BIT(LKL_VIRTIO_NET_F_HOST_TSO6)))) { ifr->ifr_flags |= IFF_VNET_HDR; vnet_hdr_sz = sizeof(struct lkl_virtio_net_hdr_v1); } - fd = open(path, O_RDWR|O_NONBLOCK); if (fd < 0) { perror("open");