mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
bitkeeper revision 1.1159.224.4 (41f06da8Jxtc-BtgSecZ0k3NlNY9Bw)
Merge labyrinth.cl.cam.ac.uk:/auto/groups/xeno-xenod/BK/xen-2.0-testing.bk into labyrinth.cl.cam.ac.uk:/auto/groups/xeno-xenod/BK/xen-unstable.bk
This commit is contained in:
commit
27ae37054b
84 files changed
+665
-197
No files matched your search
@@ -45,89 +45,89 @@
|
||||
3f815145vGYx1WY79voKkZB9yKwJKQ extras/mini-os/time.c
|
||||
3f815145xlKBAQmal9oces3G_Mvxqw extras/mini-os/traps.c
|
||||
4187ca95_eQN62ugV1zliQcfzXrHnw install.sh
|
||||
3e5a4e6589G-U42lFKs43plskXoFxQ linux-2.4.28-xen-sparse/Makefile
|
||||
3e5a4e65IEPjnWPZ5w3TxS5scV8Ewg linux-2.4.28-xen-sparse/arch/xen/Makefile
|
||||
3e5a4e65n-KhsEAs-A4ULiStBp-r6w linux-2.4.28-xen-sparse/arch/xen/boot/Makefile
|
||||
3e5a4e65OV_j_DBtjzt5vej771AJsA linux-2.4.28-xen-sparse/arch/xen/config.in
|
||||
40648526SxcA4lGIHB_k7ID8VlRSzw linux-2.4.28-xen-sparse/arch/xen/defconfig-xen0
|
||||
40c73c77QesbL7eIvG-fJGAtVwhGRg linux-2.4.28-xen-sparse/arch/xen/defconfig-xenU
|
||||
3e6377f5xwPfYZkPHPrDbEq1PRN7uQ linux-2.4.28-xen-sparse/arch/xen/drivers/balloon/Makefile
|
||||
4083dc16z0jvZEH4PiVDbDRreaNp6w linux-2.4.28-xen-sparse/arch/xen/drivers/blkif/Makefile
|
||||
4083dc16KQus88a4U3uCV6qVCA6_8Q linux-2.4.28-xen-sparse/arch/xen/drivers/blkif/backend/Makefile
|
||||
4075806dI5kfeMD5RV-DA0PYoThx_w linux-2.4.28-xen-sparse/arch/xen/drivers/blkif/frontend/Makefile
|
||||
4075806d4-j7vN0Mn0bklI1cRUX1vQ linux-2.4.28-xen-sparse/arch/xen/drivers/blkif/frontend/common.h
|
||||
4075806dibjCcfuXv6CINMhxWTw3jQ linux-2.4.28-xen-sparse/arch/xen/drivers/blkif/frontend/vbd.c
|
||||
3e5a4e65G3e2s0ghPMgiJ-gBTUJ0uQ linux-2.4.28-xen-sparse/arch/xen/drivers/console/Makefile
|
||||
3e5a4e656nfFISThfbyXQOA6HN6YHw linux-2.4.28-xen-sparse/arch/xen/drivers/dom0/Makefile
|
||||
40420a6ebRqDjufoN1WSJvolEW2Wjw linux-2.4.28-xen-sparse/arch/xen/drivers/evtchn/Makefile
|
||||
4083dc16-Kd5y9psK_yk161sme5j5Q linux-2.4.28-xen-sparse/arch/xen/drivers/netif/Makefile
|
||||
4083dc16UmHXxS9g_UFVnkUpN-oP2Q linux-2.4.28-xen-sparse/arch/xen/drivers/netif/backend/Makefile
|
||||
405853f2wg7JXZJNltspMwOZJklxgw linux-2.4.28-xen-sparse/arch/xen/drivers/netif/frontend/Makefile
|
||||
3e5a4e65lWzkiPXsZdzPt2RNnJGG1g linux-2.4.28-xen-sparse/arch/xen/kernel/Makefile
|
||||
3e5a4e65_hqfuxtGG8IUy6wRM86Ecg linux-2.4.28-xen-sparse/arch/xen/kernel/entry.S
|
||||
3e5a4e65Hy_1iUvMTPsNqGNXd9uFpg linux-2.4.28-xen-sparse/arch/xen/kernel/head.S
|
||||
3e5a4e65RMGcuA-HCn3-wNx3fFQwdg linux-2.4.28-xen-sparse/arch/xen/kernel/i386_ksyms.c
|
||||
3e5a4e653U6cELGv528IxOLHvCq8iA linux-2.4.28-xen-sparse/arch/xen/kernel/irq.c
|
||||
3e5a4e65muT6SU3ck47IP87Q7Ti5hA linux-2.4.28-xen-sparse/arch/xen/kernel/ldt.c
|
||||
4051db95N9N99FjsRwi49YKUNHWI8A linux-2.4.28-xen-sparse/arch/xen/kernel/pci-pc.c
|
||||
3e5a4e65IGt3WwQDNiL4h-gYWgNTWQ linux-2.4.28-xen-sparse/arch/xen/kernel/process.c
|
||||
3e5a4e66tR-qJMLj3MppcKqmvuI2XQ linux-2.4.28-xen-sparse/arch/xen/kernel/setup.c
|
||||
3e5a4e66fWSTagLGU2P8BGFGRjhDiw linux-2.4.28-xen-sparse/arch/xen/kernel/signal.c
|
||||
3e5a4e66N__lUXNwzQ-eADRzK9LXuQ linux-2.4.28-xen-sparse/arch/xen/kernel/time.c
|
||||
3e5a4e66aHCbQ_F5QZ8VeyikLmuRZQ linux-2.4.28-xen-sparse/arch/xen/kernel/traps.c
|
||||
3e5a4e66-9_NczrVMbuQkoSLyXckIw linux-2.4.28-xen-sparse/arch/xen/lib/Makefile
|
||||
3e5a4e6637ZDk0BvFEC-aFQs599-ng linux-2.4.28-xen-sparse/arch/xen/lib/delay.c
|
||||
3e5a4e66croVgpcJyJuF2ycQw0HuJw linux-2.4.28-xen-sparse/arch/xen/mm/Makefile
|
||||
3e5a4e66l8Q5Tv-6B3lQIRmaVbFPzg linux-2.4.28-xen-sparse/arch/xen/mm/fault.c
|
||||
3e5a4e661gLzzff25pJooKIIWe7IWg linux-2.4.28-xen-sparse/arch/xen/mm/init.c
|
||||
3f0bed43UUdQichXAiVNrjV-y2Kzcg linux-2.4.28-xen-sparse/arch/xen/mm/ioremap.c
|
||||
3e5a4e66qRlSTcjafidMB6ulECADvg linux-2.4.28-xen-sparse/arch/xen/vmlinux.lds
|
||||
3e5a4e66mrtlmV75L1tjKDg8RaM5gA linux-2.4.28-xen-sparse/drivers/block/ll_rw_blk.c
|
||||
40d70c24-Dy2HUMrwSZagfXvAPnI4w linux-2.4.28-xen-sparse/drivers/char/Makefile
|
||||
3f108aeaLcGDgQdFAANLTUEid0a05w linux-2.4.28-xen-sparse/drivers/char/mem.c
|
||||
3e5a4e66rw65CxyolW9PKz4GG42RcA linux-2.4.28-xen-sparse/drivers/char/tty_io.c
|
||||
40c9c0c1pPwYE3-4i-oI3ubUu7UgvQ linux-2.4.28-xen-sparse/drivers/scsi/aic7xxx/Makefile
|
||||
3e5a4e669uzIE54VwucPYtGwXLAbzA linux-2.4.28-xen-sparse/fs/exec.c
|
||||
3e5a4e66wbeCpsJgVf_U8Jde-CNcsA linux-2.4.28-xen-sparse/include/asm-xen/bugs.h
|
||||
3e5a4e66HdSkvIV6SJ1evG_xmTmXHA linux-2.4.28-xen-sparse/include/asm-xen/desc.h
|
||||
3e5a4e66SYp_UpAVcF8Lc1wa3Qtgzw linux-2.4.28-xen-sparse/include/asm-xen/fixmap.h
|
||||
406aeeaaQvl4RNtmd9hDEugBURbFpQ linux-2.4.28-xen-sparse/include/asm-xen/highmem.h
|
||||
3e5a4e67YtcyDLQsShhCfQwPSELfvA linux-2.4.28-xen-sparse/include/asm-xen/hw_irq.h
|
||||
4060044fVx7-tokvNLKBf_6qBB4lqQ linux-2.4.28-xen-sparse/include/asm-xen/io.h
|
||||
3e5a4e673p7PEOyHFm3nHkYX6HQYBg linux-2.4.28-xen-sparse/include/asm-xen/irq.h
|
||||
40d70c240tW7TWArl1VUgIFH2nVO1A linux-2.4.28-xen-sparse/include/asm-xen/keyboard.h
|
||||
3e5a4e678ddsQOpbSiRdy1GRcDc9WA linux-2.4.28-xen-sparse/include/asm-xen/mmu_context.h
|
||||
40d06e5b2YWInUX1Xv9amVANwd_2Xg linux-2.4.28-xen-sparse/include/asm-xen/module.h
|
||||
3e5a4e67mnQfh-R8KcQCaVo2Oho6yg linux-2.4.28-xen-sparse/include/asm-xen/page.h
|
||||
409ba2e7ZfV5hqTvIzxLtpClnxtIzg linux-2.4.28-xen-sparse/include/asm-xen/pci.h
|
||||
3e5a4e67uTYU5oEnIDjxuaez8njjqg linux-2.4.28-xen-sparse/include/asm-xen/pgalloc.h
|
||||
3e5a4e67X7JyupgdYkgDX19Huj2sAw linux-2.4.28-xen-sparse/include/asm-xen/pgtable-2level.h
|
||||
3e5a4e67gr4NLGtQ5CvSLimMYZlkOA linux-2.4.28-xen-sparse/include/asm-xen/pgtable.h
|
||||
3e5a4e676uK4xErTBDH6XJREn9LSyg linux-2.4.28-xen-sparse/include/asm-xen/processor.h
|
||||
41224663YBCUMX1kVo_HRUtgaHTi7w linux-2.4.28-xen-sparse/include/asm-xen/queues.h
|
||||
3e5a4e68uJz-xI0IBVMD7xRLQKJDFg linux-2.4.28-xen-sparse/include/asm-xen/segment.h
|
||||
3e5a4e68Nfdh6QcOKUTGCaYkf2LmYA linux-2.4.28-xen-sparse/include/asm-xen/smp.h
|
||||
4062f7e2PzFOUGT0PaE7A0VprTU3JQ linux-2.4.28-xen-sparse/include/asm-xen/synch_bitops.h
|
||||
3e5a4e68mTr0zcp9SXDbnd-XLrrfxw linux-2.4.28-xen-sparse/include/asm-xen/system.h
|
||||
3f1056a9L_kqHcFheV00KbKBzv9j5w linux-2.4.28-xen-sparse/include/asm-xen/vga.h
|
||||
40659defgWA92arexpMGn8X3QMDj3w linux-2.4.28-xen-sparse/include/asm-xen/xor.h
|
||||
3f056927gMHl7mWB89rb73JahbhQIA linux-2.4.28-xen-sparse/include/linux/blk.h
|
||||
419e0488SBzS3mdUhwgsES5a5e3abA linux-2.4.28-xen-sparse/include/linux/irq.h
|
||||
4124f66fPHG6yvB_vXmesjvzrJ3yMg linux-2.4.28-xen-sparse/include/linux/mm.h
|
||||
401c0590D_kwJDU59X8NyvqSv_Cl2A linux-2.4.28-xen-sparse/include/linux/sched.h
|
||||
40a248afgI0_JKthdYAe8beVfXSTpQ linux-2.4.28-xen-sparse/include/linux/skbuff.h
|
||||
401c0592pLrp_aCbQRo9GXiYQQaVVA linux-2.4.28-xen-sparse/include/linux/timer.h
|
||||
3f9d4b44247udoqWEgFkaHiWv6Uvyg linux-2.4.28-xen-sparse/kernel/time.c
|
||||
401c059bjLBFYHRD4Py2uM3eA1D4zQ linux-2.4.28-xen-sparse/kernel/timer.c
|
||||
3e6e7c1efbQe93xCvOpOVCnXTMmQ5w linux-2.4.28-xen-sparse/mkbuildtree
|
||||
406aeeafkrnCuIVWLFv3kfn4uAD5Eg linux-2.4.28-xen-sparse/mm/highmem.c
|
||||
3e5a4e68GxCIaFH4sy01v1wjapetaA linux-2.4.28-xen-sparse/mm/memory.c
|
||||
3f108af5VxPkLv13tXpXgoRKALQtXQ linux-2.4.28-xen-sparse/mm/mprotect.c
|
||||
3e5a4e681xMPdF9xCMwpyfuYMySU5g linux-2.4.28-xen-sparse/mm/mremap.c
|
||||
409ba2e7akOFqQUg6Qyg2s28xcXiMg linux-2.4.28-xen-sparse/mm/page_alloc.c
|
||||
3e5a4e683HKVU-sxtagrDasRB8eBVw linux-2.4.28-xen-sparse/mm/swapfile.c
|
||||
41180721bNns9Na7w1nJ0ZVt8bhUNA linux-2.4.28-xen-sparse/mm/vmalloc.c
|
||||
41505c57WAd5l1rlfCLNSCpx9J13vA linux-2.4.28-xen-sparse/net/core/skbuff.c
|
||||
3e5a4e6589G-U42lFKs43plskXoFxQ linux-2.4.29-xen-sparse/Makefile
|
||||
3e5a4e65IEPjnWPZ5w3TxS5scV8Ewg linux-2.4.29-xen-sparse/arch/xen/Makefile
|
||||
3e5a4e65n-KhsEAs-A4ULiStBp-r6w linux-2.4.29-xen-sparse/arch/xen/boot/Makefile
|
||||
3e5a4e65OV_j_DBtjzt5vej771AJsA linux-2.4.29-xen-sparse/arch/xen/config.in
|
||||
40648526SxcA4lGIHB_k7ID8VlRSzw linux-2.4.29-xen-sparse/arch/xen/defconfig-xen0
|
||||
40c73c77QesbL7eIvG-fJGAtVwhGRg linux-2.4.29-xen-sparse/arch/xen/defconfig-xenU
|
||||
3e6377f5xwPfYZkPHPrDbEq1PRN7uQ linux-2.4.29-xen-sparse/arch/xen/drivers/balloon/Makefile
|
||||
4083dc16z0jvZEH4PiVDbDRreaNp6w linux-2.4.29-xen-sparse/arch/xen/drivers/blkif/Makefile
|
||||
4083dc16KQus88a4U3uCV6qVCA6_8Q linux-2.4.29-xen-sparse/arch/xen/drivers/blkif/backend/Makefile
|
||||
4075806dI5kfeMD5RV-DA0PYoThx_w linux-2.4.29-xen-sparse/arch/xen/drivers/blkif/frontend/Makefile
|
||||
4075806d4-j7vN0Mn0bklI1cRUX1vQ linux-2.4.29-xen-sparse/arch/xen/drivers/blkif/frontend/common.h
|
||||
4075806dibjCcfuXv6CINMhxWTw3jQ linux-2.4.29-xen-sparse/arch/xen/drivers/blkif/frontend/vbd.c
|
||||
3e5a4e65G3e2s0ghPMgiJ-gBTUJ0uQ linux-2.4.29-xen-sparse/arch/xen/drivers/console/Makefile
|
||||
3e5a4e656nfFISThfbyXQOA6HN6YHw linux-2.4.29-xen-sparse/arch/xen/drivers/dom0/Makefile
|
||||
40420a6ebRqDjufoN1WSJvolEW2Wjw linux-2.4.29-xen-sparse/arch/xen/drivers/evtchn/Makefile
|
||||
4083dc16-Kd5y9psK_yk161sme5j5Q linux-2.4.29-xen-sparse/arch/xen/drivers/netif/Makefile
|
||||
4083dc16UmHXxS9g_UFVnkUpN-oP2Q linux-2.4.29-xen-sparse/arch/xen/drivers/netif/backend/Makefile
|
||||
405853f2wg7JXZJNltspMwOZJklxgw linux-2.4.29-xen-sparse/arch/xen/drivers/netif/frontend/Makefile
|
||||
3e5a4e65lWzkiPXsZdzPt2RNnJGG1g linux-2.4.29-xen-sparse/arch/xen/kernel/Makefile
|
||||
3e5a4e65_hqfuxtGG8IUy6wRM86Ecg linux-2.4.29-xen-sparse/arch/xen/kernel/entry.S
|
||||
3e5a4e65Hy_1iUvMTPsNqGNXd9uFpg linux-2.4.29-xen-sparse/arch/xen/kernel/head.S
|
||||
3e5a4e65RMGcuA-HCn3-wNx3fFQwdg linux-2.4.29-xen-sparse/arch/xen/kernel/i386_ksyms.c
|
||||
3e5a4e653U6cELGv528IxOLHvCq8iA linux-2.4.29-xen-sparse/arch/xen/kernel/irq.c
|
||||
3e5a4e65muT6SU3ck47IP87Q7Ti5hA linux-2.4.29-xen-sparse/arch/xen/kernel/ldt.c
|
||||
4051db95N9N99FjsRwi49YKUNHWI8A linux-2.4.29-xen-sparse/arch/xen/kernel/pci-pc.c
|
||||
3e5a4e65IGt3WwQDNiL4h-gYWgNTWQ linux-2.4.29-xen-sparse/arch/xen/kernel/process.c
|
||||
3e5a4e66tR-qJMLj3MppcKqmvuI2XQ linux-2.4.29-xen-sparse/arch/xen/kernel/setup.c
|
||||
3e5a4e66fWSTagLGU2P8BGFGRjhDiw linux-2.4.29-xen-sparse/arch/xen/kernel/signal.c
|
||||
3e5a4e66N__lUXNwzQ-eADRzK9LXuQ linux-2.4.29-xen-sparse/arch/xen/kernel/time.c
|
||||
3e5a4e66aHCbQ_F5QZ8VeyikLmuRZQ linux-2.4.29-xen-sparse/arch/xen/kernel/traps.c
|
||||
3e5a4e66-9_NczrVMbuQkoSLyXckIw linux-2.4.29-xen-sparse/arch/xen/lib/Makefile
|
||||
3e5a4e6637ZDk0BvFEC-aFQs599-ng linux-2.4.29-xen-sparse/arch/xen/lib/delay.c
|
||||
3e5a4e66croVgpcJyJuF2ycQw0HuJw linux-2.4.29-xen-sparse/arch/xen/mm/Makefile
|
||||
3e5a4e66l8Q5Tv-6B3lQIRmaVbFPzg linux-2.4.29-xen-sparse/arch/xen/mm/fault.c
|
||||
3e5a4e661gLzzff25pJooKIIWe7IWg linux-2.4.29-xen-sparse/arch/xen/mm/init.c
|
||||
3f0bed43UUdQichXAiVNrjV-y2Kzcg linux-2.4.29-xen-sparse/arch/xen/mm/ioremap.c
|
||||
3e5a4e66qRlSTcjafidMB6ulECADvg linux-2.4.29-xen-sparse/arch/xen/vmlinux.lds
|
||||
3e5a4e66mrtlmV75L1tjKDg8RaM5gA linux-2.4.29-xen-sparse/drivers/block/ll_rw_blk.c
|
||||
40d70c24-Dy2HUMrwSZagfXvAPnI4w linux-2.4.29-xen-sparse/drivers/char/Makefile
|
||||
3f108aeaLcGDgQdFAANLTUEid0a05w linux-2.4.29-xen-sparse/drivers/char/mem.c
|
||||
3e5a4e66rw65CxyolW9PKz4GG42RcA linux-2.4.29-xen-sparse/drivers/char/tty_io.c
|
||||
40c9c0c1pPwYE3-4i-oI3ubUu7UgvQ linux-2.4.29-xen-sparse/drivers/scsi/aic7xxx/Makefile
|
||||
3e5a4e669uzIE54VwucPYtGwXLAbzA linux-2.4.29-xen-sparse/fs/exec.c
|
||||
3e5a4e66wbeCpsJgVf_U8Jde-CNcsA linux-2.4.29-xen-sparse/include/asm-xen/bugs.h
|
||||
3e5a4e66HdSkvIV6SJ1evG_xmTmXHA linux-2.4.29-xen-sparse/include/asm-xen/desc.h
|
||||
3e5a4e66SYp_UpAVcF8Lc1wa3Qtgzw linux-2.4.29-xen-sparse/include/asm-xen/fixmap.h
|
||||
406aeeaaQvl4RNtmd9hDEugBURbFpQ linux-2.4.29-xen-sparse/include/asm-xen/highmem.h
|
||||
3e5a4e67YtcyDLQsShhCfQwPSELfvA linux-2.4.29-xen-sparse/include/asm-xen/hw_irq.h
|
||||
4060044fVx7-tokvNLKBf_6qBB4lqQ linux-2.4.29-xen-sparse/include/asm-xen/io.h
|
||||
3e5a4e673p7PEOyHFm3nHkYX6HQYBg linux-2.4.29-xen-sparse/include/asm-xen/irq.h
|
||||
40d70c240tW7TWArl1VUgIFH2nVO1A linux-2.4.29-xen-sparse/include/asm-xen/keyboard.h
|
||||
3e5a4e678ddsQOpbSiRdy1GRcDc9WA linux-2.4.29-xen-sparse/include/asm-xen/mmu_context.h
|
||||
40d06e5b2YWInUX1Xv9amVANwd_2Xg linux-2.4.29-xen-sparse/include/asm-xen/module.h
|
||||
3e5a4e67mnQfh-R8KcQCaVo2Oho6yg linux-2.4.29-xen-sparse/include/asm-xen/page.h
|
||||
409ba2e7ZfV5hqTvIzxLtpClnxtIzg linux-2.4.29-xen-sparse/include/asm-xen/pci.h
|
||||
3e5a4e67uTYU5oEnIDjxuaez8njjqg linux-2.4.29-xen-sparse/include/asm-xen/pgalloc.h
|
||||
3e5a4e67X7JyupgdYkgDX19Huj2sAw linux-2.4.29-xen-sparse/include/asm-xen/pgtable-2level.h
|
||||
3e5a4e67gr4NLGtQ5CvSLimMYZlkOA linux-2.4.29-xen-sparse/include/asm-xen/pgtable.h
|
||||
3e5a4e676uK4xErTBDH6XJREn9LSyg linux-2.4.29-xen-sparse/include/asm-xen/processor.h
|
||||
41224663YBCUMX1kVo_HRUtgaHTi7w linux-2.4.29-xen-sparse/include/asm-xen/queues.h
|
||||
3e5a4e68uJz-xI0IBVMD7xRLQKJDFg linux-2.4.29-xen-sparse/include/asm-xen/segment.h
|
||||
3e5a4e68Nfdh6QcOKUTGCaYkf2LmYA linux-2.4.29-xen-sparse/include/asm-xen/smp.h
|
||||
4062f7e2PzFOUGT0PaE7A0VprTU3JQ linux-2.4.29-xen-sparse/include/asm-xen/synch_bitops.h
|
||||
3e5a4e68mTr0zcp9SXDbnd-XLrrfxw linux-2.4.29-xen-sparse/include/asm-xen/system.h
|
||||
3f1056a9L_kqHcFheV00KbKBzv9j5w linux-2.4.29-xen-sparse/include/asm-xen/vga.h
|
||||
40659defgWA92arexpMGn8X3QMDj3w linux-2.4.29-xen-sparse/include/asm-xen/xor.h
|
||||
3f056927gMHl7mWB89rb73JahbhQIA linux-2.4.29-xen-sparse/include/linux/blk.h
|
||||
419e0488SBzS3mdUhwgsES5a5e3abA linux-2.4.29-xen-sparse/include/linux/irq.h
|
||||
4124f66fPHG6yvB_vXmesjvzrJ3yMg linux-2.4.29-xen-sparse/include/linux/mm.h
|
||||
401c0590D_kwJDU59X8NyvqSv_Cl2A linux-2.4.29-xen-sparse/include/linux/sched.h
|
||||
40a248afgI0_JKthdYAe8beVfXSTpQ linux-2.4.29-xen-sparse/include/linux/skbuff.h
|
||||
401c0592pLrp_aCbQRo9GXiYQQaVVA linux-2.4.29-xen-sparse/include/linux/timer.h
|
||||
3f9d4b44247udoqWEgFkaHiWv6Uvyg linux-2.4.29-xen-sparse/kernel/time.c
|
||||
401c059bjLBFYHRD4Py2uM3eA1D4zQ linux-2.4.29-xen-sparse/kernel/timer.c
|
||||
3e6e7c1efbQe93xCvOpOVCnXTMmQ5w linux-2.4.29-xen-sparse/mkbuildtree
|
||||
406aeeafkrnCuIVWLFv3kfn4uAD5Eg linux-2.4.29-xen-sparse/mm/highmem.c
|
||||
3e5a4e68GxCIaFH4sy01v1wjapetaA linux-2.4.29-xen-sparse/mm/memory.c
|
||||
3f108af5VxPkLv13tXpXgoRKALQtXQ linux-2.4.29-xen-sparse/mm/mprotect.c
|
||||
3e5a4e681xMPdF9xCMwpyfuYMySU5g linux-2.4.29-xen-sparse/mm/mremap.c
|
||||
409ba2e7akOFqQUg6Qyg2s28xcXiMg linux-2.4.29-xen-sparse/mm/page_alloc.c
|
||||
3e5a4e683HKVU-sxtagrDasRB8eBVw linux-2.4.29-xen-sparse/mm/swapfile.c
|
||||
41180721bNns9Na7w1nJ0ZVt8bhUNA linux-2.4.29-xen-sparse/mm/vmalloc.c
|
||||
41505c57WAd5l1rlfCLNSCpx9J13vA linux-2.4.29-xen-sparse/net/core/skbuff.c
|
||||
40f562372u3A7_kfbYYixPHJJxYUxA linux-2.6.10-xen-sparse/arch/xen/Kconfig
|
||||
40f56237utH41NPukqHksuNf29IC9A linux-2.6.10-xen-sparse/arch/xen/Kconfig.drivers
|
||||
40f56237penAAlWVBVDpeQZNFIg8CA linux-2.6.10-xen-sparse/arch/xen/Makefile
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 28
|
||||
SUBLEVEL = 29
|
||||
EXTRAVERSION =
|
||||
|
||||
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
-6
@@ -196,7 +196,6 @@ CONFIG_IP_NF_NAT=m
|
||||
CONFIG_IP_NF_NAT_NEEDED=y
|
||||
CONFIG_IP_NF_TARGET_MASQUERADE=m
|
||||
CONFIG_IP_NF_TARGET_REDIRECT=m
|
||||
# CONFIG_IP_NF_NAT_LOCAL is not set
|
||||
# CONFIG_IP_NF_NAT_SNMP_BASIC is not set
|
||||
CONFIG_IP_NF_NAT_IRC=m
|
||||
CONFIG_IP_NF_NAT_FTP=m
|
||||
@@ -226,11 +225,6 @@ CONFIG_VLAN_8021Q=y
|
||||
#
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
|
||||
#
|
||||
# Appletalk devices
|
||||
#
|
||||
# CONFIG_DEV_APPLETALK is not set
|
||||
# CONFIG_DECNET is not set
|
||||
CONFIG_BRIDGE=y
|
||||
CONFIG_BRIDGE_NF_EBTABLES=m
|
||||
@@ -421,6 +415,7 @@ CONFIG_AIC79XX_DEBUG_MASK=0
|
||||
CONFIG_SCSI_MEGARAID=y
|
||||
# CONFIG_SCSI_MEGARAID2 is not set
|
||||
CONFIG_SCSI_SATA=y
|
||||
# CONFIG_SCSI_SATA_AHCI is not set
|
||||
# CONFIG_SCSI_SATA_SVW is not set
|
||||
CONFIG_SCSI_ATA_PIIX=y
|
||||
# CONFIG_SCSI_SATA_NV is not set
|
||||
+1
-6
@@ -130,7 +130,6 @@ CONFIG_IP_NF_NAT=y
|
||||
CONFIG_IP_NF_NAT_NEEDED=y
|
||||
CONFIG_IP_NF_TARGET_MASQUERADE=y
|
||||
CONFIG_IP_NF_TARGET_REDIRECT=y
|
||||
# CONFIG_IP_NF_NAT_LOCAL is not set
|
||||
# CONFIG_IP_NF_NAT_SNMP_BASIC is not set
|
||||
CONFIG_IP_NF_NAT_IRC=y
|
||||
CONFIG_IP_NF_NAT_FTP=y
|
||||
@@ -160,11 +159,6 @@ CONFIG_VLAN_8021Q=y
|
||||
#
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
|
||||
#
|
||||
# Appletalk devices
|
||||
#
|
||||
# CONFIG_DEV_APPLETALK is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_X25 is not set
|
||||
@@ -228,6 +222,7 @@ CONFIG_CHR_DEV_SG=y
|
||||
# CONFIG_SCSI_MEGARAID is not set
|
||||
# CONFIG_SCSI_MEGARAID2 is not set
|
||||
# CONFIG_SCSI_SATA is not set
|
||||
# CONFIG_SCSI_SATA_AHCI is not set
|
||||
# CONFIG_SCSI_SATA_SVW is not set
|
||||
# CONFIG_SCSI_ATA_PIIX is not set
|
||||
# CONFIG_SCSI_SATA_NV is not set
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+508
-89
@@ -124,7 +124,6 @@ extern void disable_early_printk(void);
|
||||
|
||||
struct termios tty_std_termios; /* for the benefit of tty drivers */
|
||||
struct tty_driver *tty_drivers; /* linked list of tty drivers */
|
||||
struct tty_ldisc ldiscs[NR_LDISCS]; /* line disc dispatch table */
|
||||
|
||||
#ifdef CONFIG_UNIX98_PTYS
|
||||
extern struct tty_driver ptm_driver[]; /* Unix98 pty masters; for /dev/ptmx */
|
||||
@@ -264,63 +263,314 @@ static int check_tty_count(struct tty_struct *tty, const char *routine)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is probably overkill for real world processors but
|
||||
* they are not on hot paths so a little discipline won't do
|
||||
* any harm.
|
||||
*/
|
||||
|
||||
static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
|
||||
{
|
||||
down(&tty->termios_sem);
|
||||
tty->termios->c_line = num;
|
||||
up(&tty->termios_sem);
|
||||
}
|
||||
|
||||
/*
|
||||
* This guards the refcounted line discipline lists. The lock
|
||||
* must be taken with irqs off because there are hangup path
|
||||
* callers who will do ldisc lookups and cannot sleep.
|
||||
*/
|
||||
|
||||
spinlock_t tty_ldisc_lock = SPIN_LOCK_UNLOCKED;
|
||||
DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
|
||||
struct tty_ldisc tty_ldiscs[NR_LDISCS]; /* line disc dispatch table */
|
||||
|
||||
int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc)
|
||||
{
|
||||
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
if (disc < N_TTY || disc >= NR_LDISCS)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
spin_lock_irqsave(&tty_ldisc_lock, flags);
|
||||
if (new_ldisc) {
|
||||
ldiscs[disc] = *new_ldisc;
|
||||
ldiscs[disc].flags |= LDISC_FLAG_DEFINED;
|
||||
ldiscs[disc].num = disc;
|
||||
} else
|
||||
memset(&ldiscs[disc], 0, sizeof(struct tty_ldisc));
|
||||
tty_ldiscs[disc] = *new_ldisc;
|
||||
tty_ldiscs[disc].num = disc;
|
||||
tty_ldiscs[disc].flags |= LDISC_FLAG_DEFINED;
|
||||
tty_ldiscs[disc].refcount = 0;
|
||||
} else {
|
||||
if(tty_ldiscs[disc].refcount)
|
||||
ret = -EBUSY;
|
||||
else
|
||||
tty_ldiscs[disc].flags &= ~LDISC_FLAG_DEFINED;
|
||||
}
|
||||
spin_unlock_irqrestore(&tty_ldisc_lock, flags);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
EXPORT_SYMBOL(tty_register_ldisc);
|
||||
|
||||
/* Set the discipline of a tty line. */
|
||||
struct tty_ldisc *tty_ldisc_get(int disc)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct tty_ldisc *ld;
|
||||
|
||||
if (disc < N_TTY || disc >= NR_LDISCS)
|
||||
return NULL;
|
||||
|
||||
spin_lock_irqsave(&tty_ldisc_lock, flags);
|
||||
|
||||
ld = &tty_ldiscs[disc];
|
||||
/* Check the entry is defined */
|
||||
if(ld->flags & LDISC_FLAG_DEFINED)
|
||||
ld->refcount++;
|
||||
else
|
||||
ld = NULL;
|
||||
spin_unlock_irqrestore(&tty_ldisc_lock, flags);
|
||||
return ld;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(tty_ldisc_get);
|
||||
|
||||
void tty_ldisc_put(int disc)
|
||||
{
|
||||
struct tty_ldisc *ld;
|
||||
unsigned long flags;
|
||||
|
||||
if (disc < N_TTY || disc >= NR_LDISCS)
|
||||
BUG();
|
||||
|
||||
spin_lock_irqsave(&tty_ldisc_lock, flags);
|
||||
ld = &tty_ldiscs[disc];
|
||||
if(ld->refcount <= 0)
|
||||
BUG();
|
||||
ld->refcount--;
|
||||
spin_unlock_irqrestore(&tty_ldisc_lock, flags);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(tty_ldisc_put);
|
||||
|
||||
void tty_ldisc_assign(struct tty_struct *tty, struct tty_ldisc *ld)
|
||||
{
|
||||
tty->ldisc = *ld;
|
||||
tty->ldisc.refcount = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* tty_ldisc_try - internal helper
|
||||
* @tty: the tty
|
||||
*
|
||||
* Make a single attempt to grab and bump the refcount on
|
||||
* the tty ldisc. Return 0 on failure or 1 on success. This is
|
||||
* used to implement both the waiting and non waiting versions
|
||||
* of tty_ldisc_ref
|
||||
*/
|
||||
|
||||
static int tty_ldisc_try(struct tty_struct *tty)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct tty_ldisc *ld;
|
||||
int ret = 0;
|
||||
|
||||
spin_lock_irqsave(&tty_ldisc_lock, flags);
|
||||
ld = &tty->ldisc;
|
||||
if(test_bit(TTY_LDISC, &tty->flags))
|
||||
{
|
||||
ld->refcount++;
|
||||
ret = 1;
|
||||
}
|
||||
spin_unlock_irqrestore(&tty_ldisc_lock, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* tty_ldisc_ref_wait - wait for the tty ldisc
|
||||
* @tty: tty device
|
||||
*
|
||||
* Dereference the line discipline for the terminal and take a
|
||||
* reference to it. If the line discipline is in flux then
|
||||
* wait patiently until it changes.
|
||||
*
|
||||
* Note: Must not be called from an IRQ/timer context. The caller
|
||||
* must also be careful not to hold other locks that will deadlock
|
||||
* against a discipline change, such as an existing ldisc reference
|
||||
* (which we check for)
|
||||
*/
|
||||
|
||||
struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
|
||||
{
|
||||
/* wait_event is a macro */
|
||||
wait_event(tty_ldisc_wait, tty_ldisc_try(tty));
|
||||
return &tty->ldisc;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
|
||||
|
||||
/**
|
||||
* tty_ldisc_ref - get the tty ldisc
|
||||
* @tty: tty device
|
||||
*
|
||||
* Dereference the line discipline for the terminal and take a
|
||||
* reference to it. If the line discipline is in flux then
|
||||
* return NULL. Can be called from IRQ and timer functions.
|
||||
*/
|
||||
|
||||
struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
|
||||
{
|
||||
if(tty_ldisc_try(tty))
|
||||
return &tty->ldisc;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(tty_ldisc_ref);
|
||||
|
||||
|
||||
void tty_ldisc_deref(struct tty_ldisc *ld)
|
||||
{
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
if(ld == NULL)
|
||||
BUG();
|
||||
|
||||
spin_lock_irqsave(&tty_ldisc_lock, flags);
|
||||
if(ld->refcount == 0)
|
||||
printk(KERN_EMERG "tty_ldisc_deref: no references.\n");
|
||||
else
|
||||
ld->refcount--;
|
||||
if(ld->refcount == 0)
|
||||
wake_up(&tty_ldisc_wait);
|
||||
spin_unlock_irqrestore(&tty_ldisc_lock, flags);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(tty_ldisc_deref);
|
||||
|
||||
/**
|
||||
* tty_ldisc_enable - allow ldisc use
|
||||
* @tty: terminal to activate ldisc on
|
||||
*
|
||||
* Set the TTY_LDISC flag when the line discipline can be called
|
||||
* again. Do neccessary wakeups for existing sleepers.
|
||||
*
|
||||
* Note: nobody should set this bit except via this function. Clearing
|
||||
* directly is allowed.
|
||||
*/
|
||||
|
||||
static void tty_ldisc_enable(struct tty_struct *tty)
|
||||
{
|
||||
set_bit(TTY_LDISC, &tty->flags);
|
||||
wake_up(&tty_ldisc_wait);
|
||||
}
|
||||
|
||||
/**
|
||||
* tty_set_ldisc - set line discipline
|
||||
* @tty: the terminal to set
|
||||
* @ldisc: the line discipline
|
||||
*
|
||||
* Set the discipline of a tty line. Must be called from a process
|
||||
* context.
|
||||
*/
|
||||
|
||||
static int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
||||
{
|
||||
int retval = 0;
|
||||
struct tty_ldisc o_ldisc;
|
||||
char buf[64];
|
||||
unsigned long flags;
|
||||
struct tty_ldisc *ld;
|
||||
|
||||
if ((ldisc < N_TTY) || (ldisc >= NR_LDISCS))
|
||||
return -EINVAL;
|
||||
/* Eduardo Blanco <ejbs@cs.cs.com.uy> */
|
||||
/* Cyrus Durgin <cider@speakeasy.org> */
|
||||
if (!(ldiscs[ldisc].flags & LDISC_FLAG_DEFINED)) {
|
||||
char modname [20];
|
||||
sprintf(modname, "tty-ldisc-%d", ldisc);
|
||||
request_module (modname);
|
||||
}
|
||||
if (!(ldiscs[ldisc].flags & LDISC_FLAG_DEFINED))
|
||||
return -EINVAL;
|
||||
|
||||
restart:
|
||||
|
||||
if (tty->ldisc.num == ldisc)
|
||||
return 0; /* We are already in the desired discipline */
|
||||
o_ldisc = tty->ldisc;
|
||||
return 0; /* We are already in the desired discipline */
|
||||
|
||||
ld = tty_ldisc_get(ldisc);
|
||||
/* Eduardo Blanco <ejbs@cs.cs.com.uy> */
|
||||
/* Cyrus Durgin <cider@speakeasy.org> */
|
||||
if (ld == NULL)
|
||||
{
|
||||
char modname [20];
|
||||
sprintf(modname, "tty-ldisc-%d", ldisc);
|
||||
request_module (modname);
|
||||
ld = tty_ldisc_get(ldisc);
|
||||
}
|
||||
|
||||
if (ld == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
o_ldisc = tty->ldisc;
|
||||
tty_wait_until_sent(tty, 0);
|
||||
|
||||
/*
|
||||
* Make sure we don't change while someone holds a
|
||||
* reference to the line discipline. The TTY_LDISC bit
|
||||
* prevents anyone taking a reference once it is clear.
|
||||
* We need the lock to avoid racing reference takers.
|
||||
*/
|
||||
|
||||
spin_lock_irqsave(&tty_ldisc_lock, flags);
|
||||
if(tty->ldisc.refcount)
|
||||
{
|
||||
/* Free the new ldisc we grabbed. Must drop the lock
|
||||
first. */
|
||||
spin_unlock_irqrestore(&tty_ldisc_lock, flags);
|
||||
tty_ldisc_put(ldisc);
|
||||
/*
|
||||
* There are several reasons we may be busy, including
|
||||
* random momentary I/O traffic. We must therefore
|
||||
* retry. We could distinguish between blocking ops
|
||||
* and retries if we made tty_ldisc_wait() smarter. That
|
||||
* is up for discussion.
|
||||
*/
|
||||
if(wait_event_interruptible(tty_ldisc_wait, tty->ldisc.refcount == 0) < 0)
|
||||
return -ERESTARTSYS;
|
||||
goto restart;
|
||||
}
|
||||
clear_bit(TTY_LDISC, &tty->flags);
|
||||
clear_bit(TTY_DONT_FLIP, &tty->flags);
|
||||
spin_unlock_irqrestore(&tty_ldisc_lock, flags);
|
||||
|
||||
/*
|
||||
* From this point on we know nobody has an ldisc
|
||||
* usage reference, nor can they obtain one until
|
||||
* we say so later on.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Wait for ->hangup_work and ->flip.work handlers to terminate
|
||||
*/
|
||||
run_task_queue(&tq_timer);
|
||||
flush_scheduled_tasks();
|
||||
|
||||
/* Shutdown the current discipline. */
|
||||
if (tty->ldisc.close)
|
||||
(tty->ldisc.close)(tty);
|
||||
|
||||
/* Now set up the new line discipline. */
|
||||
tty->ldisc = ldiscs[ldisc];
|
||||
tty->termios->c_line = ldisc;
|
||||
tty_ldisc_assign(tty, ld);
|
||||
tty_set_termios_ldisc(tty, ldisc);
|
||||
if (tty->ldisc.open)
|
||||
retval = (tty->ldisc.open)(tty);
|
||||
if (retval < 0) {
|
||||
tty->ldisc = o_ldisc;
|
||||
tty->termios->c_line = tty->ldisc.num;
|
||||
tty_ldisc_put(ldisc);
|
||||
/* There is an outstanding reference here so this is safe */
|
||||
tty_ldisc_assign(tty, tty_ldisc_get(o_ldisc.num));
|
||||
tty_set_termios_ldisc(tty, tty->ldisc.num);
|
||||
if (tty->ldisc.open && (tty->ldisc.open(tty) < 0)) {
|
||||
tty->ldisc = ldiscs[N_TTY];
|
||||
tty->termios->c_line = N_TTY;
|
||||
tty_ldisc_put(o_ldisc.num);
|
||||
/* This driver is always present */
|
||||
tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
|
||||
tty_set_termios_ldisc(tty, N_TTY);
|
||||
if (tty->ldisc.open) {
|
||||
int r = tty->ldisc.open(tty);
|
||||
|
||||
@@ -331,8 +581,21 @@ static int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
||||
}
|
||||
}
|
||||
}
|
||||
/* At this point we hold a reference to the new ldisc and a
|
||||
reference to the old ldisc. If we ended up flipping back
|
||||
to the existing ldisc we have two references to it */
|
||||
|
||||
if (tty->ldisc.num != o_ldisc.num && tty->driver.set_ldisc)
|
||||
tty->driver.set_ldisc(tty);
|
||||
|
||||
tty_ldisc_put(o_ldisc.num);
|
||||
|
||||
/*
|
||||
* Allow ldisc referencing to occur as soon as the driver
|
||||
* ldisc callback completes.
|
||||
*/
|
||||
tty_ldisc_enable(tty);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -434,11 +697,55 @@ static struct file_operations hung_up_tty_fops = {
|
||||
|
||||
static spinlock_t redirect_lock = SPIN_LOCK_UNLOCKED;
|
||||
static struct file *redirect;
|
||||
|
||||
/**
|
||||
* tty_wakeup - request more data
|
||||
* @tty: terminal
|
||||
*
|
||||
* Internal and external helper for wakeups of tty. This function
|
||||
* informs the line discipline if present that the driver is ready\
|
||||
* to receive more output data.
|
||||
*/
|
||||
|
||||
void tty_wakeup(struct tty_struct *tty)
|
||||
{
|
||||
struct tty_ldisc *ld;
|
||||
|
||||
if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) {
|
||||
ld = tty_ldisc_ref(tty);
|
||||
if(ld) {
|
||||
if(ld->write_wakeup)
|
||||
ld->write_wakeup(tty);
|
||||
tty_ldisc_deref(ld);
|
||||
}
|
||||
}
|
||||
wake_up_interruptible(&tty->write_wait);
|
||||
}
|
||||
|
||||
/*
|
||||
* This can be called by the "eventd" kernel thread. That is process synchronous,
|
||||
* but doesn't hold any locks, so we need to make sure we have the appropriate
|
||||
* locks for what we're doing..
|
||||
* tty_wakeup/tty_ldisc_flush are actually _GPL exports but we can't do
|
||||
* that in 2.4 for modutils compat reasons.
|
||||
*/
|
||||
EXPORT_SYMBOL(tty_wakeup);
|
||||
|
||||
|
||||
void tty_ldisc_flush(struct tty_struct *tty)
|
||||
{
|
||||
struct tty_ldisc *ld = tty_ldisc_ref(tty);
|
||||
if(ld) {
|
||||
if(ld->flush_buffer)
|
||||
ld->flush_buffer(tty);
|
||||
tty_ldisc_deref(ld);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* tty_wakeup/tty_ldisc_flush are actually _GPL exports but we can't do
|
||||
* that in 2.4 for modutils compat reasons.
|
||||
*/
|
||||
EXPORT_SYMBOL(tty_ldisc_flush);
|
||||
|
||||
void do_tty_hangup(void *data)
|
||||
{
|
||||
struct tty_struct *tty = (struct tty_struct *) data;
|
||||
@@ -446,6 +753,7 @@ void do_tty_hangup(void *data)
|
||||
struct file *f = NULL;
|
||||
struct task_struct *p;
|
||||
struct list_head *l;
|
||||
struct tty_ldisc *ld;
|
||||
int closecount = 0, n;
|
||||
|
||||
if (!tty)
|
||||
@@ -479,20 +787,22 @@ void do_tty_hangup(void *data)
|
||||
file_list_unlock();
|
||||
|
||||
/* FIXME! What are the locking issues here? This may me overdoing things.. */
|
||||
ld = tty_ldisc_ref(tty);
|
||||
if(ld != NULL)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
save_flags(flags); cli();
|
||||
if (tty->ldisc.flush_buffer)
|
||||
tty->ldisc.flush_buffer(tty);
|
||||
if (ld->flush_buffer)
|
||||
ld->flush_buffer(tty);
|
||||
if (tty->driver.flush_buffer)
|
||||
tty->driver.flush_buffer(tty);
|
||||
if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
|
||||
tty->ldisc.write_wakeup)
|
||||
(tty->ldisc.write_wakeup)(tty);
|
||||
restore_flags(flags);
|
||||
if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) && ld->write_wakeup)
|
||||
ld->write_wakeup(tty);
|
||||
if (ld->hangup)
|
||||
ld->hangup(tty);
|
||||
}
|
||||
|
||||
/* FIXME: Once we trust the LDISC code better we can wait here for
|
||||
ldisc completion and fix the driver call race */
|
||||
|
||||
wake_up_interruptible(&tty->write_wait);
|
||||
wake_up_interruptible(&tty->read_wait);
|
||||
|
||||
@@ -500,21 +810,19 @@ void do_tty_hangup(void *data)
|
||||
* Shutdown the current line discipline, and reset it to
|
||||
* N_TTY.
|
||||
*/
|
||||
|
||||
if (tty->driver.flags & TTY_DRIVER_RESET_TERMIOS)
|
||||
*tty->termios = tty->driver.init_termios;
|
||||
if (tty->ldisc.num != ldiscs[N_TTY].num) {
|
||||
if (tty->ldisc.close)
|
||||
(tty->ldisc.close)(tty);
|
||||
tty->ldisc = ldiscs[N_TTY];
|
||||
tty->termios->c_line = N_TTY;
|
||||
if (tty->ldisc.open) {
|
||||
int i = (tty->ldisc.open)(tty);
|
||||
if (i < 0)
|
||||
printk(KERN_ERR "do_tty_hangup: N_TTY open: "
|
||||
"error %d\n", -i);
|
||||
}
|
||||
{
|
||||
down(&tty->termios_sem);
|
||||
*tty->termios = tty->driver.init_termios;
|
||||
up(&tty->termios_sem);
|
||||
}
|
||||
|
||||
|
||||
/* Defer ldisc switch */
|
||||
/* tty_deferred_ldisc_switch(N_TTY)
|
||||
This should get done automatically when the port closes and
|
||||
tty_release is called */
|
||||
|
||||
read_lock(&tasklist_lock);
|
||||
for_each_task(p) {
|
||||
if ((tty->session > 0) && (p->session == tty->session) &&
|
||||
@@ -545,6 +853,17 @@ void do_tty_hangup(void *data)
|
||||
tty->driver.close(tty, cons_filp);
|
||||
} else if (tty->driver.hangup)
|
||||
(tty->driver.hangup)(tty);
|
||||
|
||||
/* We don't want to have driver/ldisc interactions beyond
|
||||
the ones we did here. The driver layer expects no
|
||||
calls after ->hangup() from the ldisc side. However we
|
||||
can't yet guarantee all that */
|
||||
|
||||
set_bit(TTY_HUPPED, &tty->flags);
|
||||
if(ld) {
|
||||
tty_ldisc_enable(tty);
|
||||
tty_ldisc_deref(ld);
|
||||
}
|
||||
unlock_kernel();
|
||||
if (f)
|
||||
fput(f);
|
||||
@@ -648,10 +967,8 @@ void start_tty(struct tty_struct *tty)
|
||||
}
|
||||
if (tty->driver.start)
|
||||
(tty->driver.start)(tty);
|
||||
if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
|
||||
tty->ldisc.write_wakeup)
|
||||
(tty->ldisc.write_wakeup)(tty);
|
||||
wake_up_interruptible(&tty->write_wait);
|
||||
/* If we have a running line discipline it may need kicking */
|
||||
tty_wakeup(tty);
|
||||
}
|
||||
|
||||
static ssize_t tty_read(struct file * file, char * buf, size_t count,
|
||||
@@ -660,6 +977,7 @@ static ssize_t tty_read(struct file * file, char * buf, size_t count,
|
||||
int i;
|
||||
struct tty_struct * tty;
|
||||
struct inode *inode;
|
||||
struct tty_ldisc *ld;
|
||||
|
||||
/* Can't seek (pread) on ttys. */
|
||||
if (ppos != &file->f_pos)
|
||||
@@ -688,11 +1006,15 @@ static ssize_t tty_read(struct file * file, char * buf, size_t count,
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
#endif
|
||||
/* We want to wait for the line discipline to sort out in this
|
||||
situation */
|
||||
ld = tty_ldisc_ref_wait(tty);
|
||||
lock_kernel();
|
||||
if (tty->ldisc.read)
|
||||
i = (tty->ldisc.read)(tty,file,buf,count);
|
||||
if (ld->read)
|
||||
i = (ld->read)(tty,file,buf,count);
|
||||
else
|
||||
i = -EIO;
|
||||
tty_ldisc_deref(ld);
|
||||
unlock_kernel();
|
||||
if (i > 0)
|
||||
inode->i_atime = CURRENT_TIME;
|
||||
@@ -761,6 +1083,8 @@ static ssize_t tty_write(struct file * file, const char * buf, size_t count,
|
||||
int is_console;
|
||||
struct tty_struct * tty;
|
||||
struct inode *inode = file->f_dentry->d_inode;
|
||||
ssize_t ret;
|
||||
struct tty_ldisc *ld;
|
||||
|
||||
/* Can't seek (pwrite) on ttys. */
|
||||
if (ppos != &file->f_pos)
|
||||
@@ -807,13 +1131,19 @@ static ssize_t tty_write(struct file * file, const char * buf, size_t count,
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (!tty->ldisc.write)
|
||||
return -EIO;
|
||||
return do_tty_write(tty->ldisc.write, tty, file,
|
||||
(const unsigned char *)buf, count);
|
||||
|
||||
ld = tty_ldisc_ref_wait(tty);
|
||||
if (!ld->write)
|
||||
ret = -EIO;
|
||||
else
|
||||
ret = do_tty_write(ld->write, tty, file,
|
||||
(const unsigned char __user *)buf, count);
|
||||
tty_ldisc_deref(ld);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Semaphore to protect creating and releasing a tty */
|
||||
/* Semaphore to protect creating and releasing a tty. This is shared with
|
||||
vt.c for deeply disgusting hack reasons */
|
||||
static DECLARE_MUTEX(tty_sem);
|
||||
|
||||
static void down_tty_sem(int index)
|
||||
@@ -975,7 +1305,10 @@ static int init_dev(kdev_t device, struct tty_struct **ret_tty)
|
||||
(tty->ldisc.close)(tty);
|
||||
goto release_mem_out;
|
||||
}
|
||||
set_bit(TTY_LDISC, &o_tty->flags);
|
||||
tty_ldisc_enable(o_tty);
|
||||
}
|
||||
tty_ldisc_enable(tty);
|
||||
goto success;
|
||||
|
||||
/*
|
||||
@@ -1003,7 +1336,9 @@ fast_track:
|
||||
}
|
||||
tty->count++;
|
||||
tty->driver = *driver; /* N.B. why do this every time?? */
|
||||
|
||||
/* FIXME */
|
||||
if(!test_bit(TTY_LDISC, &tty->flags))
|
||||
printk(KERN_ERR "init_dev but no ldisc\n");
|
||||
success:
|
||||
*ret_tty = tty;
|
||||
|
||||
@@ -1084,6 +1419,7 @@ static void release_dev(struct file * filp)
|
||||
int pty_master, tty_closing, o_tty_closing, do_sleep;
|
||||
int idx;
|
||||
char buf[64];
|
||||
unsigned long flags;
|
||||
|
||||
tty = (struct tty_struct *)filp->private_data;
|
||||
if (tty_paranoia_check(tty, filp->f_dentry->d_inode->i_rdev, "release_dev"))
|
||||
@@ -1275,25 +1611,60 @@ static void release_dev(struct file * filp)
|
||||
printk(KERN_DEBUG "freeing tty structure...");
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Prevent flush_to_ldisc() from rescheduling the work for later. Then
|
||||
* kill any delayed work. As this is the final close it does not
|
||||
* race with the set_ldisc code path.
|
||||
*/
|
||||
clear_bit(TTY_LDISC, &tty->flags);
|
||||
clear_bit(TTY_DONT_FLIP, &tty->flags);
|
||||
|
||||
/*
|
||||
* Wait for ->hangup_work and ->flip.work handlers to terminate
|
||||
*/
|
||||
|
||||
run_task_queue(&tq_timer);
|
||||
flush_scheduled_tasks();
|
||||
|
||||
/*
|
||||
* Wait for any short term users (we know they are just driver
|
||||
* side waiters as the file is closing so user count on the file
|
||||
* side is zero.
|
||||
*/
|
||||
|
||||
spin_lock_irqsave(&tty_ldisc_lock, flags);
|
||||
while(tty->ldisc.refcount)
|
||||
{
|
||||
spin_unlock_irqrestore(&tty_ldisc_lock, flags);
|
||||
wait_event(tty_ldisc_wait, tty->ldisc.refcount == 0);
|
||||
spin_lock_irqsave(&tty_ldisc_lock, flags);
|
||||
}
|
||||
spin_unlock_irqrestore(&tty_ldisc_lock, flags);
|
||||
|
||||
/*
|
||||
* Shutdown the current line discipline, and reset it to N_TTY.
|
||||
* N.B. why reset ldisc when we're releasing the memory??
|
||||
* FIXME: this MUST get fixed for the new reflocking
|
||||
*/
|
||||
if (tty->ldisc.close)
|
||||
(tty->ldisc.close)(tty);
|
||||
tty->ldisc = ldiscs[N_TTY];
|
||||
tty->termios->c_line = N_TTY;
|
||||
tty_ldisc_put(tty->ldisc.num);
|
||||
|
||||
/*
|
||||
* Switch the line discipline back
|
||||
*/
|
||||
tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
|
||||
tty_set_termios_ldisc(tty,N_TTY);
|
||||
|
||||
if (o_tty) {
|
||||
/* FIXME: could o_tty be in setldisc here ? */
|
||||
clear_bit(TTY_LDISC, &o_tty->flags);
|
||||
if (o_tty->ldisc.close)
|
||||
(o_tty->ldisc.close)(o_tty);
|
||||
o_tty->ldisc = ldiscs[N_TTY];
|
||||
tty_ldisc_put(o_tty->ldisc.num);
|
||||
tty_ldisc_assign(o_tty, tty_ldisc_get(N_TTY));
|
||||
tty_set_termios_ldisc(o_tty,N_TTY);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure that the tty's task queue isn't activated.
|
||||
*/
|
||||
run_task_queue(&tq_timer);
|
||||
flush_scheduled_tasks();
|
||||
|
||||
/*
|
||||
* The release_mem function takes care of the details of clearing
|
||||
@@ -1468,14 +1839,18 @@ static int tty_release(struct inode * inode, struct file * filp)
|
||||
static unsigned int tty_poll(struct file * filp, poll_table * wait)
|
||||
{
|
||||
struct tty_struct * tty;
|
||||
struct tty_ldisc *ld;
|
||||
int ret = 0;
|
||||
|
||||
tty = (struct tty_struct *)filp->private_data;
|
||||
if (tty_paranoia_check(tty, filp->f_dentry->d_inode->i_rdev, "tty_poll"))
|
||||
return 0;
|
||||
|
||||
if (tty->ldisc.poll)
|
||||
return (tty->ldisc.poll)(tty, filp, wait);
|
||||
return 0;
|
||||
ld = tty_ldisc_ref_wait(tty);
|
||||
if (ld->poll)
|
||||
ret = (ld->poll)(tty, filp, wait);
|
||||
tty_ldisc_deref(ld);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int tty_fasync(int fd, struct file * filp, int on)
|
||||
@@ -1509,12 +1884,15 @@ static int tty_fasync(int fd, struct file * filp, int on)
|
||||
static int tiocsti(struct tty_struct *tty, char * arg)
|
||||
{
|
||||
char ch, mbz = 0;
|
||||
struct tty_ldisc *ld;
|
||||
|
||||
if ((current->tty != tty) && !suser())
|
||||
return -EPERM;
|
||||
if (get_user(ch, arg))
|
||||
return -EFAULT;
|
||||
tty->ldisc.receive_buf(tty, &ch, &mbz, 1);
|
||||
ld = tty_ldisc_ref_wait(tty);
|
||||
ld->receive_buf(tty, &ch, &mbz, 1);
|
||||
tty_ldisc_deref(ld);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1722,6 +2100,7 @@ int tty_ioctl(struct inode * inode, struct file * file,
|
||||
{
|
||||
struct tty_struct *tty, *real_tty;
|
||||
int retval;
|
||||
struct tty_ldisc *ld;
|
||||
|
||||
tty = (struct tty_struct *)file->private_data;
|
||||
if (tty_paranoia_check(tty, inode->i_rdev, "tty_ioctl"))
|
||||
@@ -1812,6 +2191,7 @@ int tty_ioctl(struct inode * inode, struct file * file,
|
||||
case TIOCGSID:
|
||||
return tiocgsid(tty, real_tty, (pid_t *) arg);
|
||||
case TIOCGETD:
|
||||
/* FIXME: check this is ok */
|
||||
return put_user(tty->ldisc.num, (int *) arg);
|
||||
case TIOCSETD:
|
||||
return tiocsetd(tty, (int *) arg);
|
||||
@@ -1845,16 +2225,19 @@ int tty_ioctl(struct inode * inode, struct file * file,
|
||||
return send_break(tty, arg ? arg*(HZ/10) : HZ/4);
|
||||
}
|
||||
if (tty->driver.ioctl) {
|
||||
int retval = (tty->driver.ioctl)(tty, file, cmd, arg);
|
||||
retval = (tty->driver.ioctl)(tty, file, cmd, arg);
|
||||
if (retval != -ENOIOCTLCMD)
|
||||
return retval;
|
||||
}
|
||||
if (tty->ldisc.ioctl) {
|
||||
int retval = (tty->ldisc.ioctl)(tty, file, cmd, arg);
|
||||
if (retval != -ENOIOCTLCMD)
|
||||
return retval;
|
||||
ld = tty_ldisc_ref_wait(tty);
|
||||
retval = -EINVAL;
|
||||
if (ld->ioctl) {
|
||||
retval = ld->ioctl(tty, file, cmd, arg);
|
||||
if (retval == -ENOIOCTLCMD)
|
||||
retval = -EINVAL;
|
||||
}
|
||||
return -EINVAL;
|
||||
tty_ldisc_deref(ld);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
@@ -1887,14 +2270,20 @@ static void __do_SAK(void *arg)
|
||||
int session;
|
||||
int i;
|
||||
struct file *filp;
|
||||
struct tty_ldisc *disc;
|
||||
|
||||
if (!tty)
|
||||
return;
|
||||
session = tty->session;
|
||||
if (tty->ldisc.flush_buffer)
|
||||
tty->ldisc.flush_buffer(tty);
|
||||
/* We don't want an ldisc switch during this */
|
||||
disc = tty_ldisc_ref(tty);
|
||||
if (disc && disc->flush_buffer)
|
||||
disc->flush_buffer(tty);
|
||||
tty_ldisc_deref(disc);
|
||||
|
||||
if (tty->driver.flush_buffer)
|
||||
tty->driver.flush_buffer(tty);
|
||||
|
||||
read_lock(&tasklist_lock);
|
||||
for_each_task(p) {
|
||||
if ((p->tty == tty) ||
|
||||
@@ -1946,11 +2335,16 @@ static void flush_to_ldisc(void *private_)
|
||||
unsigned char *cp;
|
||||
char *fp;
|
||||
int count;
|
||||
unsigned long flags;
|
||||
unsigned long flags;
|
||||
struct tty_ldisc *disc;
|
||||
|
||||
disc = tty_ldisc_ref(tty);
|
||||
if (disc == NULL) /* !TTY_LDISC */
|
||||
return;
|
||||
|
||||
if (test_bit(TTY_DONT_FLIP, &tty->flags)) {
|
||||
queue_task(&tty->flip.tqueue, &tq_timer);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
if (tty->flip.buf_num) {
|
||||
cp = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
|
||||
@@ -1973,7 +2367,31 @@ static void flush_to_ldisc(void *private_)
|
||||
tty->flip.count = 0;
|
||||
restore_flags(flags);
|
||||
|
||||
tty->ldisc.receive_buf(tty, cp, fp, count);
|
||||
disc->receive_buf(tty, cp, fp, count);
|
||||
out:
|
||||
tty_ldisc_deref(disc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Call the ldisc flush directly from a driver. This function may
|
||||
* return an error and need retrying by the user.
|
||||
*/
|
||||
|
||||
int tty_push_data(struct tty_struct *tty, unsigned char *cp, unsigned char *fp, int count)
|
||||
{
|
||||
int ret = 0;
|
||||
struct tty_ldisc *disc;
|
||||
|
||||
disc = tty_ldisc_ref(tty);
|
||||
if(test_bit(TTY_DONT_FLIP, &tty->flags))
|
||||
ret = -EAGAIN;
|
||||
else if(disc == NULL)
|
||||
ret = -EIO;
|
||||
else
|
||||
disc->receive_buf(tty, cp, fp, count);
|
||||
tty_ldisc_deref(disc);
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2036,13 +2454,14 @@ static void initialize_tty_struct(struct tty_struct *tty)
|
||||
{
|
||||
memset(tty, 0, sizeof(struct tty_struct));
|
||||
tty->magic = TTY_MAGIC;
|
||||
tty->ldisc = ldiscs[N_TTY];
|
||||
tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
|
||||
tty->pgrp = -1;
|
||||
tty->flip.char_buf_ptr = tty->flip.char_buf;
|
||||
tty->flip.flag_buf_ptr = tty->flip.flag_buf;
|
||||
tty->flip.tqueue.routine = flush_to_ldisc;
|
||||
tty->flip.tqueue.data = tty;
|
||||
init_MUTEX(&tty->flip.pty_sem);
|
||||
init_MUTEX(&tty->termios_sem);
|
||||
init_waitqueue_head(&tty->write_wait);
|
||||
init_waitqueue_head(&tty->read_wait);
|
||||
tty->tq_hangup.routine = do_tty_hangup;
|
||||
@@ -2221,7 +2640,7 @@ int tty_unregister_driver(struct tty_driver *driver)
|
||||
void __init console_init(void)
|
||||
{
|
||||
/* Setup the default TTY line discipline. */
|
||||
memset(ldiscs, 0, sizeof(ldiscs));
|
||||
memset(tty_ldiscs, 0, NR_LDISCS*sizeof(struct tty_ldisc));
|
||||
(void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
|
||||
|
||||
/*
|
||||
File renamed without changes.
@@ -328,7 +328,7 @@ int setup_arg_pages(struct linux_binprm *bprm)
|
||||
{
|
||||
unsigned long stack_base;
|
||||
struct vm_area_struct *mpnt;
|
||||
int i;
|
||||
int i, ret;
|
||||
|
||||
stack_base = STACK_TOP - MAX_ARG_PAGES*PAGE_SIZE;
|
||||
|
||||
@@ -352,7 +352,11 @@ int setup_arg_pages(struct linux_binprm *bprm)
|
||||
mpnt->vm_pgoff = 0;
|
||||
mpnt->vm_file = NULL;
|
||||
mpnt->vm_private_data = (void *) 0;
|
||||
insert_vm_struct(current->mm, mpnt);
|
||||
if ((ret = insert_vm_struct(current->mm, mpnt))) {
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
kmem_cache_free(vm_area_cachep, mpnt);
|
||||
return ret;
|
||||
}
|
||||
current->mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
@@ -564,12 +568,29 @@ static inline void de_thread(struct task_struct *tsk)
|
||||
tsk->tgid = tsk->pid;
|
||||
}
|
||||
|
||||
void get_task_comm(char *buf, struct task_struct *tsk)
|
||||
{
|
||||
/* buf must be at least sizeof(tsk->comm) in size */
|
||||
task_lock(tsk);
|
||||
memcpy(buf, tsk->comm, sizeof(tsk->comm));
|
||||
task_unlock(tsk);
|
||||
}
|
||||
|
||||
void set_task_comm(struct task_struct *tsk, char *buf)
|
||||
{
|
||||
task_lock(tsk);
|
||||
strncpy(tsk->comm, buf, sizeof(tsk->comm));
|
||||
tsk->comm[sizeof(tsk->comm)-1]='\0';
|
||||
task_unlock(tsk);
|
||||
}
|
||||
|
||||
int flush_old_exec(struct linux_binprm * bprm)
|
||||
{
|
||||
char * name;
|
||||
int i, ch, retval;
|
||||
struct signal_struct * oldsig;
|
||||
struct files_struct * files;
|
||||
char tcomm[sizeof(current->comm)];
|
||||
|
||||
/*
|
||||
* Make sure we have a private signal table
|
||||
@@ -611,10 +632,11 @@ int flush_old_exec(struct linux_binprm * bprm)
|
||||
if (ch == '/')
|
||||
i = 0;
|
||||
else
|
||||
if (i < 15)
|
||||
current->comm[i++] = ch;
|
||||
if (i < (sizeof(tcomm) - 1))
|
||||
tcomm[i++] = ch;
|
||||
}
|
||||
current->comm[i] = '\0';
|
||||
tcomm[i] = '\0';
|
||||
set_task_comm(current, tcomm);
|
||||
|
||||
flush_thread();
|
||||
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+24
-4
@@ -199,6 +199,11 @@ typedef struct page {
|
||||
#define page_count(p) atomic_read(&(p)->count)
|
||||
#define set_page_count(p,v) atomic_set(&(p)->count, v)
|
||||
|
||||
static inline struct page *nth_page(struct page *page, int n)
|
||||
{
|
||||
return page + n;
|
||||
}
|
||||
|
||||
/*
|
||||
* Various page->flags bits:
|
||||
*
|
||||
@@ -562,7 +567,7 @@ extern void __free_pte(pte_t);
|
||||
/* mmap.c */
|
||||
extern void lock_vma_mappings(struct vm_area_struct *);
|
||||
extern void unlock_vma_mappings(struct vm_area_struct *);
|
||||
extern void insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
|
||||
extern int insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
|
||||
extern void __insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
|
||||
extern void build_mmap_rb(struct mm_struct *);
|
||||
extern void exit_mmap(struct mm_struct *);
|
||||
@@ -661,18 +666,33 @@ static inline int expand_stack(struct vm_area_struct * vma, unsigned long addres
|
||||
unsigned long grow;
|
||||
|
||||
/*
|
||||
* vma->vm_start/vm_end cannot change under us because the caller is required
|
||||
* to hold the mmap_sem in write mode. We need to get the spinlock only
|
||||
* before relocating the vma range ourself.
|
||||
* vma->vm_start/vm_end cannot change under us because the caller
|
||||
* is required to hold the mmap_sem in read mode. We need the
|
||||
* page_table_lock lock to serialize against concurrent expand_stacks.
|
||||
*/
|
||||
address &= PAGE_MASK;
|
||||
spin_lock(&vma->vm_mm->page_table_lock);
|
||||
|
||||
/* already expanded while we were spinning? */
|
||||
if (vma->vm_start <= address) {
|
||||
spin_unlock(&vma->vm_mm->page_table_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
grow = (vma->vm_start - address) >> PAGE_SHIFT;
|
||||
if (vma->vm_end - address > current->rlim[RLIMIT_STACK].rlim_cur ||
|
||||
((vma->vm_mm->total_vm + grow) << PAGE_SHIFT) > current->rlim[RLIMIT_AS].rlim_cur) {
|
||||
spin_unlock(&vma->vm_mm->page_table_lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if ((vma->vm_flags & VM_LOCKED) &&
|
||||
((vma->vm_mm->locked_vm + grow) << PAGE_SHIFT) > current->rlim[RLIMIT_MEMLOCK].rlim_cur) {
|
||||
spin_unlock(&vma->vm_mm->page_table_lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
vma->vm_start = address;
|
||||
vma->vm_pgoff -= grow;
|
||||
vma->vm_mm->total_vm += grow;
|
||||
+3
@@ -806,6 +806,9 @@ extern void daemonize(void);
|
||||
extern int do_execve(char *, char **, char **, struct pt_regs *);
|
||||
extern int do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long);
|
||||
|
||||
extern void set_task_comm(struct task_struct *tsk, char *from);
|
||||
extern void get_task_comm(char *to, struct task_struct *tsk);
|
||||
|
||||
extern void FASTCALL(add_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
|
||||
extern void FASTCALL(add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t * wait));
|
||||
extern void FASTCALL(remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -997,7 +997,8 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct * vma,
|
||||
if (PageReserved(old_page))
|
||||
++mm->rss;
|
||||
break_cow(vma, new_page, address, page_table);
|
||||
lru_cache_add(new_page);
|
||||
if (vm_anon_lru)
|
||||
lru_cache_add(new_page);
|
||||
|
||||
/* Free the old page.. */
|
||||
new_page = old_page;
|
||||
@@ -1238,7 +1239,8 @@ static int do_anonymous_page(struct mm_struct * mm, struct vm_area_struct * vma,
|
||||
mm->rss++;
|
||||
flush_page_to_ram(page);
|
||||
entry = pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
|
||||
lru_cache_add(page);
|
||||
if (vm_anon_lru)
|
||||
lru_cache_add(page);
|
||||
mark_page_accessed(page);
|
||||
}
|
||||
|
||||
@@ -1303,7 +1305,8 @@ static int do_no_page(struct mm_struct * mm, struct vm_area_struct * vma,
|
||||
}
|
||||
copy_user_highpage(page, new_page, address);
|
||||
page_cache_release(new_page);
|
||||
lru_cache_add(page);
|
||||
if (vm_anon_lru)
|
||||
lru_cache_add(page);
|
||||
new_page = page;
|
||||
}
|
||||
|
||||
File renamed without changes.
@@ -198,6 +198,7 @@ static inline unsigned long move_vma(struct vm_area_struct * vma,
|
||||
insert_vm_struct(current->mm, new_vma);
|
||||
}
|
||||
|
||||
/* XXX: possible errors masked, mapping might remain */
|
||||
do_munmap(current->mm, addr, old_len);
|
||||
|
||||
current->mm->total_vm += new_len >> PAGE_SHIFT;
|
||||
@@ -238,6 +239,12 @@ unsigned long do_mremap(unsigned long addr,
|
||||
old_len = PAGE_ALIGN(old_len);
|
||||
new_len = PAGE_ALIGN(new_len);
|
||||
|
||||
if (old_len > TASK_SIZE || addr > TASK_SIZE - old_len)
|
||||
goto out;
|
||||
|
||||
if (addr >= TASK_SIZE)
|
||||
goto out;
|
||||
|
||||
/* new_addr is only valid if MREMAP_FIXED is specified */
|
||||
if (flags & MREMAP_FIXED) {
|
||||
if (new_addr & ~PAGE_MASK)
|
||||
@@ -247,6 +254,10 @@ unsigned long do_mremap(unsigned long addr,
|
||||
|
||||
if (new_len > TASK_SIZE || new_addr > TASK_SIZE - new_len)
|
||||
goto out;
|
||||
|
||||
if (new_addr >= TASK_SIZE)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Allow new_len == 0 only if new_addr == addr
|
||||
* to preserve truncation in place (that was working
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.