bitkeeper revision 1.411 (3f592cf2ZW4sVWHIw4rRCGs-4LMYUw)

Update to linux 2.4.22
This commit is contained in:
iap10@labyrinth.cl.cam.ac.uk committed 2003-09-06 00:40:18 +00:00
1 parent 6cfc86805a
commit 514adcf9f1
89 files changed
+1401 -344

No files matched your search

+88 -88
View File
@@ -508,91 +508,91 @@
3eb3c87fmKYTC5GCh_rydFakZp9ayw xen/tools/figlet/README
3eb3c87fdQKQ5OBGbM-KjZfi9Us4ng xen/tools/figlet/figlet.c
3eb3c87fS7DNbg0i6yhFs28UIqAK5g xen/tools/figlet/xen.flf
3f05a939TA3SLPY7ZiScMotLjg9owQ xenolinux-2.4.21-sparse/Documentation/Configure.help
3e5a4e6589G-U42lFKs43plskXoFxQ xenolinux-2.4.21-sparse/Makefile
3e5a4e65IEPjnWPZ5w3TxS5scV8Ewg xenolinux-2.4.21-sparse/arch/xeno/Makefile
3e5a4e65n-KhsEAs-A4ULiStBp-r6w xenolinux-2.4.21-sparse/arch/xeno/boot/Makefile
3e5a4e65OV_j_DBtjzt5vej771AJsA xenolinux-2.4.21-sparse/arch/xeno/config.in
3e5a4e65TNEycLeXqPSXQJQm_xGecA xenolinux-2.4.21-sparse/arch/xeno/defconfig
3e6377f5xwPfYZkPHPrDbEq1PRN7uQ xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/Makefile
3e6377f8Me8IqtvEhb70XFgOvqQH7A xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/balloon.c
3e6377fbMjXWAQd0XN0FWv4fDEo6fg xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/dom_mem_ops.h
3e5a4e65iHEuC5sjFhj42XALYbLVRw xenolinux-2.4.21-sparse/arch/xeno/drivers/block/Makefile
3e5a4e65pP5spJErBW69pJxSSdK9RA xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.c
3e67f822FOPwqHiaRKbrskgWgoNL5g xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.h
3e677190SjkzJIvFifRVeYpIZOCtYA xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_ide.c
3e677193nOKKTLJzcAu4SYdbZaia8g xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_scsi.c
3e676eb5RXnHzSHgA1BvM0B1aIm4qg xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_segment.c
3e5d129aDldt6geU2-2SzBae34sQzg xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_segment_proc.c
3e5a4e65G3e2s0ghPMgiJ-gBTUJ0uQ xenolinux-2.4.21-sparse/arch/xeno/drivers/console/Makefile
3e5a4e651TH-SXHoufurnWjgl5bfOA xenolinux-2.4.21-sparse/arch/xeno/drivers/console/console.c
3e5a4e656nfFISThfbyXQOA6HN6YHw xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/Makefile
3e5a4e65BXtftInNHUC2PjDfPhdZZA xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/dom0_core.c
3e5a4e65gfn_ltB8ujHMVFApnTTNRQ xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/vfr.c
3e5a4e65gZBRBB6RsSVg1c9iahigAw xenolinux-2.4.21-sparse/arch/xeno/drivers/network/Makefile
3e5a4e65ZxKrbFetVB84JhrTyZ1YuQ xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c
3e5a4e65lWzkiPXsZdzPt2RNnJGG1g xenolinux-2.4.21-sparse/arch/xeno/kernel/Makefile
3e5a4e65_hqfuxtGG8IUy6wRM86Ecg xenolinux-2.4.21-sparse/arch/xeno/kernel/entry.S
3e5a4e65Hy_1iUvMTPsNqGNXd9uFpg xenolinux-2.4.21-sparse/arch/xeno/kernel/head.S
3e5a4e65ibVQmwlOn0j3sVH_j_6hAg xenolinux-2.4.21-sparse/arch/xeno/kernel/hypervisor.c
3e5a4e65RMGcuA-HCn3-wNx3fFQwdg xenolinux-2.4.21-sparse/arch/xeno/kernel/i386_ksyms.c
3e5a4e65MEvZhlr070sK5JsfAQlv7Q xenolinux-2.4.21-sparse/arch/xeno/kernel/ioport.c
3e5a4e653U6cELGv528IxOLHvCq8iA xenolinux-2.4.21-sparse/arch/xeno/kernel/irq.c
3e5a4e65muT6SU3ck47IP87Q7Ti5hA xenolinux-2.4.21-sparse/arch/xeno/kernel/ldt.c
3e5a4e65IGt3WwQDNiL4h-gYWgNTWQ xenolinux-2.4.21-sparse/arch/xeno/kernel/process.c
3e5a4e66tR-qJMLj3MppcKqmvuI2XQ xenolinux-2.4.21-sparse/arch/xeno/kernel/setup.c
3e5a4e66fWSTagLGU2P8BGFGRjhDiw xenolinux-2.4.21-sparse/arch/xeno/kernel/signal.c
3e5a4e66N__lUXNwzQ-eADRzK9LXuQ xenolinux-2.4.21-sparse/arch/xeno/kernel/time.c
3e5a4e66aHCbQ_F5QZ8VeyikLmuRZQ xenolinux-2.4.21-sparse/arch/xeno/kernel/traps.c
3e5a4e66-9_NczrVMbuQkoSLyXckIw xenolinux-2.4.21-sparse/arch/xeno/lib/Makefile
3e5a4e6637ZDk0BvFEC-aFQs599-ng xenolinux-2.4.21-sparse/arch/xeno/lib/delay.c
3e5a4e66croVgpcJyJuF2ycQw0HuJw xenolinux-2.4.21-sparse/arch/xeno/mm/Makefile
3e5a4e66l8Q5Tv-6B3lQIRmaVbFPzg xenolinux-2.4.21-sparse/arch/xeno/mm/fault.c
3e5a4e668SE9rixq4ahho9rNhLUUFQ xenolinux-2.4.21-sparse/arch/xeno/mm/hypervisor.c
3e5a4e661gLzzff25pJooKIIWe7IWg xenolinux-2.4.21-sparse/arch/xeno/mm/init.c
3f0bed43UUdQichXAiVNrjV-y2Kzcg xenolinux-2.4.21-sparse/arch/xeno/mm/ioremap.c
3e5a4e66qRlSTcjafidMB6ulECADvg xenolinux-2.4.21-sparse/arch/xeno/vmlinux.lds
3ea53c6em6uzVHSiGqrbbAVofyRY_g xenolinux-2.4.21-sparse/drivers/block/genhd.c
3e5a4e66mrtlmV75L1tjKDg8RaM5gA xenolinux-2.4.21-sparse/drivers/block/ll_rw_blk.c
3f108aeaLcGDgQdFAANLTUEid0a05w xenolinux-2.4.21-sparse/drivers/char/mem.c
3e5a4e66rw65CxyolW9PKz4GG42RcA xenolinux-2.4.21-sparse/drivers/char/tty_io.c
3e5a4e669uzIE54VwucPYtGwXLAbzA xenolinux-2.4.21-sparse/fs/exec.c
3f05a939l8s0eQb_fpMvYiI06cTGlA xenolinux-2.4.21-sparse/fs/partitions/Config.in
3f05a939W65febbeWrBtuQgsQDK2Bg xenolinux-2.4.21-sparse/fs/partitions/Makefile
3f05a939phguW4R5PelNQZ8o_EcYZA xenolinux-2.4.21-sparse/fs/partitions/check.c
3f05a939ZSKN7gX2sfTLzPcYJvPkcQ xenolinux-2.4.21-sparse/fs/partitions/xeno.c
3f05a939_I9vPADPgyVBwUDUxtoeOQ xenolinux-2.4.21-sparse/fs/partitions/xeno.h
3e5a4e66wbeCpsJgVf_U8Jde-CNcsA xenolinux-2.4.21-sparse/include/asm-xeno/bugs.h
3e5a4e66HdSkvIV6SJ1evG_xmTmXHA xenolinux-2.4.21-sparse/include/asm-xeno/desc.h
3e5a4e66SYp_UpAVcF8Lc1wa3Qtgzw xenolinux-2.4.21-sparse/include/asm-xeno/fixmap.h
3e5a4e67w_DWgjIJ17Tlossu1LGujQ xenolinux-2.4.21-sparse/include/asm-xeno/highmem.h
3e5a4e67YtcyDLQsShhCfQwPSELfvA xenolinux-2.4.21-sparse/include/asm-xeno/hw_irq.h
3e5a4e677VBavzM1UZIEcH1B-RlXMA xenolinux-2.4.21-sparse/include/asm-xeno/hypervisor.h
3e5a4e673p7PEOyHFm3nHkYX6HQYBg xenolinux-2.4.21-sparse/include/asm-xeno/irq.h
3ead095db_LRUXnxaqs0dA1DWhPoQQ xenolinux-2.4.21-sparse/include/asm-xeno/keyboard.h
3e5a4e678ddsQOpbSiRdy1GRcDc9WA xenolinux-2.4.21-sparse/include/asm-xeno/mmu_context.h
3e7270deQqtGPSnFxcW4AvJZuTUWfg xenolinux-2.4.21-sparse/include/asm-xeno/multicall.h
3e5a4e67mnQfh-R8KcQCaVo2Oho6yg xenolinux-2.4.21-sparse/include/asm-xeno/page.h
3e5a4e67uTYU5oEnIDjxuaez8njjqg xenolinux-2.4.21-sparse/include/asm-xeno/pgalloc.h
3e5a4e67X7JyupgdYkgDX19Huj2sAw xenolinux-2.4.21-sparse/include/asm-xeno/pgtable-2level.h
3e5a4e67gr4NLGtQ5CvSLimMYZlkOA xenolinux-2.4.21-sparse/include/asm-xeno/pgtable.h
3f108af1qNv8DVSGPv4zpqIU1txCkg xenolinux-2.4.21-sparse/include/asm-xeno/proc_cmd.h
3e5a4e676uK4xErTBDH6XJREn9LSyg xenolinux-2.4.21-sparse/include/asm-xeno/processor.h
3e5a4e67AJPjW-zL7p-xWuA6IVeH1g xenolinux-2.4.21-sparse/include/asm-xeno/ptrace.h
3e5a4e68uJz-xI0IBVMD7xRLQKJDFg xenolinux-2.4.21-sparse/include/asm-xeno/segment.h
3e5a4e68Nfdh6QcOKUTGCaYkf2LmYA xenolinux-2.4.21-sparse/include/asm-xeno/smp.h
3e5a4e68mTr0zcp9SXDbnd-XLrrfxw xenolinux-2.4.21-sparse/include/asm-xeno/system.h
3f1056a9L_kqHcFheV00KbKBzv9j5w xenolinux-2.4.21-sparse/include/asm-xeno/vga.h
3f056927gMHl7mWB89rb73JahbhQIA xenolinux-2.4.21-sparse/include/linux/blk.h
3e5a4e68WLX3B8owTvktP3HHOtznPQ xenolinux-2.4.21-sparse/include/linux/major.h
3e5a4e686V0nioX2ZpFf056sgvdiQw xenolinux-2.4.21-sparse/include/linux/sunrpc/debug.h
3e5a4e68W_hpMlM3u_-QOKMp3gzcwQ xenolinux-2.4.21-sparse/init/do_mounts.c
3e5a4e68TJJavrunYwTAnLRSBxSYqQ xenolinux-2.4.21-sparse/kernel/panic.c
3f1056a9LXNTgSzITNh1mb-MIKV1Ng xenolinux-2.4.21-sparse/kernel/printk.c
3eba8f878XjouY21EkQBXwYBsPsipQ xenolinux-2.4.21-sparse/lndir-rel
3e6e7c1efbQe93xCvOpOVCnXTMmQ5w xenolinux-2.4.21-sparse/mkbuildtree
3e5a4e68GxCIaFH4sy01v1wjapetaA xenolinux-2.4.21-sparse/mm/memory.c
3f108af5VxPkLv13tXpXgoRKALQtXQ xenolinux-2.4.21-sparse/mm/mprotect.c
3e5a4e681xMPdF9xCMwpyfuYMySU5g xenolinux-2.4.21-sparse/mm/mremap.c
3e5a4e683HKVU-sxtagrDasRB8eBVw xenolinux-2.4.21-sparse/mm/swapfile.c
3f108af81Thhb242EmKjGCYkjx-GJA xenolinux-2.4.21-sparse/mm/vmalloc.c
3f05a939TA3SLPY7ZiScMotLjg9owQ xenolinux-2.4.22-sparse/Documentation/Configure.help
3e5a4e6589G-U42lFKs43plskXoFxQ xenolinux-2.4.22-sparse/Makefile
3e5a4e65IEPjnWPZ5w3TxS5scV8Ewg xenolinux-2.4.22-sparse/arch/xeno/Makefile
3e5a4e65n-KhsEAs-A4ULiStBp-r6w xenolinux-2.4.22-sparse/arch/xeno/boot/Makefile
3e5a4e65OV_j_DBtjzt5vej771AJsA xenolinux-2.4.22-sparse/arch/xeno/config.in
3e5a4e65TNEycLeXqPSXQJQm_xGecA xenolinux-2.4.22-sparse/arch/xeno/defconfig
3e6377f5xwPfYZkPHPrDbEq1PRN7uQ xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/Makefile
3e6377f8Me8IqtvEhb70XFgOvqQH7A xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/balloon.c
3e6377fbMjXWAQd0XN0FWv4fDEo6fg xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/dom_mem_ops.h
3e5a4e65iHEuC5sjFhj42XALYbLVRw xenolinux-2.4.22-sparse/arch/xeno/drivers/block/Makefile
3e5a4e65pP5spJErBW69pJxSSdK9RA xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.c
3e67f822FOPwqHiaRKbrskgWgoNL5g xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.h
3e677190SjkzJIvFifRVeYpIZOCtYA xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_ide.c
3e677193nOKKTLJzcAu4SYdbZaia8g xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_scsi.c
3e676eb5RXnHzSHgA1BvM0B1aIm4qg xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_segment.c
3e5d129aDldt6geU2-2SzBae34sQzg xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_segment_proc.c
3e5a4e65G3e2s0ghPMgiJ-gBTUJ0uQ xenolinux-2.4.22-sparse/arch/xeno/drivers/console/Makefile
3e5a4e651TH-SXHoufurnWjgl5bfOA xenolinux-2.4.22-sparse/arch/xeno/drivers/console/console.c
3e5a4e656nfFISThfbyXQOA6HN6YHw xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/Makefile
3e5a4e65BXtftInNHUC2PjDfPhdZZA xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/dom0_core.c
3e5a4e65gfn_ltB8ujHMVFApnTTNRQ xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/vfr.c
3e5a4e65gZBRBB6RsSVg1c9iahigAw xenolinux-2.4.22-sparse/arch/xeno/drivers/network/Makefile
3e5a4e65ZxKrbFetVB84JhrTyZ1YuQ xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c
3e5a4e65lWzkiPXsZdzPt2RNnJGG1g xenolinux-2.4.22-sparse/arch/xeno/kernel/Makefile
3e5a4e65_hqfuxtGG8IUy6wRM86Ecg xenolinux-2.4.22-sparse/arch/xeno/kernel/entry.S
3e5a4e65Hy_1iUvMTPsNqGNXd9uFpg xenolinux-2.4.22-sparse/arch/xeno/kernel/head.S
3e5a4e65ibVQmwlOn0j3sVH_j_6hAg xenolinux-2.4.22-sparse/arch/xeno/kernel/hypervisor.c
3e5a4e65RMGcuA-HCn3-wNx3fFQwdg xenolinux-2.4.22-sparse/arch/xeno/kernel/i386_ksyms.c
3e5a4e65MEvZhlr070sK5JsfAQlv7Q xenolinux-2.4.22-sparse/arch/xeno/kernel/ioport.c
3e5a4e653U6cELGv528IxOLHvCq8iA xenolinux-2.4.22-sparse/arch/xeno/kernel/irq.c
3e5a4e65muT6SU3ck47IP87Q7Ti5hA xenolinux-2.4.22-sparse/arch/xeno/kernel/ldt.c
3e5a4e65IGt3WwQDNiL4h-gYWgNTWQ xenolinux-2.4.22-sparse/arch/xeno/kernel/process.c
3e5a4e66tR-qJMLj3MppcKqmvuI2XQ xenolinux-2.4.22-sparse/arch/xeno/kernel/setup.c
3e5a4e66fWSTagLGU2P8BGFGRjhDiw xenolinux-2.4.22-sparse/arch/xeno/kernel/signal.c
3e5a4e66N__lUXNwzQ-eADRzK9LXuQ xenolinux-2.4.22-sparse/arch/xeno/kernel/time.c
3e5a4e66aHCbQ_F5QZ8VeyikLmuRZQ xenolinux-2.4.22-sparse/arch/xeno/kernel/traps.c
3e5a4e66-9_NczrVMbuQkoSLyXckIw xenolinux-2.4.22-sparse/arch/xeno/lib/Makefile
3e5a4e6637ZDk0BvFEC-aFQs599-ng xenolinux-2.4.22-sparse/arch/xeno/lib/delay.c
3e5a4e66croVgpcJyJuF2ycQw0HuJw xenolinux-2.4.22-sparse/arch/xeno/mm/Makefile
3e5a4e66l8Q5Tv-6B3lQIRmaVbFPzg xenolinux-2.4.22-sparse/arch/xeno/mm/fault.c
3e5a4e668SE9rixq4ahho9rNhLUUFQ xenolinux-2.4.22-sparse/arch/xeno/mm/hypervisor.c
3e5a4e661gLzzff25pJooKIIWe7IWg xenolinux-2.4.22-sparse/arch/xeno/mm/init.c
3f0bed43UUdQichXAiVNrjV-y2Kzcg xenolinux-2.4.22-sparse/arch/xeno/mm/ioremap.c
3e5a4e66qRlSTcjafidMB6ulECADvg xenolinux-2.4.22-sparse/arch/xeno/vmlinux.lds
3ea53c6em6uzVHSiGqrbbAVofyRY_g xenolinux-2.4.22-sparse/drivers/block/genhd.c
3e5a4e66mrtlmV75L1tjKDg8RaM5gA xenolinux-2.4.22-sparse/drivers/block/ll_rw_blk.c
3f108aeaLcGDgQdFAANLTUEid0a05w xenolinux-2.4.22-sparse/drivers/char/mem.c
3e5a4e66rw65CxyolW9PKz4GG42RcA xenolinux-2.4.22-sparse/drivers/char/tty_io.c
3e5a4e669uzIE54VwucPYtGwXLAbzA xenolinux-2.4.22-sparse/fs/exec.c
3f05a939l8s0eQb_fpMvYiI06cTGlA xenolinux-2.4.22-sparse/fs/partitions/Config.in
3f05a939W65febbeWrBtuQgsQDK2Bg xenolinux-2.4.22-sparse/fs/partitions/Makefile
3f05a939phguW4R5PelNQZ8o_EcYZA xenolinux-2.4.22-sparse/fs/partitions/check.c
3f05a939ZSKN7gX2sfTLzPcYJvPkcQ xenolinux-2.4.22-sparse/fs/partitions/xeno.c
3f05a939_I9vPADPgyVBwUDUxtoeOQ xenolinux-2.4.22-sparse/fs/partitions/xeno.h
3e5a4e66wbeCpsJgVf_U8Jde-CNcsA xenolinux-2.4.22-sparse/include/asm-xeno/bugs.h
3e5a4e66HdSkvIV6SJ1evG_xmTmXHA xenolinux-2.4.22-sparse/include/asm-xeno/desc.h
3e5a4e66SYp_UpAVcF8Lc1wa3Qtgzw xenolinux-2.4.22-sparse/include/asm-xeno/fixmap.h
3e5a4e67w_DWgjIJ17Tlossu1LGujQ xenolinux-2.4.22-sparse/include/asm-xeno/highmem.h
3e5a4e67YtcyDLQsShhCfQwPSELfvA xenolinux-2.4.22-sparse/include/asm-xeno/hw_irq.h
3e5a4e677VBavzM1UZIEcH1B-RlXMA xenolinux-2.4.22-sparse/include/asm-xeno/hypervisor.h
3e5a4e673p7PEOyHFm3nHkYX6HQYBg xenolinux-2.4.22-sparse/include/asm-xeno/irq.h
3ead095db_LRUXnxaqs0dA1DWhPoQQ xenolinux-2.4.22-sparse/include/asm-xeno/keyboard.h
3e5a4e678ddsQOpbSiRdy1GRcDc9WA xenolinux-2.4.22-sparse/include/asm-xeno/mmu_context.h
3e7270deQqtGPSnFxcW4AvJZuTUWfg xenolinux-2.4.22-sparse/include/asm-xeno/multicall.h
3e5a4e67mnQfh-R8KcQCaVo2Oho6yg xenolinux-2.4.22-sparse/include/asm-xeno/page.h
3e5a4e67uTYU5oEnIDjxuaez8njjqg xenolinux-2.4.22-sparse/include/asm-xeno/pgalloc.h
3e5a4e67X7JyupgdYkgDX19Huj2sAw xenolinux-2.4.22-sparse/include/asm-xeno/pgtable-2level.h
3e5a4e67gr4NLGtQ5CvSLimMYZlkOA xenolinux-2.4.22-sparse/include/asm-xeno/pgtable.h
3f108af1qNv8DVSGPv4zpqIU1txCkg xenolinux-2.4.22-sparse/include/asm-xeno/proc_cmd.h
3e5a4e676uK4xErTBDH6XJREn9LSyg xenolinux-2.4.22-sparse/include/asm-xeno/processor.h
3e5a4e67AJPjW-zL7p-xWuA6IVeH1g xenolinux-2.4.22-sparse/include/asm-xeno/ptrace.h
3e5a4e68uJz-xI0IBVMD7xRLQKJDFg xenolinux-2.4.22-sparse/include/asm-xeno/segment.h
3e5a4e68Nfdh6QcOKUTGCaYkf2LmYA xenolinux-2.4.22-sparse/include/asm-xeno/smp.h
3e5a4e68mTr0zcp9SXDbnd-XLrrfxw xenolinux-2.4.22-sparse/include/asm-xeno/system.h
3f1056a9L_kqHcFheV00KbKBzv9j5w xenolinux-2.4.22-sparse/include/asm-xeno/vga.h
3f056927gMHl7mWB89rb73JahbhQIA xenolinux-2.4.22-sparse/include/linux/blk.h
3e5a4e68WLX3B8owTvktP3HHOtznPQ xenolinux-2.4.22-sparse/include/linux/major.h
3e5a4e686V0nioX2ZpFf056sgvdiQw xenolinux-2.4.22-sparse/include/linux/sunrpc/debug.h
3e5a4e68W_hpMlM3u_-QOKMp3gzcwQ xenolinux-2.4.22-sparse/init/do_mounts.c
3e5a4e68TJJavrunYwTAnLRSBxSYqQ xenolinux-2.4.22-sparse/kernel/panic.c
3f1056a9LXNTgSzITNh1mb-MIKV1Ng xenolinux-2.4.22-sparse/kernel/printk.c
3eba8f878XjouY21EkQBXwYBsPsipQ xenolinux-2.4.22-sparse/lndir-rel
3e6e7c1efbQe93xCvOpOVCnXTMmQ5w xenolinux-2.4.22-sparse/mkbuildtree
3e5a4e68GxCIaFH4sy01v1wjapetaA xenolinux-2.4.22-sparse/mm/memory.c
3f108af5VxPkLv13tXpXgoRKALQtXQ xenolinux-2.4.22-sparse/mm/mprotect.c
3e5a4e681xMPdF9xCMwpyfuYMySU5g xenolinux-2.4.22-sparse/mm/mremap.c
3e5a4e683HKVU-sxtagrDasRB8eBVw xenolinux-2.4.22-sparse/mm/swapfile.c
3f108af81Thhb242EmKjGCYkjx-GJA xenolinux-2.4.22-sparse/mm/vmalloc.c
@@ -1,6 +1,6 @@
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 21
SUBLEVEL = 22
EXTRAVERSION = -xeno
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
@@ -45,10 +45,13 @@ DEPMOD = /sbin/depmod
MODFLAGS = -DMODULE
CFLAGS_KERNEL =
PERL = perl
AWK = awk
RPM := $(shell if [ -x "/usr/bin/rpmbuild" ]; then echo rpmbuild; \
else echo rpm; fi)
export VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH \
CONFIG_SHELL TOPDIR HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \
CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS MODFLAGS PERL
CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS MODFLAGS PERL AWK
all: do-it-all
@@ -130,14 +133,14 @@ CORE_FILES =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o
NETWORKS =net/network.o
LIBS =$(TOPDIR)/lib/lib.a
SUBDIRS =kernel drivers mm fs net ipc lib
SUBDIRS =kernel drivers mm fs net ipc lib crypto
DRIVERS-n :=
DRIVERS-y :=
DRIVERS-m :=
DRIVERS- :=
DRIVERS-$(CONFIG_ACPI) += drivers/acpi/acpi.o
DRIVERS-$(CONFIG_ACPI_BOOT) += drivers/acpi/acpi.o
DRIVERS-$(CONFIG_PARPORT) += drivers/parport/driver.o
DRIVERS-y += drivers/char/char.o \
drivers/block/block.o \
@@ -195,6 +198,7 @@ DRIVERS-$(CONFIG_GSC) += drivers/gsc/gscbus.o
DRIVERS-$(CONFIG_BLUEZ) += drivers/bluetooth/bluetooth.o
DRIVERS-$(CONFIG_HOTPLUG_PCI) += drivers/hotplug/vmlinux-obj.o
DRIVERS-$(CONFIG_ISDN_BOOL) += drivers/isdn/vmlinux-obj.o
DRIVERS-$(CONFIG_CRYPTO) += crypto/crypto.o
DRIVERS := $(DRIVERS-y)
@@ -231,6 +235,7 @@ CLEAN_DIRS = \
# files removed with 'make mrproper'
MRPROPER_FILES = \
include/linux/autoconf.h include/linux/version.h \
lib/crc32table.h lib/gen_crc32table \
drivers/net/hamradio/soundmodem/sm_tbl_{afsk1200,afsk2666,fsk9600}.h \
drivers/net/hamradio/soundmodem/sm_tbl_{hapn4800,psk4800}.h \
drivers/net/hamradio/soundmodem/sm_tbl_{afsk2400_7,afsk2400_8}.h \
@@ -575,5 +580,5 @@ rpm: clean spec
rm $(KERNELPATH) ; \
cd $(TOPDIR) ; \
. scripts/mkversion > .version ; \
rpm -ta $(TOPDIR)/../$(KERNELPATH).tar.gz ; \
$(RPM) -ta $(TOPDIR)/../$(KERNELPATH).tar.gz ; \
rm $(TOPDIR)/../$(KERNELPATH).tar.gz
@@ -165,6 +165,9 @@ if [ "$CONFIG_DEBUG_KERNEL" != "n" ]; then
bool ' Compile the kernel with frame pointers' CONFIG_FRAME_POINTER
fi
source drivers/acpi/Config.in
endmenu
source crypto/Config.in
source lib/Config.in
@@ -32,6 +32,7 @@
#include <linux/seq_file.h>
#include <asm/processor.h>
#include <linux/console.h>
#include <linux/module.h>
#include <asm/mtrr.h>
#include <asm/uaccess.h>
#include <asm/system.h>
@@ -57,6 +58,7 @@ char ignore_irq13; /* set if exception 16 works */
struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
unsigned long mmu_cr4_features;
//EXPORT_SYMBOL(mmu_cr4_features);
unsigned char * vgacon_mmap;
@@ -176,11 +176,12 @@ void blk_cleanup_queue(request_queue_t * q)
{
int count = q->nr_requests;
count -= __blk_cleanup_queue(&q->rq[READ]);
count -= __blk_cleanup_queue(&q->rq[WRITE]);
count -= __blk_cleanup_queue(&q->rq);
if (count)
printk("blk_cleanup_queue: leaked requests (%d)\n", count);
if (atomic_read(&q->nr_sectors))
printk("blk_cleanup_queue: leaked sectors (%d)\n", atomic_read(&q->nr_sectors));
memset(q, 0, sizeof(*q));
}
@@ -214,6 +215,24 @@ void blk_queue_headactive(request_queue_t * q, int active)
q->head_active = active;
}
/**
* blk_queue_throttle_sectors - indicates you will call sector throttling funcs
* @q: The queue which this applies to.
* @active: A flag indication if you want sector throttling on
*
* Description:
* The sector throttling code allows us to put a limit on the number of
* sectors pending io to the disk at a given time, sending @active nonzero
* indicates you will call blk_started_sectors and blk_finished_sectors in
* addition to calling blk_started_io and blk_finished_io in order to
* keep track of the number of sectors in flight.
**/
void blk_queue_throttle_sectors(request_queue_t * q, int active)
{
q->can_throttle = active;
}
/**
* blk_queue_make_request - define an alternate make_request function for a device
* @q: the request queue for the device to be affected
@@ -389,7 +408,7 @@ void generic_unplug_device(void *data)
*
* Returns the (new) number of requests which the queue has available.
*/
int blk_grow_request_list(request_queue_t *q, int nr_requests)
int blk_grow_request_list(request_queue_t *q, int nr_requests, int max_queue_sectors)
{
unsigned long flags;
/* Several broken drivers assume that this function doesn't sleep,
@@ -399,21 +418,34 @@ int blk_grow_request_list(request_queue_t *q, int nr_requests)
spin_lock_irqsave(&io_request_lock, flags);
while (q->nr_requests < nr_requests) {
struct request *rq;
int rw;
rq = kmem_cache_alloc(request_cachep, SLAB_ATOMIC);
if (rq == NULL)
break;
memset(rq, 0, sizeof(*rq));
rq->rq_status = RQ_INACTIVE;
rw = q->nr_requests & 1;
list_add(&rq->queue, &q->rq[rw].free);
q->rq[rw].count++;
list_add(&rq->queue, &q->rq.free);
q->rq.count++;
q->nr_requests++;
}
/*
* Wakeup waiters after both one quarter of the
* max-in-fligh queue and one quarter of the requests
* are available again.
*/
q->batch_requests = q->nr_requests / 4;
if (q->batch_requests > 32)
q->batch_requests = 32;
q->batch_sectors = max_queue_sectors / 4;
q->max_queue_sectors = max_queue_sectors;
BUG_ON(!q->batch_sectors);
atomic_set(&q->nr_sectors, 0);
spin_unlock_irqrestore(&io_request_lock, flags);
return q->nr_requests;
}
@@ -422,23 +454,28 @@ static void blk_init_free_list(request_queue_t *q)
{
struct sysinfo si;
int megs; /* Total memory, in megabytes */
int nr_requests;
INIT_LIST_HEAD(&q->rq[READ].free);
INIT_LIST_HEAD(&q->rq[WRITE].free);
q->rq[READ].count = 0;
q->rq[WRITE].count = 0;
int nr_requests, max_queue_sectors = MAX_QUEUE_SECTORS;
INIT_LIST_HEAD(&q->rq.free);
q->rq.count = 0;
q->rq.pending[READ] = q->rq.pending[WRITE] = 0;
q->nr_requests = 0;
si_meminfo(&si);
megs = si.totalram >> (20 - PAGE_SHIFT);
nr_requests = 128;
if (megs < 32)
nr_requests /= 2;
blk_grow_request_list(q, nr_requests);
nr_requests = MAX_NR_REQUESTS;
if (megs < 30) {
nr_requests /= 2;
max_queue_sectors /= 2;
}
/* notice early if anybody screwed the defaults */
BUG_ON(!nr_requests);
BUG_ON(!max_queue_sectors);
blk_grow_request_list(q, nr_requests, max_queue_sectors);
init_waitqueue_head(&q->wait_for_requests);
init_waitqueue_head(&q->wait_for_requests[0]);
init_waitqueue_head(&q->wait_for_requests[1]);
spin_lock_init(&q->queue_lock);
}
@@ -491,6 +528,8 @@ void blk_init_queue(request_queue_t * q, request_fn_proc * rfn)
q->plug_tq.routine = &generic_unplug_device;
q->plug_tq.data = q;
q->plugged = 0;
q->can_throttle = 0;
/*
* These booleans describe the queue properties. We set the
* default (and most common) values here. Other drivers can
@@ -511,12 +550,29 @@ void blk_init_queue(request_queue_t * q, request_fn_proc * rfn)
static struct request *get_request(request_queue_t *q, int rw)
{
struct request *rq = NULL;
struct request_list *rl = q->rq + rw;
struct request_list *rl = &q->rq;
if (blk_oversized_queue(q)) {
int rlim = q->nr_requests >> 5;
if (rlim < 4)
rlim = 4;
/*
* if its a write, or we have more than a handful of reads
* pending, bail out
*/
if ((rw == WRITE) || (rw == READ && rl->pending[READ] > rlim))
return NULL;
if (blk_oversized_queue_reads(q))
return NULL;
}
if (!list_empty(&rl->free)) {
rq = blkdev_free_rq(&rl->free);
list_del(&rq->queue);
rl->count--;
rl->pending[rw]++;
rq->rq_status = RQ_ACTIVE;
rq->cmd = rw;
rq->special = NULL;
@@ -527,29 +583,19 @@ static struct request *get_request(request_queue_t *q, int rw)
}
/*
* Here's the request allocation design:
* Here's the request allocation design, low latency version:
*
* 1: Blocking on request exhaustion is a key part of I/O throttling.
*
* 2: We want to be `fair' to all requesters. We must avoid starvation, and
* attempt to ensure that all requesters sleep for a similar duration. Hence
* no stealing requests when there are other processes waiting.
*
* 3: We also wish to support `batching' of requests. So when a process is
* woken, we want to allow it to allocate a decent number of requests
* before it blocks again, so they can be nicely merged (this only really
* matters if the process happens to be adding requests near the head of
* the queue).
*
* 4: We want to avoid scheduling storms. This isn't really important, because
* the system will be I/O bound anyway. But it's easy.
*
* There is tension between requirements 2 and 3. Once a task has woken,
* we don't want to allow it to sleep as soon as it takes its second request.
* But we don't want currently-running tasks to steal all the requests
* from the sleepers. We handle this with wakeup hysteresis around
* 0 .. batch_requests and with the assumption that request taking is much,
* much faster than request freeing.
*
* There used to be more here, attempting to allow a process to send in a
* number of requests once it has woken up. But, there's no way to
* tell if a process has just been woken up, or if it is a new process
* coming in to steal requests from the waiters. So, we give up and force
* everyone to wait fairly.
*
* So here's what we do:
*
@@ -561,28 +607,23 @@ static struct request *get_request(request_queue_t *q, int rw)
*
* When a process wants a new request:
*
* b) If free_requests == 0, the requester sleeps in FIFO manner.
*
* b) If 0 < free_requests < batch_requests and there are waiters,
* we still take a request non-blockingly. This provides batching.
*
* c) If free_requests >= batch_requests, the caller is immediately
* granted a new request.
* b) If free_requests == 0, the requester sleeps in FIFO manner, and
* the queue full condition is set. The full condition is not
* cleared until there are no longer any waiters. Once the full
* condition is set, all new io must wait, hopefully for a very
* short period of time.
*
* When a request is released:
*
* d) If free_requests < batch_requests, do nothing.
* c) If free_requests < batch_requests, do nothing.
*
* f) If free_requests >= batch_requests, wake up a single waiter.
*
* The net effect is that when a process is woken at the batch_requests level,
* it will be able to take approximately (batch_requests) requests before
* blocking again (at the tail of the queue).
*
* This all assumes that the rate of taking requests is much, much higher
* than the rate of releasing them. Which is very true.
* d) If free_requests >= batch_requests, wake up a single waiter.
*
* -akpm, Feb 2002.
* As each waiter gets a request, he wakes another waiter. We do this
* to prevent a race where an unplug might get run before a request makes
* it's way onto the queue. The result is a cascade of wakeups, so delaying
* the initial wakeup until we've got batch_requests available helps avoid
* wakeups where there aren't any requests available yet.
*/
static struct request *__get_request_wait(request_queue_t *q, int rw)
@@ -590,21 +631,37 @@ static struct request *__get_request_wait(request_queue_t *q, int rw)
register struct request *rq;
DECLARE_WAITQUEUE(wait, current);
add_wait_queue(&q->wait_for_requests[rw], &wait);
add_wait_queue_exclusive(&q->wait_for_requests, &wait);
do {
set_current_state(TASK_UNINTERRUPTIBLE);
generic_unplug_device(q);
if (q->rq[rw].count == 0)
schedule();
spin_lock_irq(&io_request_lock);
if (blk_oversized_queue(q) || q->rq.count == 0) {
__generic_unplug_device(q);
spin_unlock_irq(&io_request_lock);
schedule();
spin_lock_irq(&io_request_lock);
}
rq = get_request(q, rw);
spin_unlock_irq(&io_request_lock);
} while (rq == NULL);
remove_wait_queue(&q->wait_for_requests[rw], &wait);
remove_wait_queue(&q->wait_for_requests, &wait);
current->state = TASK_RUNNING;
return rq;
}
static void get_request_wait_wakeup(request_queue_t *q, int rw)
{
/*
* avoid losing an unplug if a second __get_request_wait did the
* generic_unplug_device while our __get_request_wait was running
* w/o the queue_lock held and w/ our request out of the queue.
*/
if (waitqueue_active(&q->wait_for_requests))
wake_up(&q->wait_for_requests);
}
/* RO fail safe mechanism */
static long ro_bits[MAX_BLKDEV][8];
@@ -820,7 +877,6 @@ static inline void add_request(request_queue_t * q, struct request * req,
void blkdev_release_request(struct request *req)
{
request_queue_t *q = req->q;
int rw = req->cmd;
req->rq_status = RQ_INACTIVE;
req->q = NULL;
@@ -830,9 +886,29 @@ void blkdev_release_request(struct request *req)
* assume it has free buffers and check waiters
*/
if (q) {
list_add(&req->queue, &q->rq[rw].free);
if (++q->rq[rw].count >= q->batch_requests)
wake_up(&q->wait_for_requests[rw]);
struct request_list *rl = &q->rq;
int oversized_batch = 0;
if (q->can_throttle)
oversized_batch = blk_oversized_queue_batch(q);
rl->count++;
/*
* paranoia check
*/
if (req->cmd == READ || req->cmd == WRITE)
rl->pending[req->cmd]--;
if (rl->pending[READ] > q->nr_requests)
printk("blk: reads: %u\n", rl->pending[READ]);
if (rl->pending[WRITE] > q->nr_requests)
printk("blk: writes: %u\n", rl->pending[WRITE]);
if (rl->pending[READ] + rl->pending[WRITE] > q->nr_requests)
printk("blk: r/w: %u + %u > %u\n", rl->pending[READ], rl->pending[WRITE], q->nr_requests);
list_add(&req->queue, &rl->free);
if (rl->count >= q->batch_requests && !oversized_batch) {
smp_mb();
if (waitqueue_active(&q->wait_for_requests))
wake_up(&q->wait_for_requests);
}
}
}
@@ -903,16 +979,18 @@ static inline void attempt_front_merge(request_queue_t * q,
static int __make_request(request_queue_t * q, int rw,
struct buffer_head * bh)
{
unsigned int sector, count;
unsigned int sector, count, sync;
int max_segments = MAX_SEGMENTS;
struct request * req, *freereq = NULL;
int rw_ahead, max_sectors, el_ret;
struct list_head *head, *insert_here;
int latency;
elevator_t *elevator = &q->elevator;
int should_wake = 0;
count = bh->b_size >> 9;
sector = bh->b_rsector;
sync = test_and_clear_bit(BH_Sync, &bh->b_state);
rw_ahead = 0; /* normal case; gets changed below for READA */
switch (rw) {
@@ -950,7 +1028,6 @@ static int __make_request(request_queue_t * q, int rw,
*/
max_sectors = get_max_sectors(bh->b_rdev);
again:
req = NULL;
head = &q->queue_head;
/*
@@ -959,7 +1036,9 @@ again:
*/
spin_lock_irq(&io_request_lock);
again:
insert_here = head->prev;
if (list_empty(head)) {
q->plug_device_fn(q, bh->b_rdev); /* is atomic */
goto get_rq;
@@ -978,6 +1057,7 @@ again:
req->bhtail = bh;
req->nr_sectors = req->hard_nr_sectors += count;
blk_started_io(count);
blk_started_sectors(req, count);
drive_stat_acct(req->rq_dev, req->cmd, count, 0);
req_new_io(req, 1, count);
attempt_back_merge(q, req, max_sectors, max_segments);
@@ -1000,6 +1080,7 @@ again:
req->sector = req->hard_sector = sector;
req->nr_sectors = req->hard_nr_sectors += count;
blk_started_io(count);
blk_started_sectors(req, count);
drive_stat_acct(req->rq_dev, req->cmd, count, 0);
req_new_io(req, 1, count);
attempt_front_merge(q, head, req, max_sectors, max_segments);
@@ -1032,7 +1113,7 @@ get_rq:
* See description above __get_request_wait()
*/
if (rw_ahead) {
if (q->rq[rw].count < q->batch_requests) {
if (q->rq.count < q->batch_requests || blk_oversized_queue_batch(q)) {
spin_unlock_irq(&io_request_lock);
goto end_io;
}
@@ -1044,6 +1125,9 @@ get_rq:
if (req == NULL) {
spin_unlock_irq(&io_request_lock);
freereq = __get_request_wait(q, rw);
head = &q->queue_head;
spin_lock_irq(&io_request_lock);
should_wake = 1;
goto again;
}
}
@@ -1066,10 +1150,15 @@ get_rq:
req->start_time = jiffies;
req_new_io(req, 0, count);
blk_started_io(count);
blk_started_sectors(req, count);
add_request(q, req, insert_here);
out:
if (freereq)
blkdev_release_request(freereq);
if (should_wake)
get_request_wait_wakeup(q, rw);
if (sync)
__generic_unplug_device(q);
spin_unlock_irq(&io_request_lock);
return 0;
end_io:
@@ -1198,8 +1287,15 @@ void submit_bh(int rw, struct buffer_head * bh)
bh->b_rdev = bh->b_dev;
bh->b_rsector = bh->b_blocknr * count;
get_bh(bh);
generic_make_request(rw, bh);
/* fix race condition with wait_on_buffer() */
smp_mb(); /* spin_unlock may have inclusive semantics */
if (waitqueue_active(&bh->b_wait))
wake_up(&bh->b_wait);
put_bh(bh);
switch (rw) {
case WRITE:
kstat.pgpgout += count;
@@ -1352,6 +1448,7 @@ int end_that_request_first (struct request *req, int uptodate, char *name)
if ((bh = req->bh) != NULL) {
nsect = bh->b_size >> 9;
blk_finished_io(nsect);
blk_finished_sectors(req, nsect);
req->bh = bh->b_reqnext;
bh->b_reqnext = NULL;
bh->b_end_io(bh, uptodate);
@@ -1518,6 +1615,7 @@ EXPORT_SYMBOL(blk_init_queue);
EXPORT_SYMBOL(blk_get_queue);
EXPORT_SYMBOL(blk_cleanup_queue);
EXPORT_SYMBOL(blk_queue_headactive);
EXPORT_SYMBOL(blk_queue_throttle_sectors);
EXPORT_SYMBOL(blk_queue_make_request);
EXPORT_SYMBOL(generic_make_request);
EXPORT_SYMBOL(blkdev_release_request);
@@ -146,6 +146,7 @@ extern long vme_scc_console_init(void);
extern int serial167_init(void);
extern long serial167_console_init(void);
extern void console_8xx_init(void);
extern void au1x00_serial_console_init(void);
extern int rs_8xx_init(void);
extern void mac_scc_console_init(void);
extern void hwc_console_init(void);
@@ -158,10 +159,14 @@ extern void rs285_console_init(void);
extern void sa1100_rs_console_init(void);
extern void sgi_serial_console_init(void);
extern void sci_console_init(void);
extern void dec_serial_console_init(void);
extern void tx3912_console_init(void);
extern void tx3912_rs_init(void);
extern void txx927_console_init(void);
extern void txx9_rs_init(void);
extern void txx9_serial_console_init(void);
extern void sb1250_serial_console_init(void);
extern void arc_console_init(void);
#ifndef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
@@ -2246,8 +2251,8 @@ void __init console_init(void)
con_init();
#endif
#ifdef CONFIG_AU1000_SERIAL_CONSOLE
au1000_serial_console_init();
#ifdef CONFIG_AU1X00_SERIAL_CONSOLE
au1x00_serial_console_init();
#endif
#ifdef CONFIG_SERIAL_CONSOLE
#if (defined(CONFIG_8xx) || defined(CONFIG_8260))
@@ -2264,9 +2269,6 @@ void __init console_init(void)
#elif defined(CONFIG_SERIAL)
serial_console_init();
#endif /* CONFIG_8xx */
#ifdef CONFIG_SGI_SERIAL
sgi_serial_console_init();
#endif
#if defined(CONFIG_MVME162_SCC) || defined(CONFIG_BVME6000_SCC) || defined(CONFIG_MVME147_SCC)
vme_scc_console_init();
#endif
@@ -2277,6 +2279,9 @@ void __init console_init(void)
sci_console_init();
#endif
#endif
#ifdef CONFIG_SERIAL_DEC_CONSOLE
dec_serial_console_init();
#endif
#ifdef CONFIG_TN3270_CONSOLE
tub3270_con_init();
#endif
@@ -2307,9 +2312,15 @@ void __init console_init(void)
#ifdef CONFIG_TXX927_SERIAL_CONSOLE
txx927_console_init();
#endif
#ifdef CONFIG_SERIAL_TXX9_CONSOLE
txx9_serial_console_init();
#endif
#ifdef CONFIG_SIBYTE_SB1250_DUART_CONSOLE
sb1250_serial_console_init();
#endif
#ifdef CONFIG_IP22_SERIAL
sgi_serial_console_init();
#endif
}
static struct tty_driver dev_tty_driver, dev_syscons_driver;
@@ -286,6 +286,8 @@ void put_dirty_page(struct task_struct * tsk, struct page *page, unsigned long a
pgd_t * pgd;
pmd_t * pmd;
pte_t * pte;
struct vm_area_struct *vma;
pgprot_t prot = PAGE_COPY;
if (page_count(page) != 1)
printk(KERN_ERR "mem_map disagrees with %p at %08lx\n", page, address);
@@ -303,7 +305,11 @@ void put_dirty_page(struct task_struct * tsk, struct page *page, unsigned long a
lru_cache_add(page);
flush_dcache_page(page);
flush_page_to_ram(page);
set_pte(pte, pte_mkdirty(pte_mkwrite(mk_pte(page, PAGE_COPY))));
/* lookup is cheap because there is only a single entry in the list */
vma = find_vma(tsk->mm, address);
if (vma)
prot = vma->vm_page_prot;
set_pte(pte, pte_mkdirty(pte_mkwrite(mk_pte(page, prot))));
XENO_flush_page_update_queue();
tsk->mm->rss++;
spin_unlock(&tsk->mm->page_table_lock);
@@ -339,8 +345,8 @@ int setup_arg_pages(struct linux_binprm *bprm)
mpnt->vm_mm = current->mm;
mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
mpnt->vm_end = STACK_TOP;
mpnt->vm_page_prot = PAGE_COPY;
mpnt->vm_flags = VM_STACK_FLAGS;
mpnt->vm_page_prot = protection_map[VM_STACK_FLAGS & 0x7];
mpnt->vm_ops = NULL;
mpnt->vm_pgoff = 0;
mpnt->vm_file = NULL;
@@ -558,6 +564,7 @@ int flush_old_exec(struct linux_binprm * bprm)
char * name;
int i, ch, retval;
struct signal_struct * oldsig;
struct files_struct * files;
/*
* Make sure we have a private signal table
@@ -566,6 +573,17 @@ int flush_old_exec(struct linux_binprm * bprm)
retval = make_private_signals();
if (retval) goto flush_failed;
/*
* Make sure we have private file handles. Ask the
* fork helper to do the work for us and the exit
* helper to do the cleanup of the old one.
*/
files = current->files; /* refcounted so safe to hold */
retval = unshare_files();
if(retval)
goto flush_failed;
/*
* Release all of the old mmap stuff
*/
@@ -573,6 +591,8 @@ int flush_old_exec(struct linux_binprm * bprm)
if (retval) goto mmap_failed;
/* This is the point of no return */
steal_locks(files);
put_files_struct(files);
release_old_signals(oldsig);
current->sas_ss_sp = current->sas_ss_size = 0;
@@ -610,6 +630,8 @@ int flush_old_exec(struct linux_binprm * bprm)
return 0;
mmap_failed:
put_files_struct(current->files);
current->files = files;
flush_failed:
spin_lock_irq(&current->sigmask_lock);
if (current->sig != oldsig) {
@@ -56,7 +56,7 @@ enum fixed_addresses {
FIX_BTMAP_END,
FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS - 1,
/* our bt_ioremap is permenant unlike other architectures */
__end_of_permanent_fixed_addresses,
__end_of_fixed_addresses = __end_of_permanent_fixed_addresses
};
@@ -253,7 +253,7 @@ struct tlb_state
{
struct mm_struct *active_mm;
int state;
};
} ____cacheline_aligned;
extern struct tlb_state cpu_tlbstate[NR_CPUS];
#endif /* CONFIG_SMP */
@@ -81,17 +81,6 @@ extern struct cpuinfo_x86 cpu_data[];
#define current_cpu_data boot_cpu_data
#endif
#define cpu_has_pge (test_bit(X86_FEATURE_PGE, boot_cpu_data.x86_capability))
#define cpu_has_pse (test_bit(X86_FEATURE_PSE, boot_cpu_data.x86_capability))
#define cpu_has_pae (test_bit(X86_FEATURE_PAE, boot_cpu_data.x86_capability))
#define cpu_has_tsc (test_bit(X86_FEATURE_TSC, boot_cpu_data.x86_capability))
#define cpu_has_de (test_bit(X86_FEATURE_DE, boot_cpu_data.x86_capability))
#define cpu_has_vme (test_bit(X86_FEATURE_VME, boot_cpu_data.x86_capability))
#define cpu_has_fxsr (test_bit(X86_FEATURE_FXSR, boot_cpu_data.x86_capability))
#define cpu_has_xmm (test_bit(X86_FEATURE_XMM, boot_cpu_data.x86_capability))
#define cpu_has_fpu (test_bit(X86_FEATURE_FPU, boot_cpu_data.x86_capability))
#define cpu_has_apic (test_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability))
extern char ignore_irq13;
extern void identify_cpu(struct cpuinfo_x86 *);
@@ -454,7 +443,7 @@ struct microcode {
/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
static inline void rep_nop(void)
{
__asm__ __volatile__("rep;nop");
__asm__ __volatile__("rep;nop" ::: "memory");
}
#define cpu_relax() rep_nop()
@@ -401,5 +401,6 @@ extern int is_sony_vaio_laptop;
#define BROKEN_ACPI_Sx 0x0001
#define BROKEN_INIT_AFTER_S1 0x0002
#define BROKEN_PNP_BIOS 0x0004
#endif
@@ -15,6 +15,7 @@
#include <linux/minix_fs.h>
#include <linux/ext2_fs.h>
#include <linux/romfs_fs.h>
#include <linux/cramfs_fs.h>
#define BUILD_CRAMDISK
@@ -87,7 +88,7 @@ static struct dev_name_struct {
const char *name;
const int num;
} root_dev_names[] __initdata = {
{ "nfs", 0x00ff },
{ "nfs", MKDEV(NFS_MAJOR, NFS_MINOR) },
{ "hda", 0x0300 },
{ "hdb", 0x0340 },
{ "loop", 0x0700 },
@@ -484,6 +485,7 @@ static int __init crd_load(int in_fd, int out_fd);
* minix
* ext2
* romfs
* cramfs
* gzip
*/
static int __init
@@ -493,6 +495,7 @@ identify_ramdisk_image(int fd, int start_block)
struct minix_super_block *minixsb;
struct ext2_super_block *ext2sb;
struct romfs_super_block *romfsb;
struct cramfs_super *cramfsb;
int nblocks = -1;
unsigned char *buf;
@@ -503,6 +506,7 @@ identify_ramdisk_image(int fd, int start_block)
minixsb = (struct minix_super_block *) buf;
ext2sb = (struct ext2_super_block *) buf;
romfsb = (struct romfs_super_block *) buf;
cramfsb = (struct cramfs_super *) buf;
memset(buf, 0xe5, size);
/*
@@ -532,6 +536,14 @@ identify_ramdisk_image(int fd, int start_block)
goto done;
}
if (cramfsb->magic == CRAMFS_MAGIC) {
printk(KERN_NOTICE
"RAMDISK: cramfs filesystem found at block %d\n",
start_block);
nblocks = (cramfsb->size + BLOCK_SIZE - 1) >> BLOCK_SIZE_BITS;
goto done;
}
/*
* Read block 1 to test for minix and ext2 superblock
*/
@@ -757,7 +769,8 @@ static void __init devfs_make_root(char *name)
static void __init mount_root(void)
{
#ifdef CONFIG_ROOT_NFS
if (MAJOR(ROOT_DEV) == UNNAMED_MAJOR) {
if (MAJOR(ROOT_DEV) == NFS_MAJOR
&& MINOR(ROOT_DEV) == NFS_MINOR) {
if (mount_nfs_root()) {
sys_chdir("/root");
ROOT_DEV = current->fs->pwdmnt->mnt_sb->s_dev;
@@ -919,6 +932,8 @@ out:
mount_devfs_fs ();
}
#ifdef CONFIG_BLK_DEV_RAM
#if defined(BUILD_CRAMDISK) && defined(CONFIG_BLK_DEV_RAM)
/*
@@ -1065,3 +1080,4 @@ static int __init crd_load(int in_fd, int out_fd)
}
#endif /* BUILD_CRAMDISK && CONFIG_BLK_DEV_RAM */
#endif /* CONFIG_BLK_DEV_RAM */
@@ -560,7 +560,14 @@ void console_unblank(void)
{
struct console *c;
acquire_console_sem();
/*
* Try to get the console semaphore. If someone else owns it
* we have to return without unblanking because console_unblank
* may be called in interrupt context.
*/
if (down_trylock(&console_sem) != 0)
return;
console_may_schedule = 0;
for (c = console_drivers; c != NULL; c = c->next)
if ((c->flags & CON_ENABLED) && c->unblank)
c->unblank();
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -179,11 +179,13 @@ static inline unsigned long move_vma(struct vm_area_struct * vma,
}
if (!move_page_tables(current->mm, new_addr, addr, old_len)) {
unsigned long vm_locked = vma->vm_flags & VM_LOCKED;
if (allocated_vma) {
*new_vma = *vma;
new_vma->vm_start = new_addr;
new_vma->vm_end = new_addr+new_len;
new_vma->vm_pgoff += (addr - vma->vm_start) >> PAGE_SHIFT;
new_vma->vm_pgoff += (addr-vma->vm_start) >> PAGE_SHIFT;
new_vma->vm_raend = 0;
if (new_vma->vm_file)
get_file(new_vma->vm_file);
@@ -191,12 +193,15 @@ static inline unsigned long move_vma(struct vm_area_struct * vma,
new_vma->vm_ops->open(new_vma);
insert_vm_struct(current->mm, new_vma);
}
do_munmap(current->mm, addr, old_len);
current->mm->total_vm += new_len >> PAGE_SHIFT;
if (new_vma->vm_flags & VM_LOCKED) {
if (vm_locked) {
current->mm->locked_vm += new_len >> PAGE_SHIFT;
make_pages_present(new_vma->vm_start,
new_vma->vm_end);
if (new_len > old_len)
make_pages_present(new_addr + old_len,
new_addr + new_len);
}
return new_addr;
}
@@ -522,6 +522,7 @@ static int try_to_unuse(unsigned int type)
int i = 0;
int retval = 0;
int reset_overflow = 0;
int shmem;
/*
* When searching mms for an entry, a good strategy is to
@@ -600,11 +601,12 @@ static int try_to_unuse(unsigned int type)
* Whenever we reach init_mm, there's no address space
* to search, but use it as a reminder to search shmem.
*/
shmem = 0;
swcount = *swap_map;
if (swcount > 1) {
flush_page_to_ram(page);
if (start_mm == &init_mm)
shmem_unuse(entry, page);
shmem = shmem_unuse(entry, page);
else
unuse_process(start_mm, entry, page);
}
@@ -621,7 +623,9 @@ static int try_to_unuse(unsigned int type)
swcount = *swap_map;
if (mm == &init_mm) {
set_start_mm = 1;
shmem_unuse(entry, page);
spin_unlock(&mmlist_lock);
shmem = shmem_unuse(entry, page);
spin_lock(&mmlist_lock);
} else
unuse_process(mm, entry, page);
if (set_start_mm && *swap_map < swcount) {
@@ -670,14 +674,23 @@ static int try_to_unuse(unsigned int type)
* read from disk into another page. Splitting into two
* pages would be incorrect if swap supported "shared
* private" pages, but they are handled by tmpfs files.
* Note shmem_unuse already deleted its from swap cache.
*
* Note shmem_unuse already deleted swappage from cache,
* unless corresponding filepage found already in cache:
* in which case it left swappage in cache, lowered its
* swap count to pass quickly through the loops above,
* and now we must reincrement count to try again later.
*/
if ((*swap_map > 1) && PageDirty(page) && PageSwapCache(page)) {
rw_swap_page(WRITE, page);
lock_page(page);
}
if (PageSwapCache(page))
delete_from_swap_cache(page);
if (PageSwapCache(page)) {
if (shmem)
swap_duplicate(entry);
else
delete_from_swap_cache(page);
}
/*
* So we could skip searching mms once swap count went
@@ -93,7 +93,8 @@ void vmfree_area_pages(unsigned long address, unsigned long size)
}
static inline int alloc_area_pte (pte_t * pte, unsigned long address,
unsigned long size, int gfp_mask, pgprot_t prot)
unsigned long size, int gfp_mask,
pgprot_t prot, struct page ***pages)
{
unsigned long end;
@@ -103,9 +104,20 @@ static inline int alloc_area_pte (pte_t * pte, unsigned long address,
end = PMD_SIZE;
do {
struct page * page;
spin_unlock(&init_mm.page_table_lock);
page = alloc_page(gfp_mask);
spin_lock(&init_mm.page_table_lock);
if (!pages) {
spin_unlock(&init_mm.page_table_lock);
page = alloc_page(gfp_mask);
spin_lock(&init_mm.page_table_lock);
} else {
page = (**pages);
(*pages)++;
/* Add a reference to the page so we can free later */
if (page)
atomic_inc(&page->count);
}
if (!pte_none(*pte))
printk(KERN_ERR "alloc_area_pte: page already exists\n");
if (!page)
@@ -117,7 +129,9 @@ static inline int alloc_area_pte (pte_t * pte, unsigned long address,
return 0;
}
static inline int alloc_area_pmd(pmd_t * pmd, unsigned long address, unsigned long size, int gfp_mask, pgprot_t prot)
static inline int alloc_area_pmd(pmd_t * pmd, unsigned long address,
unsigned long size, int gfp_mask,
pgprot_t prot, struct page ***pages)
{
unsigned long end;
@@ -129,7 +143,8 @@ static inline int alloc_area_pmd(pmd_t * pmd, unsigned long address, unsigned lo
pte_t * pte = pte_alloc(&init_mm, pmd, address);
if (!pte)
return -ENOMEM;
if (alloc_area_pte(pte, address, end - address, gfp_mask, prot))
if (alloc_area_pte(pte, address, end - address,
gfp_mask, prot, pages))
return -ENOMEM;
address = (address + PMD_SIZE) & PMD_MASK;
pmd++;
@@ -137,8 +152,11 @@ static inline int alloc_area_pmd(pmd_t * pmd, unsigned long address, unsigned lo
return 0;
}
inline int vmalloc_area_pages (unsigned long address, unsigned long size,
int gfp_mask, pgprot_t prot)
static inline int __vmalloc_area_pages (unsigned long address,
unsigned long size,
int gfp_mask,
pgprot_t prot,
struct page ***pages)
{
pgd_t * dir;
unsigned long end = address + size;
@@ -155,7 +173,7 @@ inline int vmalloc_area_pages (unsigned long address, unsigned long size,
break;
ret = -ENOMEM;
if (alloc_area_pmd(pmd, address, end - address, gfp_mask, prot))
if (alloc_area_pmd(pmd, address, end - address, gfp_mask, prot, pages))
break;
address = (address + PGDIR_SIZE) & PGDIR_MASK;
@@ -168,6 +186,12 @@ inline int vmalloc_area_pages (unsigned long address, unsigned long size,
return ret;
}
int vmalloc_area_pages(unsigned long address, unsigned long size,
int gfp_mask, pgprot_t prot)
{
return __vmalloc_area_pages(address, size, gfp_mask, prot, NULL);
}
struct vm_struct * get_vm_area(unsigned long size, unsigned long flags)
{
unsigned long addr, next;
@@ -251,7 +275,30 @@ void * __vmalloc (unsigned long size, int gfp_mask, pgprot_t prot)
if (!area)
return NULL;
addr = area->addr;
if (vmalloc_area_pages(VMALLOC_VMADDR(addr), size, gfp_mask, prot)) {
if (__vmalloc_area_pages(VMALLOC_VMADDR(addr), size, gfp_mask,
prot, NULL)) {
vfree(addr);
return NULL;
}
return addr;
}
void * vmap(struct page **pages, int count,
unsigned long flags, pgprot_t prot)
{
void * addr;
struct vm_struct *area;
unsigned long size = count << PAGE_SHIFT;
if (!size || size > (max_mapnr << PAGE_SHIFT))
return NULL;
area = get_vm_area(size, flags);
if (!area) {
return NULL;
}
addr = area->addr;
if (__vmalloc_area_pages(VMALLOC_VMADDR(addr), size, 0,
prot, &pages)) {
vfree(addr);
return NULL;
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.